#include "button.h"
#include <cx/buffer.h>
#include <cx/printf.h>
#include "args.h"
#include "container.h"
#include "widget.h"
#include "var.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);
if(args->labeltype !=
UI_LABEL_DEFAULT) ui_argstr_add_int(&buf,
"labeltype", (
int)args->labeltype);
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, 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);
if(args->labeltype !=
UI_LABEL_DEFAULT) ui_argstr_add_int(&buf,
"labeltype", (
int)args->labeltype);
if(buf.size >
0 && buf.space[buf.size
-1] ==
',') {
buf.space[buf.size
-1] =
' ';
}
cxBufferPutString(&buf,
"}");
return cx_mutstrn(buf.space, buf.size);
}
UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) {
UiCallbackWidget *widget = cxZalloc(obj->ctx->allocator,
sizeof(UiCallbackWidget));
widget->widget.obj = obj->widget->obj;
widget->widget.type =
CX_STR(
"button");
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,
"{");
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) {
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) {
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);
}