add new margin widget args and implement margin in the cocoa gridlayout

Sun, 05 Oct 2025 13:30:19 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 05 Oct 2025 13:30:19 +0200
changeset 800
814d374fb689
parent 799
f8ff8df41713
child 801
e096c441e874

add new margin widget args and implement margin in the cocoa gridlayout

make/xcode/toolkit/toolkit/main.m file | annotate | diff | comparison | revisions
ui/cocoa/GridLayout.m file | annotate | diff | comparison | revisions
ui/cocoa/container.h file | annotate | diff | comparison | revisions
ui/cocoa/container.m file | annotate | diff | comparison | revisions
ui/cocoa/toolkit.m file | annotate | diff | comparison | revisions
ui/ui/button.h file | annotate | diff | comparison | revisions
ui/ui/container.h file | annotate | diff | comparison | revisions
ui/ui/display.h file | annotate | diff | comparison | revisions
ui/ui/entry.h file | annotate | diff | comparison | revisions
ui/ui/image.h file | annotate | diff | comparison | revisions
ui/ui/text.h file | annotate | diff | comparison | revisions
ui/ui/tree.h file | annotate | diff | comparison | revisions
ui/ui/webview.h file | annotate | diff | comparison | revisions
ui/ui/widget.h file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit/main.m	Sun Oct 05 12:34:42 2025 +0200
+++ b/make/xcode/toolkit/toolkit/main.m	Sun Oct 05 13:30:19 2025 +0200
@@ -131,9 +131,22 @@
     }
     //*/
     
