implement grid margin (Motif)

Mon, 17 Nov 2025 11:28:47 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 17 Nov 2025 11:28:47 +0100
changeset 901
884d70e847a3
parent 900
6e1485d5451a
child 902
6872b59217a7

implement grid margin (Motif)

application/main.c file | annotate | diff | comparison | revisions
ui/motif/Grid.c file | annotate | diff | comparison | revisions
ui/motif/Grid.h file | annotate | diff | comparison | revisions
ui/motif/container.c file | annotate | diff | comparison | revisions
ui/motif/container.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Mon Nov 17 08:27:03 2025 +0100
+++ b/application/main.c	Mon Nov 17 11:28:47 2025 +0100
@@ -1017,6 +1017,20 @@
                 ui_spinbox(obj, .varname = "num");
             }
         }
+        
+        ui_tab(obj, "Tab 5") {
+            ui_grid(obj, .margin = 0, .columnspacing = 10, .rowspacing = 10) {
+                ui_button(obj, .label = "Button");
+                ui_button(obj, .label = "Button");
+                ui_button(obj, .label = "Button");
+                ui_newline(obj);
+                
+                for(int i=0;i<10;i++) {
+                    ui_button(obj, .label = "Margin", .margin_left = 2*i);
+                    ui_newline(obj);
+                }
+            }
+        }
     }
     
     
--- a/ui/motif/Grid.c	Mon Nov 17 08:27:03 2025 +0100
+++ b/ui/motif/Grid.c	Mon Nov 17 11:28:47 2025 +0100
@@ -75,12 +75,42 @@
         (XtPointer) 0
     },
     {
-        gridMargin,
-        gridMargin,
+        gridPaddingLeft,
+        gridPaddingLeft,
+        XmRDimension,
+        sizeof (Dimension),
+        XtOffsetOf( GridRec,
+                   mywidget.padding_left),
+        XmRImmediate,
+        (XtPointer) 0
+    },
+    {
+        gridPaddingRight,
+        gridPaddingRight,
         XmRDimension,
         sizeof (Dimension),
         XtOffsetOf( GridRec,
-                   mywidget.margin),
+                   mywidget.padding_right),
+        XmRImmediate,
+        (XtPointer) 0
+    },
+    {
+        gridPaddingTop,
+        gridPaddingTop,
+        XmRDimension,
+        sizeof (Dimension),
+        XtOffsetOf( GridRec,
+                   mywidget.padding_top),
+        XmRImmediate,
+        (XtPointer) 0
+    },
+    {
+        gridPaddingBottom,
+        gridPaddingBottom,
+        XmRDimension,
+        sizeof (Dimension),
+        XtOffsetOf( GridRec,
+                   mywidget.padding_bottom),
         XmRImmediate,
         (XtPointer) 0
     }
@@ -406,8 +436,8 @@
     GridDef *rows = calloc(nrows, sizeof(GridDef));
     int num_cols_expanding = 0;
     int num_rows_expanding = 0;
-    int req_width = 0;
-    int req_height = 0;
+    int req_width = w->mywidget.padding_left + w->mywidget.padding_right;
+    int req_height = w->mywidget.padding_top + w->mywidget.padding_bottom;
     
     //printf("container width: %d\n", (int)w->core.width);
     
@@ -428,6 +458,8 @@
             if(constraints->grid.pref_width < constraints->grid.min_width) {
                 constraints->grid.pref_width = constraints->grid.min_width;
             }
+            int elm_width = constraints->grid.pref_width + constraints->grid.margin_left + constraints->grid.margin_right;
+            int elm_height = constraints->grid.pref_height + constraints->grid.margin_top + constraints->grid.margin_bottom;
             
             if(constraints->grid.colspan > span_max || constraints->grid.rowspan > span_max) {
                 continue;
@@ -489,12 +521,12 @@
                     span_width = last_col->size;
                     
                 }
-                int diff = constraints->grid.pref_width - span_width;
+                int diff = elm_width - span_width;
                 if(diff > 0) {
                     last_col->size += diff; 
                 }
-            } else if(constraints->grid.pref_width > col->size) {
-                col->size = constraints->grid.pref_width;
+            } else if(elm_width > col->size) {
+                col->size = elm_width;
             }
             // row size
             if(constraints->grid.rowspan > 1) {
@@ -505,12 +537,12 @@
                     span_height = last_row->size;
                     
                 }
-                int diff = constraints->grid.pref_height - span_height;
+                int diff = elm_height - span_height;
                 if(diff > 0) {
                     last_row->size += diff; 
                 }
-            } else if(constraints->grid.pref_height > row->size) {
-                row->size = constraints->grid.pref_height;
+            } else if(elm_height > row->size) {
+                row->size = elm_height;
             }
         }
         span_max = 50000; // not sure if this is unreasonable low or high
@@ -574,7 +606,7 @@
         hexpand = width_diff / num_cols_expanding;
         hexpand2 = width_diff-hexpand*num_cols_expanding;
     }
