50 } |
50 } |
51 return 1; |
51 return 1; |
52 } |
52 } |
53 |
53 |
54 GtkWidget* ui_gtk_vbox_new(int spacing) { |
54 GtkWidget* ui_gtk_vbox_new(int spacing) { |
55 #ifdef UI_GTK3 |
55 #if GTK_MAJOR_VERSION >= 3 |
56 return gtk_box_new(GTK_ORIENTATION_VERTICAL, spacing); |
56 return gtk_box_new(GTK_ORIENTATION_VERTICAL, spacing); |
57 #else |
57 #else |
58 return gtk_vbox_new(FALSE, spacing); |
58 return gtk_vbox_new(FALSE, spacing); |
59 #endif |
59 #endif |
60 } |
60 } |
61 |
61 |
62 GtkWidget* ui_gtk_hbox_new(int spacing) { |
62 GtkWidget* ui_gtk_hbox_new(int spacing) { |
63 #ifdef UI_GTK3 |
63 #if GTK_MAJOR_VERSION >= 3 |
64 return gtk_box_new(GTK_ORIENTATION_HORIZONTAL, spacing); |
64 return gtk_box_new(GTK_ORIENTATION_HORIZONTAL, spacing); |
65 #else |
65 #else |
66 return gtk_hbox_new(FALSE, spacing); |
66 return gtk_hbox_new(FALSE, spacing); |
67 #endif |
67 #endif |
68 } |
68 } |
69 |
69 |
70 |
70 |
71 |
71 |
72 /* -------------------- Box Container -------------------- */ |
72 /* -------------------- Box Container -------------------- */ |
73 UiContainer* ui_box_container(UiObject *obj, GtkWidget *box) { |
73 UiContainer* ui_box_container(UiObject *obj, GtkWidget *box, UiSubContainerType type) { |
74 UiBoxContainer *ct = cxCalloc( |
74 UiBoxContainer *ct = cxCalloc( |
75 obj->ctx->allocator, |
75 obj->ctx->allocator, |
76 1, |
76 1, |
77 sizeof(UiBoxContainer)); |
77 sizeof(UiBoxContainer)); |
78 ct->container.widget = box; |
78 ct->container.widget = box; |
79 ct->container.add = ui_box_container_add; |
79 ct->container.add = ui_box_container_add; |
|
80 ct->type = type; |
80 return (UiContainer*)ct; |
81 return (UiContainer*)ct; |
81 } |
82 } |
82 |
83 |
83 void ui_box_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
84 void ui_box_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
84 UiBoxContainer *bc = (UiBoxContainer*)ct; |
85 UiBoxContainer *bc = (UiBoxContainer*)ct; |
93 if(fill) { |
94 if(fill) { |
94 bc->has_fill = TRUE; |
95 bc->has_fill = TRUE; |
95 } |
96 } |
96 |
97 |
97 UiBool expand = fill; |
98 UiBool expand = fill; |
|
99 #if GTK_MAJOR_VERSION >= 4 |
|
100 gtk_box_append(GTK_BOX(ct->widget), widget); |
|
101 GtkAlign align = expand ? GTK_ALIGN_FILL : GTK_ALIGN_START; |
|
102 if(bc->type == UI_CONTAINER_VBOX) { |
|
103 gtk_widget_set_valign(widget, align); |
|
104 gtk_widget_set_vexpand(widget, expand); |
|
105 gtk_widget_set_hexpand(widget, TRUE); |
|
106 } else if(bc->type == UI_CONTAINER_HBOX) { |
|
107 gtk_widget_set_halign(widget, align); |
|
108 gtk_widget_set_hexpand(widget, expand); |
|
109 gtk_widget_set_vexpand(widget, TRUE); |
|
110 } |
|
111 |
|
112 #else |
98 gtk_box_pack_start(GTK_BOX(ct->widget), widget, expand, fill, 0); |
113 gtk_box_pack_start(GTK_BOX(ct->widget), widget, expand, fill, 0); |
|
114 #endif |
99 |
115 |
100 ui_reset_layout(ct->layout); |
116 ui_reset_layout(ct->layout); |
101 ct->current = widget; |
117 ct->current = widget; |
102 } |
118 } |
103 |
119 |
113 ct->height = 1; |
129 ct->height = 1; |
114 #endif |
130 #endif |
115 return (UiContainer*)ct; |
131 return (UiContainer*)ct; |
116 } |
132 } |
117 |
133 |
118 #ifdef UI_GTK3 |
134 #if GTK_MAJOR_VERSION >= 3 |
119 void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
135 void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
120 UiGridContainer *grid = (UiGridContainer*)ct; |
136 UiGridContainer *grid = (UiGridContainer*)ct; |
121 |
137 |
122 if(ct->layout.newline) { |
138 if(ct->layout.newline) { |
123 grid->x = 0; |
139 grid->x = 0; |
200 return ct; |
216 return ct; |
201 } |
217 } |
202 |
218 |
203 void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
219 void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
204 // TODO: check if the widget implements GtkScrollable |
220 // TODO: check if the widget implements GtkScrollable |
205 #ifdef UI_GTK3 |
221 #ifdef UI_GTK4 |
|
222 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(ct->widget), widget); |
|
223 #elif defined(UI_GTK3) |
206 gtk_container_add(GTK_CONTAINER(ct->widget), widget); |
224 gtk_container_add(GTK_CONTAINER(ct->widget), widget); |
207 #else |
225 #else |
208 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(ct->widget), widget); |
226 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(ct->widget), widget); |
209 #endif |
227 #endif |
210 ui_reset_layout(ct->layout); |
228 ui_reset_layout(ct->layout); |
262 GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args.spacing) : ui_gtk_hbox_new(args.spacing); |
280 GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args.spacing) : ui_gtk_hbox_new(args.spacing); |
263 GtkWidget *widget = args.margin > 0 ? box_set_margin(box, args.margin) : box; |
281 GtkWidget *widget = args.margin > 0 ? box_set_margin(box, args.margin) : box; |
264 ct->add(ct, widget, TRUE); |
282 ct->add(ct, widget, TRUE); |
265 |
283 |
266 UiObject *newobj = uic_object_new(obj, box); |
284 UiObject *newobj = uic_object_new(obj, box); |
267 newobj->container = ui_box_container(obj, box); |
285 newobj->container = ui_box_container(obj, box, type); |
268 uic_obj_add(obj, newobj); |
286 uic_obj_add(obj, newobj); |
269 |
287 |
270 return widget; |
288 return widget; |
271 } |
289 } |
272 |
290 |
283 UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { |
301 UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) { |
284 UiObject* current = uic_current_obj(obj); |
302 UiObject* current = uic_current_obj(obj); |
285 UI_APPLY_LAYOUT1(current, args); |
303 UI_APPLY_LAYOUT1(current, args); |
286 GtkWidget *widget; |
304 GtkWidget *widget; |
287 |
305 |
288 #ifdef UI_GTK3 |
306 #if GTK_MAJOR_VERSION >= 3 |
289 GtkWidget *grid = gtk_grid_new(); |
307 GtkWidget *grid = gtk_grid_new(); |
290 gtk_grid_set_column_spacing(GTK_GRID(grid), args.columnspacing); |
308 gtk_grid_set_column_spacing(GTK_GRID(grid), args.columnspacing); |
291 gtk_grid_set_row_spacing(GTK_GRID(grid), args.rowspacing); |
309 gtk_grid_set_row_spacing(GTK_GRID(grid), args.rowspacing); |
292 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 12 |
310 #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 12 |
293 gtk_widget_set_margin_start(grid, args.margin); |
311 gtk_widget_set_margin_start(grid, args.margin); |
294 gtk_widget_set_margin_end(grid, args.margin); |
312 gtk_widget_set_margin_end(grid, args.margin); |
295 #else |
313 #else |
296 gtk_widget_set_margin_left(grid, args.margin); |
314 gtk_widget_set_margin_left(grid, args.margin); |
297 gtk_widget_set_margin_right(grid, args.margin); |
315 gtk_widget_set_margin_right(grid, args.margin); |
323 |
341 |
324 return widget; |
342 return widget; |
325 } |
343 } |
326 |
344 |
327 |
345 |
|
346 #if GTK_MAJOR_VERSION >= 4 |
|
347 #define SCROLLEDWINDOW_NEW() gtk_scrolled_window_new() |
|
348 #else |
|
349 #define SCROLLEDWINDOW_NEW() gtk_scrolled_window_new(NULL, NULL) |
|
350 #endif |
328 UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) { |
351 UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs args) { |
329 UiObject* current = uic_current_obj(obj); |
352 UiObject* current = uic_current_obj(obj); |
330 UI_APPLY_LAYOUT1(current, args); |
353 UI_APPLY_LAYOUT1(current, args); |
331 |
354 |
332 GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL); |
355 GtkWidget *sw = SCROLLEDWINDOW_NEW(); |
333 UiObject *newobj = uic_object_new(obj, sw); |
356 UiObject *newobj = uic_object_new(obj, sw); |
334 newobj->container = ui_scrolledwindow_container(obj, sw); |
357 newobj->container = ui_scrolledwindow_container(obj, sw); |
335 uic_obj_add(obj, newobj); |
358 uic_obj_add(obj, newobj); |
336 |
359 |
337 return sw; |
360 return sw; |
343 } |
366 } |
344 |
367 |
345 /* -------------------- Splitpane -------------------- */ |
368 /* -------------------- Splitpane -------------------- */ |
346 |
369 |
347 static GtkWidget* create_paned(UiOrientation orientation) { |
370 static GtkWidget* create_paned(UiOrientation orientation) { |
348 #ifdef UI_GTK3 |
371 #if GTK_MAJOR_VERSION >= 3 |
349 switch(orientation) { |
372 switch(orientation) { |
350 case UI_HORIZONTAL: return gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); |
373 case UI_HORIZONTAL: return gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); |
351 case UI_VERTICAL: return gtk_paned_new(GTK_ORIENTATION_VERTICAL); |
374 case UI_VERTICAL: return gtk_paned_new(GTK_ORIENTATION_VERTICAL); |
352 } |
375 } |
353 #else |
376 #else |