ui/winui/dnd.cpp

Mon, 29 Sep 2025 21:14:46 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 29 Sep 2025 21:14:46 +0200
changeset 779
b84cbe57e0bd
parent 243
9f66c31a27ed
permissions
-rw-r--r--

change UiCellValue from struct to union and pass it as pointer to the onsave function, for better compatibility with other languages

224
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2023 Olaf Wintermann. All rights reserved.
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "pch.h"
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include "dnd.h"
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include "util.h"
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33
243
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
34 #include <thread>
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
35
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
36 using namespace winrt;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
37 using namespace Windows::ApplicationModel::DataTransfer;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
38 using namespace Windows::Storage;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
39 using namespace Windows::Storage::Streams;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
40
224
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 UIEXPORT void ui_selection_settext(UiDnD* dnd, char* str, int len) {
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 if (dnd->data) {
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 if (len < 0) {
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 len = strlen(str);
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 }
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 wchar_t *wstr = str2wstr_len(str, len, nullptr);
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 dnd->data.SetText(wstr);
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 free(wstr);
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 }
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 }
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 UIEXPORT void ui_selection_seturis(UiDnD* dnd, char** uris, int nelm) {
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 }
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 UIEXPORT char* ui_selection_gettext(UiDnD* dnd) {
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 return nullptr;
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 }
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63
243
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
64
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
65 UIEXPORT UiFileList ui_selection_geturis(UiDnD *dnd) {
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
66 UiFileList flist;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
67 flist.files = nullptr;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
68 flist.nfiles = 0;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
69
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
70 if (dnd->dataview.Contains(StandardDataFormats::StorageItems())) {
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
71 UiFileList *flist_ptr = &flist;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
72
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
73 // we need to execute this in a different thread
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
74 // this could block the main gui thread, but shouldn't happen with a simple uri list
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
75 std::thread getDataThread([dnd, flist_ptr]() {
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
76 auto items = dnd->dataview.GetStorageItemsAsync().get();
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
77
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
78 char **uris = (char**)calloc(items.Size(), sizeof(char*));
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
79 flist_ptr->files = uris;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
80 flist_ptr->nfiles = items.Size();
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
81
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
82 int i = 0;
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
83 for (IStorageItem const& item : items) {
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
84 winrt::hstring path = item.Path();
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
85 uris[i++] = wchar2utf8(path.c_str(), path.size());
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
86 }
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
87 });
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
88 getDataThread.join();
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
89 }
9f66c31a27ed implement table dnd drop
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 224
diff changeset
90 return flist;
224
88bc21b19213 add minimal working dnd implementation (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 }

mercurial