50 using namespace Microsoft::UI::Xaml::Controls::Primitives; |
51 using namespace Microsoft::UI::Xaml::Controls::Primitives; |
51 using namespace Microsoft::UI::Xaml::XamlTypeInfo; |
52 using namespace Microsoft::UI::Xaml::XamlTypeInfo; |
52 using namespace Microsoft::UI::Xaml::Markup; |
53 using namespace Microsoft::UI::Xaml::Markup; |
53 using namespace Windows::UI::Xaml::Interop; |
54 using namespace Windows::UI::Xaml::Interop; |
54 using namespace winrt::Windows::Foundation; |
55 using namespace winrt::Windows::Foundation; |
|
56 using namespace winrt::Windows::Storage::Pickers; |
55 |
57 |
56 UiWindow::UiWindow(winrt::Microsoft::UI::Xaml::Window& win) : window(win) {} |
58 UiWindow::UiWindow(winrt::Microsoft::UI::Xaml::Window& win) : window(win) {} |
57 |
59 |
58 UiObject* ui_window(const char* title, void* window_data) { |
60 UiObject* ui_window(const char* title, void* window_data) { |
59 CxMempool* mp = cxBasicMempoolCreate(256); |
61 CxMempool* mp = cxBasicMempoolCreate(256); |
183 wsize.Width = width; |
185 wsize.Width = width; |
184 wsize.Height = height; |
186 wsize.Height = height; |
185 win->window.AppWindow().Resize(wsize); |
187 win->window.AppWindow().Resize(wsize); |
186 } |
188 } |
187 } |
189 } |
|
190 |
|
191 static void filedialog_callback( |
|
192 UiObject *obj, |
|
193 ui_callback file_selected_callback, |
|
194 void *cbdata, |
|
195 winrt::Windows::Foundation::Collections::IVectorView<winrt::Windows::Storage::StorageFile> result) |
|
196 { |
|
197 UiFileList flist; |
|
198 flist.nfiles = result.Size(); |
|
199 flist.files = new char*[flist.nfiles]; |
|
200 |
|
201 int i = 0; |
|
202 for (auto const& file : result) { |
|
203 winrt::hstring path = file.Path(); |
|
204 flist.files[i++] = wchar2utf8(path.c_str(), path.size()); |
|
205 } |
|
206 |
|
207 UiEvent evt; |
|
208 evt.obj = obj; |
|
209 evt.document = obj->ctx->document; |
|
210 evt.window = obj->window; |
|
211 evt.eventdata = &flist; |
|
212 evt.intval = 0; |
|
213 file_selected_callback(&evt, cbdata); |
|
214 |
|
215 for (int i = 0; i < flist.nfiles;i++) { |
|
216 free(flist.files[i]); |
|
217 } |
|
218 delete[] flist.files; |
|
219 } |
|
220 |
|
221 static Windows::Foundation::IAsyncAction open_filedialog_async(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
|
222 FileOpenPicker openFileDialog = FileOpenPicker(); |
|
223 auto initializeWithWindow { openFileDialog.as<::IInitializeWithWindow>() |
|
224 }; |
|
225 |
|
226 HWND hwnd{ nullptr }; |
|
227 winrt::check_hresult(obj->wobj->window.as<IWindowNative>()->get_WindowHandle(&hwnd)); |
|
228 |
|
229 initializeWithWindow->Initialize(hwnd); |
|
230 |
|
231 openFileDialog.FileTypeFilter().Append(L"*"); |
|
232 |
|
233 if ((mode & UI_FILEDIALOG_SELECT_MULTI) == UI_FILEDIALOG_SELECT_MULTI) { |
|
234 auto files = co_await openFileDialog.PickMultipleFilesAsync(); |
|
235 filedialog_callback(obj, file_selected_callback, cbdata, files); |
|
236 } else { |
|
237 auto file = co_await openFileDialog.PickSingleFileAsync(); |
|
238 auto files = single_threaded_vector<winrt::Windows::Storage::StorageFile>(); |
|
239 files.Append(file); |
|
240 filedialog_callback(obj, file_selected_callback, cbdata, files.GetView()); |
|
241 } |
|
242 } |
|
243 |
|
244 static Windows::Foundation::IAsyncAction folderdialog_async(UiObject *obj, ui_callback file_selected_callback, void *cbdata) { |
|
245 FolderPicker folderPicker = FolderPicker(); |
|
246 auto initializeWithWindow { folderPicker.as<::IInitializeWithWindow>() |
|
247 }; |
|
248 |
|
249 HWND hwnd{ nullptr }; |
|
250 winrt::check_hresult(obj->wobj->window.as<IWindowNative>()->get_WindowHandle(&hwnd)); |
|
251 |
|
252 initializeWithWindow->Initialize(hwnd); |
|
253 |
|
254 folderPicker.FileTypeFilter().Append(L"*"); |
|
255 |
|
256 auto folder = co_await folderPicker.PickSingleFolderAsync(); |
|
257 if (folder) { |
|
258 winrt::hstring hpath = folder.Path(); |
|
259 char *cpath = wchar2utf8(hpath.c_str(), hpath.size()); |
|
260 |
|
261 UiFileList flist; |
|
262 flist.nfiles = 1; |
|
263 flist.files = &cpath; |
|
264 |
|
265 UiEvent evt; |
|
266 evt.obj = obj; |
|
267 evt.document = obj->ctx->document; |
|
268 evt.window = obj->window; |
|
269 evt.eventdata = &flist; |
|
270 evt.intval = 0; |
|
271 file_selected_callback(&evt, cbdata); |
|
272 } |
|
273 } |
|
274 |
|
275 UIEXPORT void ui_openfiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
|
276 if ((mode & UI_FILEDIALOG_SELECT_FOLDER) == UI_FILEDIALOG_SELECT_FOLDER) { |
|
277 folderdialog_async(obj, file_selected_callback, cbdata); |
|
278 } else { |
|
279 open_filedialog_async(obj, mode, file_selected_callback, cbdata); |
|
280 } |
|
281 } |
|
282 |
|
283 UIEXPORT void ui_savefiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
|
284 |
|
285 } |