+    ui_grid(obj, .fill = TRUE, .margin = 10, .columnspacing = 10, .rowspacing = 10) {
+        ui_button(obj, .label = "Button 1");
+        ui_button(obj, .label = "Button 2");
+        ui_button(obj, .label = "Button 3", .hfill = TRUE, .hexpand = TRUE);
+        ui_newline(obj);
+        
+        ui_button(obj, .label = "Button X2", .colspan = 3, .hfill = TRUE);
+        ui_newline(obj);
+        
+        ui_textarea(obj, .varname = "text", .fill = TRUE, .colspan = 3);
+    }
+    
+    /*
     ui_button(obj, .label = "HBox Button 1");
     ui_button(obj, .label = "HBox Button 2");
-    ui_grid(obj, .fill = TRUE, .columnspacing = 20, .rowspacing = 10) {
+    ui_grid(obj, .fill = TRUE, .columnspacing = 20, .rowspacing = 10, .margin = 50) {
         ui_hbox(obj, .spacing = 8, .colspan = 1) {
             ui_button(obj, .label = "HBox Button 1");
             ui_button(obj, .label = "HBox Button 2");
@@ -149,6 +162,7 @@
         ui_button(obj, .label = "textfield", .hfill = TRUE);
     }
     ui_button(obj, .label = "HBox Button 3");
+    */
     
     /*
     ui_grid(obj, .spacing = 0, .fill = TRUE) {
--- a/ui/cocoa/GridLayout.m	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/cocoa/GridLayout.m	Sun Oct 05 13:30:19 2025 +0200
@@ -80,6 +80,10 @@
             GridDef *col = &cols[x];
             GridDef *row = &rows[y];
             
+            if(elm->margin.left + elm->margin.right > 0) {
+                printf(""); // break
+            }
+            
             NSSize size = elm->view.intrinsicContentSize;
             NSSize size2 = elm->view.fittingSize;
             if(size.width == NSViewNoIntrinsicMetric) {
@@ -89,21 +93,21 @@
                 size.height = size2.height;
             }
             if(size.width != NSViewNoIntrinsicMetric) {
-                CGFloat width = size.width;
+                CGFloat width = size.width + elm->margin.left + elm->margin.right;
                 if(width > cols[elm->x].preferred_size && elm->colspan <= 1 && span_max == 1) {
                     cols[elm->x].preferred_size = width;
                 }
                 elm->preferred_width = width;
             }
             if(size.height != NSViewNoIntrinsicMetric) {
-                CGFloat height = size.height;
-                //CGFloat height = size.height;
+                CGFloat height = size.height + elm->margin.top + elm->margin.bottom;
                 if(height > rows[elm->y].preferred_size && elm->rowspan <= 1 && span_max == 1) {
                     rows[elm->y].preferred_size = height;
                 }
                 elm->preferred_height = height;
             }
             
+            
             if(elm->rowspan > span_max || elm->colspan > span_max) {
                 continue;
             }
@@ -254,16 +258,22 @@
                 if(end_col > ncols) {
                     end_col = ncols;
                 }
+                int real_span = 0;
                 for(int c=elm->x;c<end_col;c++) {
                     cwidth += cols[c].size;
+                    real_span++;
                 }
-                frame.size.width = cwidth + + alignment.left + alignment.right;
+                if(real_span > 0) {
+                    cwidth += (real_span-1) * colspacing;
+                }
+                frame.size.width = cwidth + alignment.left + alignment.right;
             } else {
                 frame.size.width = col->size + alignment.left + alignment.right;
             }
         } else {
             frame.size.width = elm->preferred_width + alignment.left + alignment.right;
         }
+        frame.size.width -= elm->margin.left + elm->margin.right;
         if(elm->vfill) {
             if(elm->rowspan > 1) {
                 int rheight = 0;
@@ -271,8 +281,13 @@
                 if(end_row > nrows) {
                     end_row = nrows;
                 }
+                int real_span = 0;
                 for(int r=elm->y;r<end_row;r++) {
                     rheight += rows[r].size;
+                    real_span++;
+                }
+                if(real_span > 0) {
+                    rheight += (real_span-1) * rowspacing;
                 }
                 frame.size.height = rheight;
             }
@@ -280,9 +295,10 @@
         } else {
             frame.size.height = elm->preferred_height;
         }
-        frame.origin.x = col->pos - (alignment.left+alignment.right)/2;
+        frame.size.height -= elm->margin.top + elm->margin.bottom;
+        frame.origin.x = col->pos + elm->margin.left - (alignment.left+alignment.right)/2;
         //frame.origin.y = viewFrame.size.height - row->pos - frame.size.height + ((alignment.top+alignment.right)/2);
-        frame.origin.y = viewFrame.size.height - row->pos - frame.size.height;
+        frame.origin.y = viewFrame.size.height - row->pos - elm->margin.top - frame.size.height;
         elm->view.frame = frame;
     }
     
--- a/ui/cocoa/container.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/cocoa/container.h	Sun Oct 05 13:30:19 2025 +0200
@@ -51,6 +51,11 @@
     UiBool       hfill;
     UiBool       vfill;
     //int          width;
+    int          margin;
+    int          margin_left;
+    int          margin_right;
+    int          margin_top;
+    int          margin_bottom;
     int          colspan;
     int          rowspan;
 };
@@ -61,6 +66,11 @@
     .vexpand = args->vexpand, \
     .hfill = args->hfill, \
     .vfill = args->vfill, \
+    .margin = args->margin, \
+    .margin_left = args->margin_left, \
+    .margin_right = args->margin_right, \
+    .margin_top = args->margin_top, \
+    .margin_bottom = args->margin_bottom, \
     .colspan = args->colspan, \
     .rowspan = args->rowspan }
 
--- a/ui/cocoa/container.m	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/cocoa/container.m	Sun Oct 05 13:30:19 2025 +0200
@@ -162,7 +162,18 @@
     UiContainerX *ctn = obj->container_end;
     id<Container> container = (__bridge id<Container>)ctn->container;
     container.uilayout = *layout;
-    NSEdgeInsets margin = {0}; // TODO
+    NSEdgeInsets margin = {0};
+    if(layout->margin > 0) {
+        margin.left = layout->margin;
+        margin.right = layout->margin;
+        margin.top = layout->margin;
+        margin.bottom = layout->margin;
+    } else {
+        margin.left = layout->margin_left;
+        margin.right = layout->margin_right;
+        margin.top = layout->margin_top;
+        margin.bottom = layout->margin_bottom;
+    }
     [container addView:view margin:margin];
 }
 
--- a/ui/cocoa/toolkit.m	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/cocoa/toolkit.m	Sun Oct 05 13:30:19 2025 +0200
@@ -64,7 +64,6 @@
     
     uic_init_global_context();
 
-    uic_docmgr_init();
     uic_menu_init();
     uic_toolbar_init();
 
--- a/ui/ui/button.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/button.h	Sun Oct 05 13:30:19 2025 +0200
@@ -48,6 +48,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
@@ -70,6 +75,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
@@ -95,6 +105,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
--- a/ui/ui/container.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/container.h	Sun Oct 05 13:30:19 2025 +0200
@@ -65,12 +65,16 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
     const char *style_class;
 
-    int margin;
     int spacing;
     int columnspacing;
     int rowspacing;
@@ -87,6 +91,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
@@ -94,7 +103,6 @@
 
     UiSubContainerType subcontainer;
 
-    int margin;
     int spacing;
     int columnspacing;
     int rowspacing;
@@ -110,6 +118,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
@@ -124,7 +137,6 @@
     UiInteger *value;
     const char* varname;
 
-    int margin;
     int spacing;
     int columnspacing;
     int rowspacing;
@@ -153,6 +165,10 @@
     const char *name;
     const char *style_class;
     int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int spacing;
 } UiSidebarArgs;
 
@@ -163,12 +179,16 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
     const char *style_class;
 
-    int margin;
     int spacing;
     int columnspacing;
     int rowspacing;
@@ -187,12 +207,16 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
     const char *style_class;
     
-    int margin;
     int spacing;
     
     int sub_margin;
@@ -339,7 +363,7 @@
 UIEXPORT int ui_container_finish(UiObject *obj);
 
 #define UI_APPLY_LAYOUT1(obj, args) \
-    if(args.fill != UI_DEFAULT) ui_layout_fill(obj, args.fill == UI_ON ? 1 : 0 ); \
+    if(args.fill) ui_layout_fill(obj, 1); \
     if(args.hexpand) ui_layout_hexpand(obj, 1); \
     if(args.vexpand) ui_layout_vexpand(obj, 1); \
     if(args.hfill) ui_layout_hfill(obj, 1); \
@@ -350,7 +374,7 @@
     /*force caller to add ';'*/(void)0
 
 #define UI_APPLY_LAYOUT2(obj, args) \
