Wed, 12 Nov 2025 18:04:21 +0100
add togglebutton (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 |
--- a/application/main.c Tue Nov 11 20:10:13 2025 +0100 +++ b/application/main.c Wed Nov 12 18:04:21 2025 +0100 @@ -1182,6 +1182,12 @@ ui_newline(obj); ui_button(obj, .label = "End"); + ui_newline(obj); + + ui_togglebutton(obj, .label = "Test"); + ui_newline(obj); + + ui_checkbox(obj, .label = "Checkbox"); }
--- a/ui/win32/button.c Tue Nov 11 20:10:13 2025 +0100 +++ b/ui/win32/button.c Wed Nov 12 18:04:21 2025 +0100 @@ -42,6 +42,14 @@ .destroy = w32_widget_default_destroy }; +static W32WidgetClass togglebutton_widget_class = { + .eventproc = ui_togglebutton_eventproc, + .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) { HINSTANCE hInstance = GetModuleHandle(NULL); UiContainerPrivate *container = ui_obj_container(obj); @@ -85,8 +93,9 @@ void ui_button_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { UiWidget *w = (UiWidget*)widget; - printf("button eventproc\n"); - fflush(stdout); + if (uMsg != WM_COMMAND) { + return; + } UiEvent e; e.obj = w->obj; @@ -101,3 +110,89 @@ w->callback(&e, w->callbackdata); } } + +static UIWIDGET create_togglebutton(UiObject *obj, UiToggleArgs *args, unsigned long type) { + 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 | type, + 0, 0, 100, 30, + parent, + (HMENU)1, + hInstance, + NULL); + ui_win32_set_ui_font(hwnd); + + W32Widget *widget = w32_widget_create(&togglebutton_widget_class, hwnd, sizeof(UiWidget)); + ui_container_add(container, widget, &layout); + + UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); + if (var) { + UiInteger *i = var->value; + i->obj = widget; + i->get = ui_togglebutton_get; + i->set = ui_togglebutton_set; + if (i->value != 0) { + SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0); + } + } + + UiWidget *btn = (UiWidget*)widget; + btn->obj = obj; + btn->var = var; + btn->callback = args->onchange; + btn->callbackdata = args->onchangedata; + + return widget; +} + +UIWIDGET ui_togglebutton_create(UiObject *obj, UiToggleArgs *args) { + return create_togglebutton(obj, args, BS_AUTOCHECKBOX | BS_PUSHLIKE); +} + +UIWIDGET ui_checkbox_create(UiObject *obj, UiToggleArgs *args) { + return create_togglebutton(obj, args, BS_AUTOCHECKBOX); +} + +UIWIDGET ui_switch_create(UiObject *obj, UiToggleArgs *args) { + return create_togglebutton(obj, args, BS_AUTOCHECKBOX); +} + +int64_t ui_togglebutton_get(UiInteger *i) { + UiWidget *btn = (UiWidget*)i->obj; + LRESULT state = SendMessage(btn->widget.hwnd, BM_GETCHECK, 0, 0); + i->value = state; + return state; +} + +void ui_togglebutton_set(UiInteger *i, int64_t v) { + UiWidget *btn = (UiWidget*)i->obj; + WPARAM state = v ? BST_CHECKED : BST_UNCHECKED; + SendMessage(btn->widget.hwnd, BM_SETCHECK, state, 0); + i->value = v; +} + +void ui_togglebutton_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + if (uMsg != WM_COMMAND) { + return; + } + UiWidget *w = (UiWidget*)widget; + + UiEvent e; + e.obj = w->obj; + e.document = e.obj->ctx->document; + e.window = e.obj->window; + e.eventdata = NULL; + e.eventdatatype = 0; + e.intval = SendMessage(w->widget.hwnd, BM_GETCHECK, 0, 0); + e.set = ui_get_setop(); + + if (w->callback) { + w->callback(&e, w->callbackdata); + } +}
--- a/ui/win32/button.h Tue Nov 11 20:10:13 2025 +0100 +++ b/ui/win32/button.h Wed Nov 12 18:04:21 2025 +0100 @@ -36,4 +36,9 @@ void ui_button_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +int64_t ui_togglebutton_get(UiInteger *i); +void ui_togglebutton_set(UiInteger *i, int64_t v); + +void ui_togglebutton_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + #endif //BUTTON_H