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 UiObject* obj = ui_simple_window(title, window_data); |
60 UiObject* obj = (UiObject*)cxCalloc(mp->allocator, 1, sizeof(UiObject)); |
|
61 |
|
62 obj->ctx = uic_context(obj, mp); |
|
63 obj->window = window_data; |
|
64 |
|
65 Window window = Window(); |
|
66 //Window window = make<winui::implementation::MainWindow>(); |
|
67 |
|
68 winrt::Windows::Foundation::Uri resourceLocator{ L"ms-appx:///MainWindow.xaml" }; |
|
69 Application::LoadComponent(window, resourceLocator, ComponentResourceLocation::Nested); |
|
70 |
|
71 window.ExtendsContentIntoTitleBar(true); |
|
72 |
|
73 Grid grid = Grid(); |
|
74 window.Content(grid); |
|
75 |
|
76 StackPanel titleBar = StackPanel(); |
|
77 Thickness titleBarPadding = { 10, 5, 5, 10 }; |
|
78 titleBar.Padding(titleBarPadding); |
|
79 titleBar.Orientation(Orientation::Horizontal); |
|
80 TextBlock titleLabel = TextBlock(); |
|
81 titleBar.Children().Append(titleLabel); |
|
82 |
|
83 if (title) { |
|
84 wchar_t* wtitle = str2wstr(title, nullptr); |
|
85 window.Title(wtitle); |
|
86 titleLabel.Text(hstring(wtitle)); |
|
87 free(wtitle); |
|
88 } |
|
89 |
|
90 window.SetTitleBar(titleBar); |
|
91 |
|
92 obj->wobj = new UiWindow(window); |
|
93 ui_context_add_window_destructor(obj->ctx, obj->wobj); |
|
94 |
|
95 window.Closed([obj](IInspectable const& sender, WindowEventArgs) { |
|
96 cxMempoolDestroy(obj->ctx->mp); |
|
97 }); |
|
98 |
|
99 obj->container = new UiBoxContainer(grid, UI_BOX_CONTAINER_VBOX, 0, 0); |
|
100 |
|
101 titleBar.VerticalAlignment(VerticalAlignment::Top); |
|
102 obj->container->Add(titleBar, false); |
|
103 |
62 |
104 if (uic_get_menu_list()) { |
63 if (uic_get_menu_list()) { |
105 // create/add menubar |
64 // create/add menubar |
106 MenuBar mb = ui_create_menubar(obj); |
65 MenuBar mb = ui_create_menubar(obj); |
107 mb.VerticalAlignment(VerticalAlignment::Top); |
66 mb.VerticalAlignment(VerticalAlignment::Top); |
169 |
128 |
170 toolbar_grid.VerticalAlignment(VerticalAlignment::Top); |
129 toolbar_grid.VerticalAlignment(VerticalAlignment::Top); |
171 obj->container->Add(toolbar_grid, false); |
130 obj->container->Add(toolbar_grid, false); |
172 } |
131 } |
173 |
132 |
|
133 return obj; |
|
134 } |
|
135 |
|
136 UIEXPORT UiObject* ui_simple_window(const char *title, void *window_data) { |
|
137 CxMempool* mp = cxBasicMempoolCreate(256); |
|
138 UiObject* obj = (UiObject*)cxCalloc(mp->allocator, 1, sizeof(UiObject)); |
|
139 |
|
140 obj->ctx = uic_context(obj, mp); |
|
141 obj->window = window_data; |
|
142 |
|
143 Window window = Window(); |
|
144 //Window window = make<winui::implementation::MainWindow>(); |
|
145 |
|
146 winrt::Windows::Foundation::Uri resourceLocator{ L"ms-appx:///MainWindow.xaml" }; |
|
147 Application::LoadComponent(window, resourceLocator, ComponentResourceLocation::Nested); |
|
148 |
|
149 window.ExtendsContentIntoTitleBar(true); |
|
150 |
|
151 Grid grid = Grid(); |
|
152 window.Content(grid); |
|
153 |
|
154 StackPanel titleBar = StackPanel(); |
|
155 Thickness titleBarPadding = { 10, 5, 5, 10 }; |
|
156 titleBar.Padding(titleBarPadding); |
|
157 titleBar.Orientation(Orientation::Horizontal); |
|
158 TextBlock titleLabel = TextBlock(); |
|
159 titleBar.Children().Append(titleLabel); |
|
160 |
|
161 if (title) { |
|
162 wchar_t* wtitle = str2wstr(title, nullptr); |
|
163 window.Title(wtitle); |
|
164 titleLabel.Text(hstring(wtitle)); |
|
165 free(wtitle); |
|
166 } |
|
167 |
|
168 window.SetTitleBar(titleBar); |
|
169 |
|
170 obj->wobj = new UiWindow(window); |
|
171 ui_context_add_window_destructor(obj->ctx, obj->wobj); |
|
172 |
|
173 window.Closed([obj](IInspectable const& sender, WindowEventArgs) { |
|
174 cxMempoolDestroy(obj->ctx->mp); |
|
175 }); |
|
176 |
|
177 obj->container = new UiBoxContainer(grid, UI_BOX_CONTAINER_VBOX, 0, 0); |
|
178 |
|
179 titleBar.VerticalAlignment(VerticalAlignment::Top); |
|
180 obj->container->Add(titleBar, false); |
|
181 |
174 obj->window = window_data; |
182 obj->window = window_data; |
175 |
183 |
176 return obj; |
184 return obj; |
177 } |
185 } |
178 |
186 |
183 wsize.Width = width; |
191 wsize.Width = width; |
184 wsize.Height = height; |
192 wsize.Height = height; |
185 win->window.AppWindow().Resize(wsize); |
193 win->window.AppWindow().Resize(wsize); |
186 } |
194 } |
187 } |
195 } |
|
196 |
|
197 static void filedialog_callback( |
|
198 UiObject *obj, |
|
199 ui_callback file_selected_callback, |
|
200 void *cbdata, |
|
201 winrt::Windows::Foundation::Collections::IVectorView<winrt::Windows::Storage::StorageFile> result) |
|
202 { |
|
203 UiFileList flist; |
|
204 flist.nfiles = result.Size(); |
|
205 flist.files = new char*[flist.nfiles]; |
|
206 |
|
207 int i = 0; |
|
208 for (auto const& file : result) { |
|
209 winrt::hstring path = file.Path(); |
|
210 flist.files[i++] = wchar2utf8(path.c_str(), path.size()); |
|
211 } |
|
212 |
|
213 UiEvent evt; |
|
214 evt.obj = obj; |
|
215 evt.document = obj->ctx->document; |
|
216 evt.window = obj->window; |
|
217 evt.eventdata = &flist; |
|
218 evt.intval = 0; |
|
219 file_selected_callback(&evt, cbdata); |
|
220 |
|
221 for (int i = 0; i < flist.nfiles;i++) { |
|
222 free(flist.files[i]); |
|
223 } |
|
224 delete[] flist.files; |
|
225 } |
|
226 |
|
227 static Windows::Foundation::IAsyncAction open_filedialog_async(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
|
228 FileOpenPicker openFileDialog = FileOpenPicker(); |
|
229 auto initializeWithWindow { openFileDialog.as<::IInitializeWithWindow>() |
|
230 }; |
|
231 |
|
232 HWND hwnd{ nullptr }; |
|
233 winrt::check_hresult(obj->wobj->window.as<IWindowNative>()->get_WindowHandle(&hwnd)); |
|
234 |
|
235 initializeWithWindow->Initialize(hwnd); |
|
236 |
|
237 openFileDialog.FileTypeFilter().Append(L"*"); |
|
238 |
|
239 if ((mode & UI_FILEDIALOG_SELECT_MULTI) == UI_FILEDIALOG_SELECT_MULTI) { |
|
240 auto files = co_await openFileDialog.PickMultipleFilesAsync(); |
|
241 filedialog_callback(obj, file_selected_callback, cbdata, files); |
|
242 } else { |
|
243 auto file = co_await openFileDialog.PickSingleFileAsync(); |
|
244 auto files = single_threaded_vector<winrt::Windows::Storage::StorageFile>(); |
|
245 files.Append(file); |
|
246 filedialog_callback(obj, file_selected_callback, cbdata, files.GetView()); |
|
247 } |
|
248 } |
|
249 |
|
250 static Windows::Foundation::IAsyncAction folderdialog_async(UiObject *obj, ui_callback file_selected_callback, void *cbdata) { |
|
251 FolderPicker folderPicker = FolderPicker(); |
|
252 auto initializeWithWindow { folderPicker.as<::IInitializeWithWindow>() |
|
253 }; |
|
254 |
|
255 HWND hwnd{ nullptr }; |
|
256 winrt::check_hresult(obj->wobj->window.as<IWindowNative>()->get_WindowHandle(&hwnd)); |
|
257 |
|
258 initializeWithWindow->Initialize(hwnd); |
|
259 |
|
260 folderPicker.FileTypeFilter().Append(L"*"); |
|
261 |
|
262 auto folder = co_await folderPicker.PickSingleFolderAsync(); |
|
263 if (folder) { |
|
264 winrt::hstring hpath = folder.Path(); |
|
265 char *cpath = wchar2utf8(hpath.c_str(), hpath.size()); |
|
266 |
|
267 UiFileList flist; |
|
268 flist.nfiles = 1; |
|
269 flist.files = &cpath; |
|
270 |
|
271 UiEvent evt; |
|
272 evt.obj = obj; |
|
273 evt.document = obj->ctx->document; |
|
274 evt.window = obj->window; |
|
275 evt.eventdata = &flist; |
|
276 evt.intval = 0; |
|
277 file_selected_callback(&evt, cbdata); |
|
278 } |
|
279 } |
|
280 |
|
281 UIEXPORT void ui_openfiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
|
282 if ((mode & UI_FILEDIALOG_SELECT_FOLDER) == UI_FILEDIALOG_SELECT_FOLDER) { |
|
283 folderdialog_async(obj, file_selected_callback, cbdata); |
|
284 } else { |
|
285 open_filedialog_async(obj, mode, file_selected_callback, cbdata); |
|
286 } |
|
287 } |
|
288 |
|
289 UIEXPORT void ui_savefiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
|
290 |
|
291 } |