-    if(args->fill != UI_DEFAULT) ui_layout_fill(obj, args->fill == UI_ON ? 1 : 0 ); \
+    if(args->fill) ui_layout_fill(obj, 1); \
     if(args->hexpand) ui_layout_hexpand(obj, 1); \
     if(args->vexpand) ui_layout_vexpand(obj, 1); \
     if(args->hfill) ui_layout_hfill(obj, 1); \
--- a/ui/ui/display.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/display.h	Sun Oct 05 13:30:19 2025 +0200
@@ -56,6 +56,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
@@ -75,6 +80,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     int width;
@@ -94,6 +104,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
--- a/ui/ui/entry.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/entry.h	Sun Oct 05 13:30:19 2025 +0200
@@ -43,6 +43,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     int width;
--- a/ui/ui/image.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/image.h	Sun Oct 05 13:30:19 2025 +0200
@@ -51,6 +51,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
--- a/ui/ui/text.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/text.h	Sun Oct 05 13:30:19 2025 +0200
@@ -42,9 +42,15 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     int width;
+    int height;
     const char *name;
     const char *style_class;
 
@@ -63,6 +69,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     int width;
@@ -97,6 +108,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
--- a/ui/ui/tree.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/tree.h	Sun Oct 05 13:30:19 2025 +0200
@@ -118,6 +118,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
@@ -191,6 +196,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
--- a/ui/ui/webview.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/webview.h	Sun Oct 05 13:30:19 2025 +0200
@@ -39,12 +39,17 @@
 #define UI_WEBVIEW_OBJECT_TYPE "webview"
     
 typedef struct UiWebviewArgs {
-    UiTri fill;
+    UiBool fill;
     UiBool hexpand;
     UiBool vexpand;
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;
--- a/ui/ui/widget.h	Sun Oct 05 12:34:42 2025 +0200
+++ b/ui/ui/widget.h	Sun Oct 05 13:30:19 2025 +0200
@@ -41,6 +41,11 @@
     UiBool hfill;
     UiBool vfill;
     UiBool override_defaults;
+    int margin;
+    int margin_left;
+    int margin_right;
+    int margin_top;
+    int margin_bottom;
     int colspan;
     int rowspan;
     const char *name;

mercurial