# HG changeset patch # User Olaf Wintermann # Date 1733340976 -3600 # Node ID 8ea123dd89dbd8af248cdb7ff919446b31b0eac1 # Parent 0ebf9d7b23e8304f75a6ec7cf5bd38393e41a224 semi functional grid container (Motif) diff -r 0ebf9d7b23e8 -r 8ea123dd89db application/main.c --- 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); } diff -r 0ebf9d7b23e8 -r 8ea123dd89db ui/motif/Grid.c --- 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; diff -r 0ebf9d7b23e8 -r 8ea123dd89db ui/motif/Grid.h --- 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 { diff -r 0ebf9d7b23e8 -r 8ea123dd89db ui/motif/container.c --- 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; +} diff -r 0ebf9d7b23e8 -r 8ea123dd89db ui/motif/container.h --- 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