add container base (win32)

Wed, 08 Oct 2025 10:41:35 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 08 Oct 2025 10:41:35 +0200
changeset 814
bcb3c7d486f3
parent 813
6d9066951cdb
child 815
7ddf5fb7ec2a

add container base (win32)

application/main.c file | annotate | diff | comparison | revisions
ui/win32/button.c file | annotate | diff | comparison | revisions
ui/win32/button.h 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.h file | annotate | diff | comparison | revisions
ui/win32/toolkit.h file | annotate | diff | comparison | revisions
ui/win32/window.c file | annotate | diff | comparison | revisions
--- a/application/main.c	Wed Oct 08 09:46:23 2025 +0200
+++ b/application/main.c	Wed Oct 08 10:41:35 2025 +0200
@@ -1125,6 +1125,7 @@
 
 void application_startup(UiEvent *event, void *data) {
 	UiObject *obj = ui_window("Test w32", NULL);
+    ui_button(obj, .label = "Test");
 	ui_show(obj);
 }
 
--- a/ui/win32/button.c	Wed Oct 08 09:46:23 2025 +0200
+++ b/ui/win32/button.c	Wed Oct 08 10:41:35 2025 +0200
@@ -27,7 +27,40 @@
  */
 
 #include "button.h"
+#include "widget.h"
+
+static W32WidgetClass button_widget_class = {
+    .enable = w32_widget_default_enable,
+    .show = w32_widget_default_show,
+    .get_preferred_size = ui_button_get_preferred_size,
+    .destroy  = w32_widget_default_destroy
+};
 
 UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *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 = CreateWindow(
+            "BUTTON",
+            args->label,
+            WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
+            0, 0, 100, 30,
+            parent,
+            (HMENU)0,
+            hInstance,
+            NULL);
+
+    W32Widget *widget = w32_widget_create(&button_widget_class, hwnd, sizeof(W32Button));
+    ui_container_add(container, widget, &layout);
+
+    return widget;
 }
+
+W32Size ui_button_get_preferred_size(W32Widget *widget) {
+    W32Size size;
+    size.width = 100;
+    size.height = 30;
+    return size;
+}
--- a/ui/win32/button.h	Wed Oct 08 09:46:23 2025 +0200
+++ b/ui/win32/button.h	Wed Oct 08 10:41:35 2025 +0200
@@ -32,4 +32,10 @@
 #include "../ui/button.h"
 #include "container.h"
 
+typedef struct W32Button {
+    W32Widget widget;
+} W32Button;
+
+W32Size ui_button_get_preferred_size(W32Widget *widget);
+
 #endif //BUTTON_H
--- a/ui/win32/container.c	Wed Oct 08 09:46:23 2025 +0200
+++ b/ui/win32/container.c	Wed Oct 08 10:41:35 2025 +0200
@@ -28,6 +28,21 @@
 
 #include "container.h"
 
+#include "../common/context.h"
+
+UiContainerPrivate* ui_obj_container(UiObject *obj) {
+    return (UiContainerPrivate*)obj->container_end;
+}
+
+HWND ui_container_get_parent(UiContainerPrivate *ctn) {
+    return ctn->parent ? ctn->parent(ctn) : ctn->hwnd;
+}
+
+void ui_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) {
+    ctn->add(ctn, widget, layout);
+    ctn->container.newline = FALSE;
+}
+
 
 /* ---------------------------- Box Container ---------------------------- */
 
@@ -46,3 +61,19 @@
 }
 
 
+/* ---------------------------- Grid Container ---------------------------- */
+
+UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) {
+    return NULL;
+}
+
+UiContainerX* ui_grid_container_create(UiObject *obj, HWND hwnd, short padding_top, short padding_bottom, short padding_left, short padding_right) {
+    UiGridLayoutContainer *container = cxZalloc(obj->ctx->allocator, sizeof(UiGridLayoutContainer));
+    container->container.hwnd = hwnd;
+    container->container.add = ui_grid_container_add;
+    return (UiContainerX*)container;
+}
+
+void ui_grid_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout) {
+    // TODO
+}
--- a/ui/win32/container.h	Wed Oct 08 09:46:23 2025 +0200
+++ b/ui/win32/container.h	Wed Oct 08 10:41:35 2025 +0200
@@ -1,5 +1,5 @@
 /*
-* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  *
  * Copyright 2025 Olaf Wintermann. All rights reserved.
  *
@@ -30,6 +30,7 @@
 #define CONTAINER_H
 
 #include "../ui/container.h"
+#include "toolkit.h"
 #include "grid.h"
 
 #ifdef __cplusplus
@@ -37,6 +38,7 @@
 #endif
 
 
+typedef struct UiGridLayoutContainer UiGridLayoutContainer;
 
 enum UiBoxOrientation {
     UI_BOX_VERTICAL = 0,
@@ -65,7 +67,7 @@
     HWND            (*parent)(UiContainerPrivate*);
     void            (*add)(UiContainerPrivate*, W32Widget*, UiLayout*);
     UiContainerType type;
-    UiLayout        layout;
+    HWND            hwnd;
 };
 
 struct UiGridLayoutContainer {
@@ -75,6 +77,13 @@
     int y;
 };
 
+UiContainerPrivate* ui_obj_container(UiObject *obj);
+HWND ui_container_get_parent(UiContainerPrivate *ctn);
+void ui_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout);
+
+UiContainerX* ui_grid_container_create(UiObject *obj, HWND hwnd, short padding_top, short padding_bottom, short padding_left, short padding_right);
+void ui_grid_container_add(UiContainerPrivate *ctn, W32Widget *widget, UiLayout *layout);
+
 #ifdef __cplusplus
 }
 #endif
--- a/ui/win32/grid.h	Wed Oct 08 09:46:23 2025 +0200
+++ b/ui/win32/grid.h	Wed Oct 08 10:41:35 2025 +0200
@@ -61,7 +61,10 @@
 typedef struct UiGridLayout {
     HWND hwnd;
 
-    short padding;
+    short padding_top;
+    short padding_bottom;
+    short padding_left;
+    short padding_right;
     short columnspacing;
     short rowspacing;
 
--- a/ui/win32/toolkit.h	Wed Oct 08 09:46:23 2025 +0200
+++ b/ui/win32/toolkit.h	Wed Oct 08 10:41:35 2025 +0200
@@ -34,6 +34,8 @@
 #include "../common/context.h"
 #include "../common/object.h"
 
+#include "win32.h"
+
 #ifdef	__cplusplus
 extern "C" {
 #endif
--- a/ui/win32/window.c	Wed Oct 08 09:46:23 2025 +0200
+++ b/ui/win32/window.c	Wed Oct 08 10:41:35 2025 +0200
@@ -27,7 +27,9 @@
  */
 
 #include "window.h"
-#include "Windows.h"
+#include <Windows.h>
+
+#include "container.h"
 
 #include "../common/object.h"
 
@@ -99,7 +101,11 @@
 	W32Widget *widget = w32_widget_new(&w32_toplevel_widget_class, hwnd);
 	obj->widget = widget;
 	obj->ref = 1;
-	
+
+	// TODO: switch to box container
+	UiContainerX *container = ui_grid_container_create(obj, hwnd, 0, 0, 0, 0);
+	uic_object_push_container(obj, container);
+
 	return obj;
 }
 

mercurial