Sun, 19 Apr 2026 15:25:45 +0200
implement actions for buttons (GTK)
| ui/common/toolbar.c | file | annotate | diff | comparison | revisions | |
| ui/gtk/button.c | file | annotate | diff | comparison | revisions | |
| ui/gtk/button.h | file | annotate | diff | comparison | revisions | |
| ui/gtk/headerbar.c | file | annotate | diff | comparison | revisions | |
| ui/gtk/window.c | file | annotate | diff | comparison | revisions |
--- a/ui/common/toolbar.c Sun Apr 19 14:52:59 2026 +0200 +++ b/ui/common/toolbar.c Sun Apr 19 15:25:45 2026 +0200 @@ -57,6 +57,7 @@ newargs.tooltip = nl_strdup(args->tooltip); newargs.onclick = args->onclick; newargs.onclickdata = args->onclickdata; + newargs.action = nl_strdup(args->action); newargs.states = uic_copy_states(args->states, ngroups); newargs.visibility_states = uic_copy_states(args->visibility_states, nvstates); return newargs; @@ -78,6 +79,7 @@ newargs.varname = nl_strdup(args->varname); newargs.onchange = args->onchange; newargs.onchangedata = args->onchangedata; + newargs.action = nl_strdup(args->action); newargs.states = uic_copy_states(args->states, ngroups); newargs.visibility_states = uic_copy_states(args->visibility_states, nvstates); return newargs;
--- a/ui/gtk/button.c Sun Apr 19 14:52:59 2026 +0200 +++ b/ui/gtk/button.c Sun Apr 19 15:25:45 2026 +0200 @@ -31,11 +31,13 @@ #include "button.h" #include "container.h" +#include "widget.h" #include <cx/allocator.h> #include <cx/buffer.h> #include <cx/json.h> #include "../common/context.h" #include "../common/object.h" +#include "../common/action.h" void ui_button_set_icon_name(GtkWidget *button, const char *icon) { if(!icon) { @@ -63,6 +65,7 @@ const char *tooltip, ui_callback onclick, void *userdata, + const char *action, int event_value, bool activate_event) { @@ -72,12 +75,13 @@ gtk_widget_set_tooltip_text(button, tooltip); } - if(onclick) { + if(onclick || action) { UiEventData *event = malloc(sizeof(UiEventData)); event->obj = obj; event->userdata = userdata; event->callback = onclick; event->value = event_value; + event->action = action ? strdup(action) : NULL; event->customdata = NULL; event->customint = 0; @@ -89,7 +93,7 @@ g_signal_connect( button, "destroy", - G_CALLBACK(ui_destroy_userdata), + G_CALLBACK(ui_destroy_eventdata), event); if(activate_event) { g_signal_connect( @@ -98,13 +102,21 @@ G_CALLBACK(ui_button_clicked), event); } + + if(action) { + uic_bind_action(obj->ctx, action, button, (ui_enablefunc)ui_set_enabled); + UiAction *ui_action = uic_resolve_action(obj->ctx, action); + if(!ui_action) { + ui_set_enabled(button, FALSE); + } + } } return button; } UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) { - GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->tooltip, args->onclick, args->onclickdata, 0, FALSE); + GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->tooltip, args->onclick, args->onclickdata, args->action, 0, FALSE); ui_set_name_and_style(button, args->name, args->style_class); ui_set_widget_states(obj->ctx, button, args->states); UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; @@ -124,7 +136,13 @@ e.eventdatatype = 0; e.intval = event->value; e.set = ui_get_setop(); - event->callback(&e, event->userdata); + if(event->callback) { + event->callback(&e, event->userdata); + } + + if(event->action) { + uic_action_callback(&e, event->action); + } } void ui_button_set_label(UIWIDGET button, const char *label) {
--- a/ui/gtk/button.h Sun Apr 19 14:52:59 2026 +0200 +++ b/ui/gtk/button.h Sun Apr 19 15:25:45 2026 +0200 @@ -58,6 +58,7 @@ const char *tooltip, ui_callback onclick, void *userdata, + const char *action, int event_value, bool activate_event);
--- a/ui/gtk/headerbar.c Sun Apr 19 14:52:59 2026 +0200 +++ b/ui/gtk/headerbar.c Sun Apr 19 15:25:45 2026 +0200 @@ -163,7 +163,7 @@ UiObject *obj, enum UiToolbarPos pos) { - GtkWidget *button = ui_create_button(obj, item->args.label, item->args.icon, item->args.tooltip, item->args.onclick, item->args.onclickdata, 0, FALSE); + GtkWidget *button = ui_create_button(obj, item->args.label, item->args.icon, item->args.tooltip, item->args.onclick, item->args.onclickdata, item->args.action, 0, FALSE); ui_set_widget_states(obj->ctx, button, item->args.states); ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states); WIDGET_ADD_CSS_CLASS(button, "flat");
--- a/ui/gtk/window.c Sun Apr 19 14:52:59 2026 +0200 +++ b/ui/gtk/window.c Sun Apr 19 15:25:45 2026 +0200 @@ -987,7 +987,7 @@ } if(args->lbutton1) { - GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 1, args->default_button == 1); + GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, NULL, 1, args->default_button == 1); gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button); if(args->default_button == 1) { WIDGET_ADD_CSS_CLASS(button, "suggested-action"); @@ -995,7 +995,7 @@ } } if(args->lbutton2) { - GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 2, args->default_button == 2); + GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, NULL, 2, args->default_button == 2); gtk_header_bar_pack_start(GTK_HEADER_BAR(headerbar), button); if(args->default_button == 2) { WIDGET_ADD_CSS_CLASS(button, "suggested-action"); @@ -1004,7 +1004,7 @@ } if(args->rbutton4) { - GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 4, args->default_button == 4); + GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, NULL, 4, args->default_button == 4); gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button); if(args->default_button == 4) { WIDGET_ADD_CSS_CLASS(button, "suggested-action"); @@ -1012,7 +1012,7 @@ } } if(args->rbutton3) { - GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 3, args->default_button == 3); + GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, NULL, 3, args->default_button == 3); gtk_header_bar_pack_end(GTK_HEADER_BAR(headerbar), button); if(args->default_button == 3) { WIDGET_ADD_CSS_CLASS(button, "suggested-action"); @@ -1033,7 +1033,7 @@ gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE); if(args->lbutton1) { - GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 1, args->default_button == 1); + GtkWidget *button = ui_create_button(obj, args->lbutton1, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, NULL, 1, args->default_button == 1); gtk_grid_attach(GTK_GRID(grid), button, 0, 0, 1, 1); if(args->default_button == 1) { WIDGET_ADD_CSS_CLASS(button, "suggested-action"); @@ -1041,7 +1041,7 @@ } } if(args->lbutton2) { - GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 2, args->default_button == 2); + GtkWidget *button = ui_create_button(obj, args->lbutton2, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, NULL, 2, args->default_button == 2); gtk_grid_attach(GTK_GRID(grid), button, 1, 0, 1, 1); if(args->default_button == 2) { WIDGET_ADD_CSS_CLASS(button, "suggested-action"); @@ -1052,7 +1052,7 @@ gtk_widget_set_hexpand(space, TRUE); gtk_grid_attach(GTK_GRID(grid), space, 2, 0, 1, 1); if(args->rbutton3) { - GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 3, args->default_button == 3); + GtkWidget *button = ui_create_button(obj, args->rbutton3, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, NULL, 3, args->default_button == 3); gtk_grid_attach(GTK_GRID(grid), button, 3, 0, 1, 1); if(args->default_button == 3) { WIDGET_ADD_CSS_CLASS(button, "suggested-action"); @@ -1060,7 +1060,7 @@ } } if(args->rbutton4) { - GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, 4, args->default_button == 4); + GtkWidget *button = ui_create_button(obj, args->rbutton4, NULL, NULL/*tooltip*/, args->onclick, args->onclickdata, NULL, 4, args->default_button == 4); gtk_grid_attach(GTK_GRID(grid), button, 4, 0, 1, 1); if(args->default_button == 4) { WIDGET_ADD_CSS_CLASS(button, "suggested-action");