merge

Sun, 12 Oct 2025 17:37:54 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 12 Oct 2025 17:37:54 +0200
changeset 843
9d958108c415
parent 842
2ba50231b255 (current diff)
parent 841
651cf2c59dd9 (diff)
child 844
3106d9ca2f9c

merge

--- a/application/main.c	Sun Oct 12 17:37:16 2025 +0200
+++ b/application/main.c	Sun Oct 12 17:37:54 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 17:37:16 2025 +0200
+++ b/ui/ui/win32.h	Sun Oct 12 17:37:54 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 17:37:16 2025 +0200
+++ b/ui/win32/button.c	Sun Oct 12 17:37:54 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 17:37:16 2025 +0200
+++ b/ui/win32/container.c	Sun Oct 12 17:37:54 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 17:37:16 2025 +0200
+++ b/ui/win32/container.h	Sun Oct 12 17:37:54 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 17:37:16 2025 +0200
+++ b/ui/win32/grid.c	Sun Oct 12 17:37:54 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 17:37:16 2025 +0200
+++ b/ui/win32/window.c	Sun Oct 12 17:37:54 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) {
--- a/ui/win32/window.h	Sun Oct 12 17:37:16 2025 +0200
+++ b/ui/win32/window.h	Sun Oct 12 17:37:54 2025 +0200
@@ -44,7 +44,6 @@
 typedef struct UiWindow {
     W32Widget widget;
     UiObject *obj;
-    UiBoxContainer *container;
 } UiWindow;
 
 void ui_window_init(void);

mercurial