ui/gtk/container.c

changeset 804
ce992dbfbc39
parent 803
f0c4322741c8
child 824
a0ea8f3aa6e8
--- a/ui/gtk/container.c	Mon Oct 06 11:11:30 2025 +0200
+++ b/ui/gtk/container.c	Mon Oct 06 11:36:39 2025 +0200
@@ -86,19 +86,19 @@
     switch(type) {
         default: {
             sub = ui_gtk_vbox_new(spacing);
-            add = ui_box_set_margin(sub, margin);
+            add = ui_gtk_set_margin(sub, margin, 0, 0, 0, 0);
             container = ui_box_container(obj, sub, type);
             break;
         }
         case UI_CONTAINER_HBOX: {
             sub = ui_gtk_hbox_new(spacing);
-            add = ui_box_set_margin(sub, margin);
+            add = ui_gtk_set_margin(sub, margin, 0, 0, 0, 0);
             container = ui_box_container(obj, sub, type);
             break;
         }
         case UI_CONTAINER_GRID: {
             sub = ui_create_grid_widget(columnspacing, rowspacing);
-            add = ui_box_set_margin(sub, margin);
+            add = ui_gtk_set_margin(sub, margin, 0, 0, 0, 0);
             container = ui_grid_container(obj, sub, FALSE, FALSE, FALSE, FALSE);
             break;
         }
@@ -127,6 +127,8 @@
 
 void ui_box_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) {
     UiBoxContainer *bc = (UiBoxContainer*)ct;
+    widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
+    
     UiBool fill = layout->fill;
     if(bc->has_fill && fill) {
         fprintf(stderr, "UiError: container has 2 filled widgets");
@@ -184,6 +186,7 @@
 #if GTK_MAJOR_VERSION >= 3
 void ui_grid_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) {
     UiGridContainer *grid = (UiGridContainer*)ct;
+    widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
     
     if(ct->container.newline) {
         grid->x = 0;
@@ -215,6 +218,7 @@
 #ifdef UI_GTK2
 void ui_grid_container_add(UiContainerPrivate *ct, GtkWidget *widget) {
     UiGridContainer *grid = (UiGridContainer*)ct;
+    widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
     
     if(ct->container.newline) {
         grid->x = 0;
@@ -267,6 +271,7 @@
 }
 
 void ui_frame_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) {
+    widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
     FRAME_SET_CHILD(ct->widget, widget);
     ct->current = widget;
 }
@@ -282,11 +287,13 @@
 }
 
 void ui_expander_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) {
+    widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
     EXPANDER_SET_CHILD(ct->widget, widget);
     ct->current = widget;
 }
 
 void ui_scrolledwindow_container_add(UiContainerPrivate *ct, GtkWidget *widget, UiLayout *layout) {
+    widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
     // TODO: check if the widget implements GtkScrollable
     SCROLLEDWINDOW_SET_CHILD(ct->widget, widget);
     ct->current = widget;
@@ -318,29 +325,52 @@
         fprintf(stderr, "UI Error: widget is not a tabview");
         return;
     }
+    widget = ui_gtk_set_margin(widget, layout->margin, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
     data->add_tab(ct->widget, -1, layout->label, widget);
     
     ct->current = widget;
 }
 
+#ifdef UI_GTK2
 
+static void alignment_child_visibility_changed(GtkWidget *widget, gpointer user_data) {
+    gtk_widget_set_visible(gtk_widget_get_parent(widget), gtk_widget_get_visible(widget));
+}
+
+#endif
 
-GtkWidget* ui_box_set_margin(GtkWidget *box, int margin) {
-    GtkWidget *ret = box;
+GtkWidget* ui_gtk_set_margin(GtkWidget *widget, int margin, int margin_left, int margin_right, int margin_top, int margin_bottom) {
+    if(margin > 0) {
+        margin_left = margin;
+        margin_right = margin;
+        margin_top = margin;
+        margin_bottom = margin;
+    }
+    GtkWidget *ret = widget;
 #if GTK_MAJOR_VERSION >= 3
-#if GTK_MAJOR_VERSION * 1000 + GTK_MINOR_VERSION >= 3012
-    gtk_widget_set_margin_start(box, margin);
-    gtk_widget_set_margin_end(box, margin);
+#if GTK_CHECK_VERSION(3, 12, 0)
+    gtk_widget_set_margin_start(widget, margin_left);
+    gtk_widget_set_margin_end(widget, margin_right);
 #else
-    gtk_widget_set_margin_left(box, margin);
-    gtk_widget_set_margin_right(box, margin);
+    gtk_widget_set_margin_left(widget, margin_left);
+    gtk_widget_set_margin_right(widget, margin_right);
 #endif
-    gtk_widget_set_margin_top(box, margin);
-    gtk_widget_set_margin_bottom(box, margin);
+    gtk_widget_set_margin_top(widget, margin_top);
+    gtk_widget_set_margin_bottom(widget, margin_bottom);
 #elif defined(UI_GTK2)
     GtkWidget *a = gtk_alignment_new(0.5, 0.5, 1, 1);
-    gtk_alignment_set_padding(GTK_ALIGNMENT(a), margin, margin, margin, margin);
-    gtk_container_add(GTK_CONTAINER(a), box);
+    gtk_alignment_set_padding(GTK_ALIGNMENT(a), margin_top, margin_bottom, margin_left, margin_right);
+    gtk_container_add(GTK_CONTAINER(a), widget);
+    g_signal_connect(
+                widget,
+                "show",
+                G_CALLBACK(alignment_child_visibility_changed),
+                NULL);
+    g_signal_connect(
+                widget,
+                "hide",
+                G_CALLBACK(alignment_child_visibility_changed),
+                NULL);
     ret = a;
 #endif
     return ret;
@@ -352,13 +382,12 @@
     
     GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing);
     ui_set_name_and_style(box, args->name, args->style_class);
-    GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box; // TODO: remove, margin will be handled by container add-functions
-    ct->add(ct, widget, &layout);
+    ct->add(ct, box, &layout);
     
     UiContainerX *container = ui_box_container(obj, box, type);
     uic_object_push_container(obj, container);
     
-    return widget;
+    return box;
 }
 
 UIEXPORT UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs *args) {
@@ -389,13 +418,12 @@
     
     GtkWidget *grid = ui_create_grid_widget(args->columnspacing, args->rowspacing);
     ui_set_name_and_style(grid, args->name, args->style_class);
-    widget = ui_box_set_margin(grid, args->margin);
-    ct->add(ct, widget, &layout);
+    ct->add(ct, grid, &layout);
     
     UiContainerX *container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill);
     uic_object_push_container(obj, container);
     