-    int x = 0;
+    int x = w->mywidget.padding_left;
     for(int i=0;i<ncols;i++) {
         cols[i].pos = x;
         if(cols[i].expand) {
@@ -592,7 +624,7 @@
         vexpand = height_diff / num_rows_expanding;
         vexpand2 = height_diff-vexpand*num_rows_expanding;
     }
-    int y = 0;
+    int y = w->mywidget.padding_bottom;
     for(int i=0;i<nrows;i++) {
         rows[i].pos = y;
         if(rows[i].expand) {
@@ -608,8 +640,8 @@
         GridConstraintRec *constraints = child->core.constraints;
         GridDef c = cols[constraints->grid.x];
         GridDef r = rows[constraints->grid.y];
-        int x = c.pos;
-        int y = r.pos;
+        int x = c.pos + constraints->grid.margin_left;
+        int y = r.pos + constraints->grid.margin_top;
         int width = constraints->grid.pref_width;
         int height = constraints->grid.pref_height;
         if(constraints->grid.hfill) {
--- a/ui/motif/Grid.h	Mon Nov 17 08:27:03 2025 +0100
+++ b/ui/motif/Grid.h	Mon Nov 17 11:28:47 2025 +0100
@@ -42,8 +42,11 @@
 
 // resources
 #define gridColumnSpacing "gridColumnSpacing"
-#define gridRowSpacing "gridRowSpacing"
-#define gridMargin "gridMargin"
+#define gridRowSpacing    "gridRowSpacing"
+#define gridPaddingLeft   "gridPaddingLeft"
+#define gridPaddingRight  "gridPaddingRight"
+#define gridPaddingTop    "gridPaddingTop"
+#define gridPaddingBottom "gridPaddingBottom"
 
 // constraints    
 #define gridColumn "gridColumn"
@@ -81,15 +84,14 @@
 
 
 typedef struct GridPart {
-    int margin_left;
-    int margin_right;
-    int margin_top;
-    int margin_bottom;
+    int padding_left;
+    int padding_right;
+    int padding_top;
+    int padding_bottom;
     int max_col;
     int max_row;
     Dimension columnspacing;
     Dimension rowspacing;
-    Dimension margin;
     
     Boolean sizerequest;
 } GridPart;
--- a/ui/motif/container.c	Mon Nov 17 08:27:03 2025 +0100
+++ b/ui/motif/container.c	Mon Nov 17 11:28:47 2025 +0100
@@ -55,6 +55,18 @@
     container->add(container, widget);
 }
 
+void ui_container_apply_grid_margin(
+        Arg *args,
+        int *n,
+        int margin_left, int margin_right, int margin_top, int margin_bottom)
+{
+    int c = *n;
+    XtSetArg(args[c], gridMarginLeft, margin_left); c++;
+    XtSetArg(args[c], gridMarginRight, margin_right); c++;
+    XtSetArg(args[c], gridMarginTop, margin_top); c++;
+    XtSetArg(args[c], gridMarginBottom, margin_bottom); c++;
+    *n = c;
+}
 
 /* ---------------------------- Box Container ---------------------------- */
 
@@ -102,7 +114,7 @@
 }
 
 static Widget ui_box_container_prepare(UiBoxContainer *box, UiLayout *layout, Arg *args, int *n) {
-    int a = *n;
+    ui_container_apply_grid_margin(args, n, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
     box->n++;
     return box->container.widget;
 }
@@ -151,7 +163,10 @@
     UiLayout layout = UI_ARGS2LAYOUT(args);
     
     Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
-    XtSetArg(xargs[n], gridMargin, args->margin); n++;
+    XtSetArg(xargs[n], gridPaddingLeft, 10); n++;
+    XtSetArg(xargs[n], gridPaddingRight, 10); n++;
+    XtSetArg(xargs[n], gridPaddingTop, 10); n++;
+    XtSetArg(xargs[n], gridPaddingBottom, 10); n++;
     XtSetArg(xargs[n], gridColumnSpacing, args->columnspacing); n++;
     XtSetArg(xargs[n], gridRowSpacing, args->rowspacing); n++;
     Widget grid = XtCreateManagedWidget(args->name ? args->name : "gridcontainer", gridClass, parent, xargs, n);
@@ -218,6 +233,7 @@
     }
     
     *n = a;
+    ui_container_apply_grid_margin(args, n, layout->margin_left, layout->margin_right, layout->margin_top, layout->margin_bottom);
     return ctn->widget;
 }
 
--- a/ui/motif/container.h	Mon Nov 17 08:27:03 2025 +0100
+++ b/ui/motif/container.h	Mon Nov 17 11:28:47 2025 +0100
@@ -129,6 +129,10 @@
 
 Widget ui_container_prepare(UiContainerPrivate *container, UiLayout *layout, Arg *args, int *n);
 void ui_container_add(UiContainerPrivate *container, Widget widget);
+void ui_container_apply_grid_margin(
+        Arg *args,
+        int *n,
+        int margin_left, int margin_right, int margin_top, int margin_bottom);
 
 void ui_motif_tabview_select(UiMotifTabView *tabview, int tab);
 void ui_motif_tabview_add_tab(UiMotifTabView *tabview, int index, const char *name, Widget child);

mercurial