diff -r cc2170ea05ad -r 46448d38885c ui/gtk/button.c --- a/ui/gtk/button.c Fri Nov 10 18:04:40 2017 +0100 +++ b/ui/gtk/button.c Sat Nov 11 08:34:06 2017 +0100 @@ -99,48 +99,42 @@ gtk_toggle_button_set_active(button, value != 0 ? TRUE : FALSE); } +void ui_toggled_obs(GtkToggleToolButton *widget, UiVarEventData *event) { + UiEvent e; + e.obj = event->obj; + e.window = event->obj->window; + e.document = event->obj->ctx->document; + e.eventdata = NULL; + e.intval = gtk_toggle_tool_button_get_active(widget); + + UiInteger *i = event->var->value; + ui_notify_evt(i->observers, &e); +} -UIWIDGET ui_checkbox(UiObject *obj, char *label, UiInteger *value) { +UIWIDGET ui_checkbox_var(UiObject *obj, char *label, UiVar *var) { GtkWidget *button = gtk_check_button_new_with_label(label); // bind value - if(value) { + if(var) { + UiInteger *value = var->value; value->obj = GTK_TOGGLE_BUTTON(button); value->get = ui_toggle_button_get; value->set = ui_toggle_button_set; - if(value->value != 0) { - gtk_toggle_button_set_active(value->obj, TRUE); - } - } - - UiContainer *ct = uic_get_current_container(obj); - ct->add(ct, button, FALSE); - - return button; -} - -UIWIDGET ui_checkbox_cb(UiObject *obj, char *label, ui_callback f, void *data) { - GtkWidget *button = gtk_check_button_new_with_label(label); - - if(f) { - //UiEventData *event = ucx_mempool_malloc( - // obj->ctx->mempool, - // sizeof(UiEventData)); - UiEventData *event = malloc(sizeof(UiEventData)); + gtk_toggle_button_set_active(value->obj, value->value); + + UiVarEventData *event = malloc(sizeof(UiVarEventData)); event->obj = obj; - event->userdata = data; - event->callback = f; - event->value = 0; + event->var = var; g_signal_connect( button, "clicked", - G_CALLBACK(ui_button_toggled), + G_CALLBACK(ui_toggled_obs), event); g_signal_connect( button, "destroy", - G_CALLBACK(ui_destroy_userdata), + G_CALLBACK(ui_destroy_vardata), event); } @@ -150,10 +144,30 @@ return button; } +UIWIDGET ui_checkbox(UiObject *obj, char *label, UiInteger *value) { + UiVar *var = NULL; + if(value) { + var = malloc(sizeof(UiVar)); + var->value = value; + var->type = UI_VAR_SPECIAL; + } + return ui_checkbox_var(obj, label, var); +} + +UIWIDGET ui_checkbox_nv(UiObject *obj, char *label, char *varname) { + UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_INTEGER); + return ui_checkbox_var(obj, label, var); +} -UIWIDGET ui_radiobutton(UiObject *obj, char *label, UiInteger *rgroup) { - GSList *rg = rgroup ? rgroup->obj : NULL; +UIWIDGET ui_radiobutton_var(UiObject *obj, char *label, UiVar *var) { + GSList *rg = NULL; + UiInteger *rgroup; + + if(var) { + rgroup = var->value; + rg = rgroup->obj; + } GtkWidget *rbutton = gtk_radio_button_new_with_label(rg, label); rg = gtk_radio_button_get_group(GTK_RADIO_BUTTON(rbutton)); @@ -162,9 +176,23 @@ rgroup->obj = rg; rgroup->get = ui_radiobutton_get; rgroup->set = ui_radiobutton_set; - if(rgroup->value > 0) { - ui_radiobutton_set(rgroup, rgroup->value); - } + + ui_radiobutton_set(rgroup, rgroup->value); + + UiVarEventData *event = malloc(sizeof(UiVarEventData)); + event->obj = obj; + event->var = var; + + g_signal_connect( + rbutton, + "clicked", + G_CALLBACK(ui_radio_obs), + event); + g_signal_connect( + rbutton, + "destroy", + G_CALLBACK(ui_destroy_vardata), + event); } UiContainer *ct = uic_get_current_container(obj); @@ -173,13 +201,42 @@ return rbutton; } +UIWIDGET ui_radiobutton(UiObject *obj, char *label, UiInteger *rgroup) { + UiVar *var = NULL; + if(rgroup) { + var = malloc(sizeof(UiVar)); + var->value = rgroup; + var->type = UI_VAR_SPECIAL; + } + return ui_radiobutton_var(obj, label, var); +} + +UIWIDGET ui_radiobutton_nv(UiObject *obj, char *label, char *varname) { + UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_INTEGER); + return ui_radiobutton_var(obj, label, var); +} + +void ui_radio_obs(GtkToggleToolButton *widget, UiVarEventData *event) { + UiInteger *i = event->var->value; + + UiEvent e; + e.obj = event->obj; + e.window = event->obj->window; + e.document = event->obj->ctx->document; + e.eventdata = NULL; + e.intval = i->get(i); + + ui_notify_evt(i->observers, &e); +} + int ui_radiobutton_get(UiInteger *value) { int selection = 0; GSList *ls = value->obj; int i = 0; + guint len = g_slist_length(ls); while(ls) { if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ls->data))) { - selection = g_slist_length(value->obj) - i - 1; + selection = len - i - 1; break; } ls = ls->next; @@ -203,6 +260,6 @@ j++; } - value->value = j; + value->value = i; }