ui/motif/container.c

changeset 886
6f5e02fcb7b9
parent 808
2b0ecad00872
child 888
1bb3a6641857
--- a/ui/motif/container.c	Thu Oct 30 21:29:18 2025 +0100
+++ b/ui/motif/container.c	Fri Oct 31 10:12:27 2025 +0100
@@ -227,6 +227,82 @@
     grid->container.container.newline = FALSE;
 }
 
+/* -------------------------- Frame Container -------------------------- */
+
+UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) {
+    Arg xargs[16];
+    int n = 0;
+    
+    UiContainerPrivate *ctn = ui_obj_container(obj);
+    UiLayout layout = UI_ARGS2LAYOUT(args);
+    
+    Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
+    
+    char *name = args->name ? (char*)args->name : "frame";
+    Widget frame = XmCreateFrame(parent, name, xargs, 6);
+    XtManageChild(frame);
+    ui_container_add(ctn, frame);
+    
+    if(args->label) {
+        XmString s = XmStringCreateLocalized((char*)args->label);
+        n = 0;
+        XtSetArg(xargs[n], XmNlabelString, s); n++;
+        XtSetArg(xargs[n], XmNchildType, XmFRAME_TITLE_CHILD); n++;
+        Widget label = XmCreateLabel(frame, "frame_label", xargs, n);
+        XtManageChild(label);
+        XmStringFree(s);
+    }
+    
+    UiContainerX *container = ui_frame_container(obj, frame);
+    uic_object_push_container(obj, container);
+    
+    UiContainerArgs sub_args = {
+        .spacing = args->spacing,
+        .columnspacing = args->columnspacing,
+        .rowspacing = args->rowspacing
+    };
+    switch(args->subcontainer) {
+        default: break;
+        case UI_CONTAINER_VBOX: {
+            ui_vbox_create(obj, &sub_args);
+            uic_object_remove_second_last_container(obj);
+            break;
+        }
+        case UI_CONTAINER_HBOX: {
+            ui_hbox_create(obj, &sub_args);
+            uic_object_remove_second_last_container(obj);
+            break;
+        }
+        case UI_CONTAINER_GRID: {
+            ui_grid_create(obj, &sub_args);
+            uic_object_remove_second_last_container(obj);
+            break;
+        }
+    }
+    
+    
+    return frame;
+}
+
+UiContainerX* ui_frame_container(UiObject *obj, Widget frame) {
+    UiContainerPrivate *ctn = ui_malloc(obj->ctx, sizeof(UiContainerPrivate));
+    memset(ctn, 0, sizeof(UiContainerPrivate));
+    ctn->prepare = ui_frame_container_prepare;
+    ctn->add = ui_frame_container_add;
+    ctn->widget = frame;
+    return (UiContainerX*)ctn;
+}
+
+Widget ui_frame_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n) {
+    int a = *n;
+    XtSetArg(args[a], XmNchildType, XmFRAME_WORKAREA_CHILD);
+    *n = a+1;
+    return ctn->widget;
+}
+
+void ui_frame_container_add(UiContainerPrivate *ctn, Widget widget) {
+    // NOOP
+}
 
 /* -------------------------- TabView Container -------------------------- */
 

mercurial