diff -r e519ecc27cfe -r 655349c3021e ui/gtk/button.c --- 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 #include #include #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) {