semi functional grid container (Motif) newapi

Wed, 04 Dec 2024 20:36:16 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 04 Dec 2024 20:36:16 +0100
branch
newapi
changeset 407
8ea123dd89db
parent 406
0ebf9d7b23e8
child 408
b06e43f1edd4

semi functional grid container (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	Wed Dec 04 18:31:22 2024 +0100
+++ b/application/main.c	Wed Dec 04 20:36:16 2024 +0100
@@ -463,12 +463,40 @@
 
 void application_startup(UiEvent *event, void *data) {
     UiObject *obj = ui_window("Test", NULL);
-    ui_button(obj, .label = "Test Button", .onclick = action_button);
-    ui_togglebutton(obj, .label = "Togglebutton");
-    ui_checkbox(obj, .label = "Checkbox", .enable_group = 123);
-    ui_checkbox(obj, .label = "Checkbox Disabled", .groups = UI_GROUPS(123));
-    ui_radiobutton(obj, .label = "Radio 1", .varname = "radio");
-    ui_radiobutton(obj, .label = "Radio 2", .varname = "radio");
+    
+    ui_grid(obj, .margin = 10) {
+        ui_button(obj, .label = "Test Button", .onclick = action_button);
+        ui_newline(obj);
+        
+        ui_togglebutton(obj, .label = "Togglebutton");
+        ui_togglebutton(obj, .label = "XY", .hfill = TRUE);
+        ui_togglebutton(obj, .label = "AB", .hfill = TRUE);
+        ui_togglebutton(obj, .label = "ZZ", .hexpand = TRUE, .hfill = TRUE);
+        ui_newline(obj);
+        
+        ui_hbox(obj, .colspan = 2) {
+            ui_checkbox(obj, .label = "Checkbox", .enable_group = 123);
+            ui_checkbox(obj, .label = "Checkbox Disabled", .groups = UI_GROUPS(123));
+        }
+        ui_newline(obj);
+        
+        
+        ui_hbox(obj, .colspan = 4) {
+            ui_radiobutton(obj, .label = "Radio 1", .varname = "radio");
+            ui_radiobutton(obj, .label = "Radio 2", .varname = "radio");
+        }
+        ui_newline(obj);
+        
+        ui_hbox(obj, .vexpand = TRUE, .vfill = TRUE) {
+            ui_button(obj, .label = "F1");
+            ui_button(obj, .label = "F2");
+            ui_button(obj, .label = "F3");
+        }
+        
+    }
+    
+    
+    
     
     ui_show(obj);
 }
--- a/ui/motif/Grid.c	Wed Dec 04 18:31:22 2024 +0100
+++ b/ui/motif/Grid.c	Wed Dec 04 20:36:16 2024 +0100
@@ -405,6 +405,29 @@
         req_height += rows[i].size;
     }
     
+    if(req_width > 0 && req_height > 0) {
+        Widget parent = w->core.parent;
+        Dimension rwidth = req_width;
+        Dimension rheight = req_height;
+        if(rwidth < w->core.width) {
+            //rwidth = w->core.width;
+        }
+        if(rheight < w->core.height) {
+            //rheight = w->core.height;
+        }
+        
+        if(!w->mywidget.sizerequest) {
+            Dimension actual_width, actual_height;
+            w->mywidget.sizerequest = TRUE;
+            XtMakeResizeRequest((Widget)w, req_width, req_height, &actual_width, &actual_height);
+            w->mywidget.sizerequest = FALSE;
+            //printf("size request: %d %d\n", (int)actual_width, (int)actual_height);
+        }
+        
+       
+        
+    }
+    
     int hexpand = 0;
     int width_diff = (int)w->core.width - req_width;
     int hexpand2 = 0;
--- a/ui/motif/Grid.h	Wed Dec 04 18:31:22 2024 +0100
+++ b/ui/motif/Grid.h	Wed Dec 04 20:36:16 2024 +0100
@@ -80,6 +80,8 @@
     int margin_bottom;
     int max_col;
     int max_row;
+    
+    Boolean sizerequest;
 } GridPart;
 
 typedef struct GridRec {
--- a/ui/motif/container.c	Wed Dec 04 18:31:22 2024 +0100
+++ b/ui/motif/container.c	Wed Dec 04 20:36:16 2024 +0100
@@ -36,6 +36,41 @@
 
 #include "Grid.h"
 
+/* ---------------------------- Box Container ---------------------------- */
+
+static UIWIDGET box_create(UiObject *obj, UiContainerArgs args, UiBoxOrientation orientation) { 
+    UiContainerPrivate *ctn = ui_obj_container(obj);
+    UI_APPLY_LAYOUT(ctn->layout, args);
+    
+    Arg xargs[16];
+    int n = 0;
+    
+    if(orientation == UI_BOX_VERTICAL) {
+        //XtSetArg(xargs[n], gridRowSpacing, args.spacing); n++;
+    } else {
+        //XtSetArg(xargs[n], gridColumnSpacing, args.spacing); n++;
+    }
+    
+    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget grid = XtCreateManagedWidget(args.name ? args.name : "boxcontainer", gridClass, parent, xargs, n);
+    ctn->add(ctn, grid);
+    
+    UiContainerX *container = ui_box_container(obj, grid, orientation);
+    uic_object_push_container(obj, container);
+    
+    return grid;
+}
+
+// public
+UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) {
+    return box_create(obj, args, UI_BOX_VERTICAL);
+}
+
+// public
+UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) {
+    return box_create(obj, args, UI_BOX_HORIZONTAL);
+}
+
 UiContainerX* ui_box_container(UiObject *obj, Widget grid, UiBoxOrientation orientation) {
     UiBoxContainer *ctn = ui_malloc(obj->ctx, sizeof(UiBoxContainer));
     memset(ctn, 0, sizeof(UiBoxContainer));
@@ -69,11 +104,13 @@
 Widget ui_hbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n) {
     UiBoxContainer *box = (UiBoxContainer*)ctn;
     int a = *n;
-    XtSetArg(args[a], gridRow, box->n); a++;
+    XtSetArg(args[a], gridColumn, box->n); a++;
     if(box->container.layout.fill == UI_ON) {
         XtSetArg(args[a], gridHExpand, TRUE); a++;
+        XtSetArg(args[a], gridHFill, TRUE); a++;
     }
     XtSetArg(args[a], gridVExpand, TRUE); a++;
+    XtSetArg(args[a], gridVFill, TRUE); a++;
     *n = a;
     return ui_box_container_prepare(box, args, n);
 }