-    return widget;
+    return grid;
 }
 
 static void frame_create_subcontainer(UiObject *obj, UiFrameArgs *args) {
@@ -803,7 +831,7 @@
     
     uic_object_push_container(obj, container);
     
-    GtkWidget *widget = ui_box_set_margin(sub, tabview->padding);
+    GtkWidget *widget = ui_gtk_set_margin(sub, tabview->padding, 0, 0, 0, 0);
     tabview->add_tab(tabview->widget, tab, title, widget);
     
     return sub;
@@ -981,7 +1009,7 @@
     }
     
     GtkWidget *box = ui_gtk_vbox_new(args->spacing);
-    ui_box_set_margin(box, args->margin);
+    ui_gtk_set_margin(box, args->margin, args->margin_left, args->margin_right, args->margin_top, args->margin_bottom);
     adw_toolbar_view_set_content(ADW_TOOLBAR_VIEW(sidebar_toolbar_view), box);
     
     UiContainerX *container = ui_box_container(obj, box, UI_CONTAINER_VBOX);
@@ -994,7 +1022,7 @@
     GtkWidget *sidebar_vbox = g_object_get_data(G_OBJECT(obj->widget), "ui_sidebar");
     
     GtkWidget *box = ui_gtk_vbox_new(args->spacing);
-    ui_box_set_margin(box, args->margin);
+    ui_gtk_set_margin(box, args->margin, args->margin-left, args->margin_right, args->margin_top, args->margin_bottom);
     BOX_ADD_EXPAND(sidebar_vbox, box);
     
     UiContainerX *container = ui_box_container(obj, box, UI_CONTAINER_VBOX);
@@ -1014,7 +1042,7 @@
     
     GtkWidget *box = ui_gtk_vbox_new(args->spacing);
     ui_set_name_and_style(box, args->name, args->style_class);
-    ui_box_set_margin(box, args->margin);
+    ui_gtk_set_margin(box, args->margin, args->margin_left, args->margin_right, args->margin_top, args->margin_bottom);
     BOX_ADD_EXPAND(pbox, box);
     
     UiContainerX *container = ui_box_container(obj, box, UI_CONTAINER_VBOX);
@@ -1269,8 +1297,7 @@
     
     GtkWidget *box = args->container == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing);
     ui_set_name_and_style(box, args->name, args->style_class);
-    GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box;
-    ct->add(ct, widget, &layout);
+    ct->add(ct, box, &layout);
     
     UiGtkItemListContainer *container = malloc(sizeof(UiGtkItemListContainer));
     container->parent = obj;

mercurial