ui/winui/window.cpp

changeset 18
af411868ab9b
parent 13
5a8762fcfecc
child 21
3060a5a1d5fd
equal deleted inserted replaced
17:7cfd36aa005b 18:af411868ab9b
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 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 }

mercurial