ui/server/button.c

changeset 1004
8b8d4f8af38e
parent 991
ab3125bd8b5f
child 1007
a2070417b280
--- a/ui/server/button.c	Sat Dec 13 13:19:29 2025 +0100
+++ b/ui/server/button.c	Sun Dec 14 18:54:57 2025 +0100
@@ -33,6 +33,7 @@
 #include "args.h"
 #include "container.h"
 #include "widget.h"
+#include "var.h"
 
 cxmutstr ui_button_args_to_string(UiContext *ctx, UiButtonArgs *args) {
     CxBuffer buf;
@@ -51,8 +52,22 @@
     return cx_mutstrn(buf.space, buf.size);
 }
 
-cxmutstr ui_toggle_args_to_string(UiContext *ctx, UiToggleArgs *args) {
+cxmutstr ui_toggle_args_to_string(UiContext *ctx, UiToggleArgs *args, cxmutstr value) {
+    CxBuffer buf;
+    cxBufferInit(&buf, NULL, 256, ctx->allocator, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
+    
+    cxBufferPutString(&buf, "{");
     
+    UI_STANDARD_ARGS(&buf, args);
+    UI_LABEL_ARGS(&buf, args);
+    if(value.ptr) ui_argstr_add_str(&buf, "value", value.ptr);
+    // TODO: labeltype, states
+    
+    if(buf.size > 0 && buf.space[buf.size-1] == ',') {
+        buf.space[buf.size-1] = ' ';
+    }
+    cxBufferPutString(&buf, "}");
+    return cx_mutstrn(buf.space, buf.size);
 }
 
 
@@ -80,13 +95,42 @@
     ui_serialize_type_obj_id(&w->widget, &buf);
     cxBufferPutString(&buf, ",\"args\":");
     cxBufferPutString(&buf, w->widget.args.ptr);
+    if(w->widget.var_id.ptr) {
+        cxBufferPutString(&buf, ",\"value\":\"");
+        cxBufferPutString(&buf, w->widget.var_id.ptr);
+        cxBufferPutString(&buf, "\"");
+    }
     cxBufferPutString(&buf, "}\n");
     
     return cx_mutstrn(buf.space, buf.size);
 }
 
 static UIWIDGET togglebutton_create(UiObject *obj, const char *type, UiToggleArgs *args) {
-    return NULL;
+    cxmutstr var_id = cx_mutstrn(NULL, 0);
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
+    if(var) {
+        UiInteger *i = var->value;
+        if(!i->obj) {
+            ui_server_bind_int(obj->ctx, i);
+        }
+        var_id = cx_mutstr(i->obj);
+    }
+    
+    UiCallbackWidget *widget = cxZalloc(obj->ctx->allocator, sizeof(UiCallbackWidget));
+    widget->widget.obj = obj->widget->obj;
+    widget->widget.type = cx_str(type);
+    widget->widget.args = ui_toggle_args_to_string(obj->ctx, args, var_id);
+    widget->widget.var_id = var_id;
+    widget->widget.var_type = UI_VAR_INTEGER;
+    widget->widget.serialize = (ui_serialize_func)ui_button_serialize;
+    widget->callback = args->onchange;
+    widget->userdata = args->onchangedata;
+    ui_reg_widget((UiWidget*)widget);
+    
+    UiWidget *parent = obj->container_end->container;
+    cxListAdd(parent->children, widget);
+    
+    return (UiWidget*)widget;
 }
 
 UIWIDGET ui_togglebutton_create(UiObject *obj, UiToggleArgs *args) {

mercurial