ui/gtk/window.c

changeset 115
e57ca2747782
parent 112
c3f2f16fa4b8
equal deleted inserted replaced
114:3da24640513a 115:e57ca2747782
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),

mercurial