ui/server/button.c

changeset 985
93f07ccfd997
child 991
ab3125bd8b5f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/server/button.c	Thu Dec 11 19:52:44 2025 +0100
@@ -0,0 +1,106 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2025 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "button.h"
+#include <cx/buffer.h>
+#include <cx/printf.h>
+
+#include "args.h"
+#include "container.h"
+
+cxmutstr ui_button_args_to_string(UiContext *ctx, UiButtonArgs *args) {
+    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);
+    // 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);
+}
+
+cxmutstr ui_toggle_args_to_string(UiContext *ctx, UiToggleArgs *args) {
+    
+}
+
+
+UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) {
+    UiCallbackWidget *widget = cxZalloc(obj->ctx->allocator, sizeof(UiCallbackWidget));
+    widget->widget.obj = obj->widget->obj;
+    widget->widget.args = ui_button_args_to_string(obj->ctx, args);
+    widget->widget.serialize = (ui_serialize_func)ui_button_serialize;
+    widget->callback = args->onclick;
+    widget->userdata = args->onclickdata;
+    ui_reg_widget((UiWidget*)widget);
+    
+    UiWidget *parent = obj->container_end->container;
+    cxListAdd(parent->children, widget);
+    
+    return (UiWidget*)widget;
+}
+
+cxmutstr ui_button_serialize(UiCallbackWidget *w) {
+    CxBuffer buf;
+    cxBufferInit(&buf, NULL, 1024, NULL, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
+    
+    cxBufferPutString(&buf, "{\"type\":\"button\", \"obj\":\"");
+    cxBufferPutString(&buf, w->widget.obj->id.ptr);
+    cxBufferPutString(&buf, "\", \"id\":\"");
+    cxBufferPutString(&buf, w->widget.id.ptr);
+    cxBufferPutString(&buf, "\", \"args\":");
+    cxBufferPutString(&buf, w->widget.args.ptr);
+    cxBufferPutString(&buf, "}\n");
+    
+    return cx_mutstrn(buf.space, buf.size);
+}
+
+static UIWIDGET togglebutton_create(UiObject *obj, const char *type, UiToggleArgs *args) {
+    return NULL;
+}
+
+UIWIDGET ui_togglebutton_create(UiObject *obj, UiToggleArgs *args) {
+    return togglebutton_create(obj, "togglebutton", args);
+}
+
+UIWIDGET ui_checkbox_create(UiObject *obj, UiToggleArgs *args) {
+    return togglebutton_create(obj, "checkbox", args);
+}
+
+UIWIDGET ui_switch_create(UiObject *obj, UiToggleArgs *args) {
+    return togglebutton_create(obj, "switch", args);
+}
+
+UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) {
+    return togglebutton_create(obj, "radiobutton", args);
+}

mercurial