| 33 #include "../ui/window.h" |
33 #include "../ui/window.h" |
| 34 #include "../ui/properties.h" |
34 #include "../ui/properties.h" |
| 35 #include "../common/context.h" |
35 #include "../common/context.h" |
| 36 #include "../common/menu.h" |
36 #include "../common/menu.h" |
| 37 #include "../common/toolbar.h" |
37 #include "../common/toolbar.h" |
| |
38 #include "../common/utils.h" |
| 38 |
39 |
| 39 #include <cx/mempool.h> |
40 #include <cx/mempool.h> |
| 40 |
41 |
| 41 #include "menu.h" |
42 #include "menu.h" |
| 42 #include "toolbar.h" |
43 #include "toolbar.h" |
| 139 char buf[32]; |
140 char buf[32]; |
| 140 snprintf(buf, 32, "%d", pos); |
141 snprintf(buf, 32, "%d", pos); |
| 141 ui_set_property("ui.window.splitview.pos", buf); |
142 ui_set_property("ui.window.splitview.pos", buf); |
| 142 } |
143 } |
| 143 |
144 |
| 144 static UiObject* create_window(const char *title, void *window_data, UiBool sidebar, UiBool splitview, UiBool simple) { |
145 static UiObject* create_window(const char *title, UiBool sidebar, UiBool splitview, UiBool simple) { |
| 145 UiObject *obj = uic_object_new_toplevel(); |
146 UiObject *obj = uic_object_new_toplevel(); |
| 146 |
147 |
| 147 #ifdef UI_LIBADWAITA |
148 #ifdef UI_LIBADWAITA |
| 148 obj->widget = adw_application_window_new(ui_get_application()); |
149 obj->widget = adw_application_window_new(ui_get_application()); |
| 149 #elif !defined(UI_GTK2) |
150 #elif !defined(UI_GTK2) |
| 150 obj->widget = gtk_application_window_new(ui_get_application()); |
151 obj->widget = gtk_application_window_new(ui_get_application()); |
| 151 #else |
152 #else |
| 152 obj->widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
153 obj->widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| 153 #endif |
154 #endif |
| 154 |
155 |
| 155 obj->window = window_data; |
|
| 156 |
|
| 157 #if GTK_CHECK_VERSION(4, 0, 0) |
156 #if GTK_CHECK_VERSION(4, 0, 0) |
| 158 obj->ctx->action_map = G_ACTION_MAP(obj->widget); |
157 obj->ctx->action_map = G_ACTION_MAP(obj->widget); |
| 159 #endif |
158 #endif |
| 160 |
159 |
| 161 if(title != NULL) { |
160 if(title != NULL) { |
| 167 } |
166 } |
| 168 |
167 |
| 169 int window_width = window_default_width; |
168 int window_width = window_default_width; |
| 170 int window_height = window_default_height; |
169 int window_height = window_default_height; |
| 171 if(!simple) { |
170 if(!simple) { |
| 172 const char *width = ui_get_property("ui.window.width"); |
171 ui_get_window_default_width(&window_width, &window_height); |
| 173 const char *height = ui_get_property("ui.window.height"); |
|
| 174 if(width && height) { |
|
| 175 int w = atoi(width); |
|
| 176 int h = atoi(height); |
|
| 177 if(w > 0 && h > 0) { |
|
| 178 window_width = w; |
|
| 179 window_height = h; |
|
| 180 } |
|
| 181 } |
|
| 182 } |
172 } |
| 183 gtk_window_set_default_size( |
173 gtk_window_set_default_size( |
| 184 GTK_WINDOW(obj->widget), |
174 GTK_WINDOW(obj->widget), |
| 185 window_width, |
175 window_width, |
| 186 window_height); |
176 window_height); |
| 203 "delete-event", |
193 "delete-event", |
| 204 G_CALLBACK(close_request), |
194 G_CALLBACK(close_request), |
| 205 obj); |
195 obj); |
| 206 #endif |
196 #endif |
| 207 |
197 |
| |
198 int splitview_pos = 0; |
| |
199 if(splitview) { |
| |
200 const char *splitview_pos_str = ui_get_property("ui.window.splitview.pos"); |
| |
201 splitview_pos= splitview_window_default_pos; |
| |
202 if(splitview_pos < 0) { |
| |
203 splitview_pos = window_width / 2; |
| |
204 } |
| |
205 if(splitview_pos_str && splitview_window_use_prop) { |
| |
206 int sv_pos = atoi(splitview_pos_str); |
| |
207 if(sv_pos > 0) { |
| |
208 splitview_pos = sv_pos; |
| |
209 } |
| |
210 } |
| |
211 } |
| |
212 |
| 208 GtkWidget *vbox = ui_gtk_vbox_new(0); |
213 GtkWidget *vbox = ui_gtk_vbox_new(0); |
| 209 #ifdef UI_LIBADWAITA |
214 #ifdef UI_LIBADWAITA |
| 210 GtkWidget *toolbar_view = adw_toolbar_view_new(); |
215 GtkWidget *toolbar_view = adw_toolbar_view_new(); |
| 211 adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(toolbar_view), vbox); |
216 adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(toolbar_view), vbox); |
| 212 |
217 |
| 221 content, |
226 content, |
| 222 "destroy", |
227 "destroy", |
| 223 G_CALLBACK(save_window_splitview_pos), |
228 G_CALLBACK(save_window_splitview_pos), |
| 224 NULL); |
229 NULL); |
| 225 |
230 |
| 226 const char *splitview_pos_str = ui_get_property("ui.window.splitview.pos"); |
231 gtk_paned_set_position(GTK_PANED(content), splitview_pos); |
| 227 int pos = splitview_window_default_pos; |
|
| 228 if(pos < 0) { |
|
| 229 pos = window_width / 2; |
|
| 230 } |
|
| 231 if(splitview_pos_str && splitview_window_use_prop) { |
|
| 232 int splitview_pos = atoi(splitview_pos_str); |
|
| 233 if(splitview_pos > 0) { |
|
| 234 pos = splitview_pos; |
|
| 235 } |
|
| 236 } |
|
| 237 gtk_paned_set_position(GTK_PANED(content), pos); |
|
| 238 |
232 |
| 239 GtkWidget *right_panel = adw_toolbar_view_new(); |
233 GtkWidget *right_panel = adw_toolbar_view_new(); |
| 240 GtkWidget *right_vbox = ui_gtk_vbox_new(0); |
234 GtkWidget *right_vbox = ui_gtk_vbox_new(0); |
| 241 adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(right_panel), right_vbox); |
235 adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(right_panel), right_vbox); |
| 242 |
236 |
| 343 //gtk_window_set_titlebar(GTK_WINDOW(obj->widget), hb); |
337 //gtk_window_set_titlebar(GTK_WINDOW(obj->widget), hb); |
| 344 } |
338 } |
| 345 |
339 |
| 346 GtkWidget *content_box = ui_gtk_vbox_new(0); |
340 GtkWidget *content_box = ui_gtk_vbox_new(0); |
| 347 WINDOW_SET_CONTENT(obj->widget, vbox); |
341 WINDOW_SET_CONTENT(obj->widget, vbox); |
| 348 if(sidebar) { |
342 if(sidebar || splitview) { |
| 349 GtkWidget *paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); |
343 GtkWidget *paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); |
| 350 GtkWidget *sidebar_vbox = ui_gtk_vbox_new(0); |
344 if(sidebar) { |
| 351 gtk_paned_add1(GTK_PANED(paned), sidebar_vbox); |
345 GtkWidget *sidebar_vbox = ui_gtk_vbox_new(0); |
| 352 gtk_paned_add2(GTK_PANED(paned), content_box); |
346 gtk_paned_add1(GTK_PANED(paned), sidebar_vbox); |
| |
347 g_object_set_data(G_OBJECT(obj->widget), "ui_sidebar", sidebar_vbox); |
| |
348 gtk_paned_set_position(GTK_PANED(paned), 200); |
| |
349 } |
| |
350 |
| |
351 if(splitview) { |
| |
352 GtkWidget *content_paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); |
| |
353 gtk_paned_set_position(GTK_PANED(content_paned), splitview_pos); |
| |
354 gtk_paned_add2(GTK_PANED(paned), content_paned); |
| |
355 |
| |
356 GtkWidget *right_content_box = ui_gtk_vbox_new(0); |
| |
357 gtk_paned_add1(GTK_PANED(content_paned), content_box); |
| |
358 gtk_paned_add2(GTK_PANED(content_paned), right_content_box); |
| |
359 |
| |
360 g_object_set_data(G_OBJECT(obj->widget), "ui_window_splitview", content_paned); |
| |
361 g_object_set_data(G_OBJECT(obj->widget), "ui_left_panel", content_box); |
| |
362 g_object_set_data(G_OBJECT(obj->widget), "ui_right_panel", right_content_box); |
| |
363 } else { |
| |
364 gtk_paned_add2(GTK_PANED(paned), content_box); |
| |
365 } |
| |
366 |
| 353 BOX_ADD_EXPAND(GTK_BOX(vbox), paned); |
367 BOX_ADD_EXPAND(GTK_BOX(vbox), paned); |
| 354 g_object_set_data(G_OBJECT(obj->widget), "ui_sidebar", sidebar_vbox); |
|
| 355 gtk_paned_set_position (GTK_PANED(paned), 200); |
|
| 356 } else { |
368 } else { |
| 357 BOX_ADD_EXPAND(GTK_BOX(vbox), content_box); |
369 BOX_ADD_EXPAND(GTK_BOX(vbox), content_box); |
| 358 } |
370 } |
| 359 |
371 |
| 360 #endif |
372 #endif |
| 378 nwindows++; |
390 nwindows++; |
| 379 return obj; |
391 return obj; |
| 380 } |
392 } |
| 381 |
393 |
| 382 |
394 |
| 383 UiObject* ui_window(const char *title, void *window_data) { |
395 UiObject* ui_window(const char *title) { |
| 384 return create_window(title, window_data, FALSE, FALSE, FALSE); |
396 return create_window(title, FALSE, FALSE, FALSE); |
| 385 } |
397 } |
| 386 |
398 |
| 387 UiObject *ui_sidebar_window(const char *title, void *window_data) { |
399 UiObject *ui_sidebar_window(const char *title) { |
| 388 return create_window(title, window_data, TRUE, FALSE, FALSE); |
400 return create_window(title, TRUE, FALSE, FALSE); |
| 389 } |
401 } |
| 390 |
402 |
| 391 UIEXPORT UiObject *ui_splitview_window(const char *title, UiBool sidebar) { |
403 UiObject *ui_splitview_window(const char *title, UiBool sidebar) { |
| 392 return create_window(title, NULL, sidebar, TRUE, FALSE); |
404 return create_window(title, sidebar, TRUE, FALSE); |
| 393 } |
405 } |
| 394 |
406 |
| 395 UiObject* ui_simple_window(const char *title, void *window_data) { |
407 UiObject* ui_simple_window(const char *title) { |
| 396 return create_window(title, window_data, FALSE, FALSE, TRUE); |
408 return create_window(title, FALSE, FALSE, TRUE); |
| 397 } |
409 } |
| 398 |
410 |
| 399 void ui_window_size(UiObject *obj, int width, int height) { |
411 void ui_window_size(UiObject *obj, int width, int height) { |
| 400 gtk_window_set_default_size( |
412 gtk_window_set_default_size( |
| 401 GTK_WINDOW(obj->widget), |
413 GTK_WINDOW(obj->widget), |