ui/gtk/container.c

branch
newapi
changeset 297
a73c60adf188
parent 273
1dd2456c51d3
child 298
c5e207d01ff2
equal deleted inserted replaced
296:a362c76dbf99 297:a73c60adf188
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

mercurial