Sun, 12 Oct 2025 12:01:03 +0200
implement ui_grid_create (win32)
| application/main.c | file | annotate | diff | comparison | revisions | |
| ui/ui/win32.h | file | annotate | diff | comparison | revisions | |
| ui/win32/button.c | file | annotate | diff | comparison | revisions | |
| ui/win32/container.c | file | annotate | diff | comparison | revisions | |
| ui/win32/container.h | file | annotate | diff | comparison | revisions | |
| ui/win32/grid.c | file | annotate | diff | comparison | revisions | |
| ui/win32/window.c | file | annotate | diff | comparison | revisions | |
| ui/win32/window.h | file | annotate | diff | comparison | revisions |
--- a/application/main.c Sun Oct 12 09:17:37 2025 +0200 +++ b/application/main.c Sun Oct 12 12:01:03 2025 +0200 @@ -1141,11 +1141,21 @@ void application_startup(UiEvent *event, void *data) { UiObject *obj = ui_window("Test w32", NULL); - ui_button(obj, .label = "Test", .hfill = TRUE, .hexpand = TRUE, .colspan = 3, .margin = 10); - ui_button(obj, .label = "Test 2-1", .margin_left = 10); - ui_button(obj, .label = "Test 2-2", .hfill = TRUE, .hexpand = TRUE, .margin_left = 20); - ui_button(obj, .label = "Test 2-3", .margin_left = 30); - ui_button(obj, .label = "Test 3XX", .colspan = 3, .fill = TRUE, .onclick = action_button); + + ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .fill = TRUE) { + ui_button(obj, .label = "Test", .hfill = TRUE, .hexpand = TRUE, .colspan = 3, .margin = 10); + ui_newline(obj); + + ui_button(obj, .label = "Test 2-1"); + ui_button(obj, .label = "Test 2-2"); + ui_button(obj, .label = "Test 2-3"); + ui_newline(obj); + + ui_button(obj, .label = "Test 3XX", .colspan = 3, .fill = TRUE, .onclick = action_button); + } + + + ui_show(obj); }
--- a/ui/ui/win32.h Sun Oct 12 09:17:37 2025 +0200 +++ b/ui/ui/win32.h Sun Oct 12 12:01:03 2025 +0200 @@ -41,6 +41,8 @@ typedef struct W32Widget W32Widget; typedef struct W32Size W32Size; +typedef void (*W32LayoutFunc)(void *, int, int); + struct W32Size { int width; int height; @@ -58,6 +60,8 @@ W32WidgetClass *wclass; HWND hwnd; void *userdata; + void (*layout)(void *layout, int width, int height); + void *layoutmanager; }; #ifdef __cplusplus
--- a/ui/win32/button.c Sun Oct 12 09:17:37 2025 +0200 +++ b/ui/win32/button.c Sun Oct 12 12:01:03 2025 +0200 @@ -32,6 +32,8 @@ #include <stdio.h> #include <stdlib.h> +#include <commctrl.h> + static W32WidgetClass button_widget_class = { .eventproc = ui_button_eventproc, .enable = w32_widget_default_enable, @@ -72,6 +74,11 @@ W32Size size; size.width = 100; size.height = 30; + SIZE sz; + if (Button_GetIdealSize(widget->hwnd, &sz)) { + size.width = sz.cx; + size.height = sz.cy; + } return size; }
--- a/ui/win32/container.c Sun Oct 12 09:17:37 2025 +0200 +++ b/ui/win32/container.c Sun Oct 12 12:01:03 2025 +0200 @@ -31,6 +31,16 @@ #include "../common/context.h" #include "../common/container.h" +#include "../motif/container.h" + + +static W32WidgetClass grid_layout_widget_class = { + .eventproc = NULL, + .enable = NULL, + .show = w32_widget_default_show, + .get_preferred_size = ui_grid_layout_get_preferred_size, + .destroy = w32_widget_default_destroy +}; UiContainerPrivate* ui_obj_container(UiObject *obj) { return (UiContainerPrivate*)obj->container_end; @@ -52,6 +62,14 @@ ctn->container.newline = FALSE; } +W32Size ui_grid_layout_get_preferred_size(W32Widget *widget) { + UiGridLayout *grid = widget->layoutmanager; + W32Size size; + size.width = grid->preferred_width; + size.height = grid->preferred_height; + return size; +} + /* ---------------------------- Box Container ---------------------------- */ @@ -106,7 +124,35 @@ /* ---------------------------- Grid Container ---------------------------- */ UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { - return NULL; + HINSTANCE hInstance = GetModuleHandle(NULL); + UiContainerPrivate *container = ui_obj_container(obj); + HWND parent = ui_container_get_parent(container); + UiLayout layout = UI_ARGS2LAYOUT(args); + + HWND hwnd = CreateWindowEx( + 0, + TEXT("STATIC"), + NULL, + WS_CHILD | WS_VISIBLE | WS_BORDER, + 0, 0, 100, 100, + parent, + NULL, + hInstance, + NULL); + + W32Widget *widget = w32_widget_new(&grid_layout_widget_class, hwnd); + ui_container_add(container, widget, &layout); + + UiContainerX *gridContainer = ui_grid_container_create(obj, hwnd, args->columnspacing, args->rowspacing, INSETS_ZERO); + uic_object_push_container(obj, gridContainer); + + UiGridLayoutContainer *grid = (UiGridLayoutContainer*)gridContainer; + widget->layout = (W32LayoutFunc)ui_grid_layout; + widget->layoutmanager = grid->layout; + grid->layout->preferred_width = 200; + grid->layout->preferred_height = 200; + + return widget; } UiContainerX* ui_grid_container_create(UiObject *obj, HWND hwnd, short columnspacing, short rowspacing, GridEdgeInsets padding) { @@ -139,3 +185,20 @@ grid->x++; } + + +/* ---------------------------- Container Helper ---------------------------- */ + +void ui_container_begin_close(UiObject *obj) { + UiContainerX *ct = obj->container_end; + ct->close = 1; +} + +int ui_container_finish(UiObject *obj) { + UiContainerX *ct = obj->container_end; + if(ct->close) { + ui_end_new(obj); + return 0; + } + return 1; +} \ No newline at end of file
--- a/ui/win32/container.h Sun Oct 12 09:17:37 2025 +0200 +++ b/ui/win32/container.h Sun Oct 12 12:01:03 2025 +0200 @@ -92,6 +92,8 @@ HWND ui_container_get_parent(UiContainerPrivate *ctn); void ui_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout); +W32Size ui_grid_layout_get_preferred_size(W32Widget *widget); + UiContainerX* ui_box_container_create(UiObject *obj, HWND hwnd, UiBoxOrientation orientation, short spacing, GridEdgeInsets padding); void ui_box_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout);
--- a/ui/win32/grid.c Sun Oct 12 09:17:37 2025 +0200 +++ b/ui/win32/grid.c Sun Oct 12 12:01:03 2025 +0200 @@ -290,6 +290,9 @@ child_x = col->pos + elm->layout.margin.left; child_y = row->pos + elm->layout.margin.top; SetWindowPos(elm->widget->hwnd, NULL, child_x, child_y, child_width, child_height, SWP_NOZORDER); + if (elm->widget->layout) { + elm->widget->layout(elm->widget->layoutmanager, child_width, child_height); + } } free(cols);
--- a/ui/win32/window.c Sun Oct 12 09:17:37 2025 +0200 +++ b/ui/win32/window.c Sun Oct 12 12:01:03 2025 +0200 @@ -69,6 +69,14 @@ cmdWidget->wclass->eventproc(cmdWidget, hwnd, uMsg, wParam, lParam); } } + case WM_SIZE: { + int width = LOWORD(lParam); + int height = HIWORD(lParam); + if (widget->layout) { + widget->layout(widget->layoutmanager, width, height); + } + break; + } default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; @@ -112,10 +120,12 @@ UiContainerX *container = ui_box_container_create(obj, hwnd, UI_BOX_VERTICAL, 0, INSETS_ZERO); uic_object_push_container(obj, container); + UiBoxContainer *box = (UiBoxContainer*)container; UiWindow *widget = w32_widget_create(&w32_toplevel_widget_class, hwnd, sizeof(UiWindow)); widget->obj = obj; - widget->container = (UiBoxContainer *)container; + widget->widget.layout = (W32LayoutFunc)ui_grid_layout; + widget->widget.layoutmanager = box->layout; obj->widget = (W32Widget*)widget; obj->ref = 1; @@ -128,15 +138,7 @@ void ui_window_widget_event(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - UiWindow *window = (UiWindow*)widget; - switch (uMsg) { - case WM_SIZE: { - int width = LOWORD(lParam); - int height = HIWORD(lParam); - ui_grid_layout(window->container->layout, width, height); - break; - } - } + //UiWindow *window = (UiWindow*)widget; } void ui_window_widget_show(W32Widget *w, BOOLEAN show) {