ui/gtk/button.c

changeset 1096
655349c3021e
parent 1063
e0251f6e15f7
--- 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) {

mercurial