ui/winui/window.cpp

branch
newapi
changeset 242
4ff7361dce95
parent 241
c51dd0e9ecb7
child 244
33c0a3797a0d
equal deleted inserted replaced
241:c51dd0e9ecb7 242:4ff7361dce95
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include "pch.h" 29 #include "pch.h"
30 30
31
31 #include "window.h" 32 #include "window.h"
32 33
33 #include "appmenu.h" 34 #include "appmenu.h"
34 #include "commandbar.h" 35 #include "commandbar.h"
35 #include "container.h" 36 #include "container.h"
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 }

mercurial