@@ -82,3 +119,112 @@
     ui_reset_layout(ctn->layout);
     
 }
+
+
+/* ---------------------------- Grid Container ---------------------------- */
+
+// public
+UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) {
+    Arg xargs[16];
+    int n = 0;
+    
+    UiContainerPrivate *ctn = ui_obj_container(obj);
+    UI_APPLY_LAYOUT(ctn->layout, args);
+    
+    Widget parent = ctn->prepare(ctn, xargs, &n);
+    Widget grid = XtCreateManagedWidget(args.name ? args.name : "gridcontainer", gridClass, parent, xargs, n);
+    ctn->add(ctn, grid);
+    
+    UiContainerX *container = ui_grid_container(obj, grid);
+    uic_object_push_container(obj, container);
+    
+    return grid;
+}
+
+UiContainerX* ui_grid_container(UiObject *obj, Widget grid) {
+    UiGridContainer *ctn = ui_malloc(obj->ctx, sizeof(UiGridContainer));
+    memset(ctn, 0, sizeof(UiBoxContainer));
+    ctn->container.prepare = ui_grid_container_prepare;
+    ctn->container.add = ui_grid_container_add;
+    ctn->container.widget = grid;
+    ctn->x = 0;
+    ctn->y = 0;
+    return (UiContainerX*)ctn;
+}
+
+Widget ui_grid_container_prepare(UiContainerPrivate *ctn, Arg *args, int *n) {
+    UiGridContainer *grid = (UiGridContainer*)ctn;
+    if(ctn->layout.newline) {
+        grid->y++;
+        grid->x = 0;
+    }
+    
+    int a = *n;
+    XtSetArg(args[a], gridColumn, grid->x); a++;
+    XtSetArg(args[a], gridRow, grid->y); a++;
+    if(ctn->layout.colspan > 0) {
+        XtSetArg(args[a], gridColspan, ctn->layout.colspan); a++;
+    }
+    if(ctn->layout.rowspan > 0) {
+        XtSetArg(args[a], gridRowspan, ctn->layout.rowspan); a++;
+    }
+    
+    if(grid->container.layout.fill == UI_ON) {
+        grid->container.layout.hfill = TRUE;
+        grid->container.layout.vfill = TRUE;
+        grid->container.layout.hexpand = TRUE;
+        grid->container.layout.vexpand = TRUE;
+    }
+    
+    if(grid->container.layout.hfill) {
+        XtSetArg(args[a], gridHFill, TRUE); a++;
+    }
+    if(grid->container.layout.vfill) {
+        XtSetArg(args[a], gridVFill, TRUE); a++;
+    }
+    if(grid->container.layout.hexpand) {
+        XtSetArg(args[a], gridHExpand, TRUE); a++;
+    }
+    if(grid->container.layout.vexpand) {
+        XtSetArg(args[a], gridVExpand, TRUE); a++;
+    }
+    
+    *n = a;
+    return ctn->widget;
+}
+
+void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget) {
+    UiGridContainer *grid = (UiGridContainer*)ctn;
+    grid->x++;
+    ui_reset_layout(ctn->layout);
+}
+
+
+/* -------------------- Container Helper Functions -------------------- */
+
+void ui_container_begin_close(UiObject *obj) {
+    UiContainerPrivate *ct = ui_obj_container(obj);
+    ct->container.close = 1;
+}
+
+int ui_container_finish(UiObject *obj) {
+    UiContainerPrivate *ct = ui_obj_container(obj);
+    if(ct->container.close) {
+        ui_end_new(obj);
+        return 0;
+    }
+    return 1;
+}
+
+
+/*
+ * -------------------- Layout Functions --------------------
+ * 
+ * functions for setting layout attributes for the current container
+ *
+ */
+
+void ui_newline(UiObject *obj) {
+    UiContainerPrivate *ct = ui_obj_container(obj);
+    ct->layout.newline = TRUE;
+}
--- a/ui/motif/container.h	Wed Dec 04 18:31:22 2024 +0100
+++ b/ui/motif/container.h	Wed Dec 04 20:36:16 2024 +0100
@@ -93,8 +93,8 @@
 
 typedef struct UiGridContainer {
     UiContainerPrivate container;
-    int x;
-    int y;
+    Dimension x;
+    Dimension y;
 } UiGridContainer;
 
 UiContainerX* ui_box_container(UiObject *obj, Widget grid, UiBoxOrientation orientation);
@@ -102,6 +102,11 @@
 Widget ui_hbox_prepare(UiContainerPrivate *ctn, Arg *args, int *n);
 void ui_box_container_add(UiContainerPrivate *ctn, Widget widget);
 
+
+UiContainerX* ui_grid_container(UiObject *obj, Widget grid);
+Widget ui_grid_container_prepare(UiContainerPrivate *ctn, Arg *args, int *n);
+void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget);
+
 #ifdef	__cplusplus
 }
 #endif

mercurial