ui/motif/container.c

branch
newapi
changeset 407
8ea123dd89db
parent 406
0ebf9d7b23e8
child 408
b06e43f1edd4
--- 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;
+}

mercurial