implement actions for buttons (GTK)

Sun, 19 Apr 2026 15:25:45 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 19 Apr 2026 15:25:45 +0200
changeset 1096
655349c3021e
parent 1095
e519ecc27cfe
child 1097
d44c895e9ee9

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");

mercurial