add action support for listview events default tip

Sat, 23 May 2026 21:38:30 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 23 May 2026 21:38:30 +0200
changeset 1136
e6fc42b4248d
parent 1135
2b1574ae72b5

add action support for listview events

ui/common/args.c file | annotate | diff | comparison | revisions
ui/common/args.h file | annotate | diff | comparison | revisions
ui/gtk/list.c file | annotate | diff | comparison | revisions
ui/gtk/list.h file | annotate | diff | comparison | revisions
ui/ui/list.h file | annotate | diff | comparison | revisions
--- a/ui/common/args.c	Wed May 20 20:00:35 2026 +0200
+++ b/ui/common/args.c	Sat May 23 21:38:30 2026 +0200
@@ -1887,6 +1887,10 @@
     args->onactivatedata = userdata;
 }
 
+void ui_list_args_set_onactivate_action(UiListArgs *args, const char *action) {
+    args->onactivate_action = strdup(action);
+}
+
 void ui_list_args_set_onselection(UiListArgs *args, ui_callback callback) {
     args->onselection = callback;
 }
@@ -1895,6 +1899,10 @@
     args->onselectiondata = userdata;
 }
 
+void ui_list_args_set_onselection_action(UiListArgs *args, const char *action) {
+    args->onselection_action = strdup(action);
+}
+
 void ui_list_args_set_ondragstart(UiListArgs *args, ui_callback callback) {
     args->ondragstart = callback;
 }
@@ -1903,6 +1911,10 @@
     args->ondragstartdata = userdata;
 }
 
+void ui_list_args_set_ondragstart_action(UiListArgs *args, const char *action) {
+    args->ondragstart_action = strdup(action);
+}
+
 void ui_list_args_set_ondragcomplete(UiListArgs *args, ui_callback callback) {
     args->ondragcomplete = callback;
 }
@@ -1911,6 +1923,10 @@
     args->ondragcompletedata = userdata;
 }
 
+void ui_list_args_set_ondragcomplete_action(UiListArgs *args, const char *action) {
+    args->ondragcomplete_action = strdup(action);
+}
+
 void ui_list_args_set_ondrop(UiListArgs *args, ui_callback callback) {
     args->ondrop = callback;
 }
@@ -1919,6 +1935,10 @@
     args->ondropdata = userdata;
 }
 
+void ui_list_args_set_ondrop_action(UiListArgs *args, const char *action) {
+    args->ondrop_action = strdup(action);
+}
+
 void ui_list_args_set_onsave(UiListArgs *args, ui_list_savefunc onsave) {
     args->onsave = onsave;
 }
@@ -1951,6 +1971,11 @@
     free((void*)args->name);
     free((void*)args->style_class);
     free((void*)args->varname);
+    free((void*)args->onactivate_action);
+    free((void*)args->onselection_action);
+    free((void*)args->ondragstart_action);
+    free((void*)args->ondragcomplete_action);
+    free((void*)args->ondrop_action);
     if(args->static_elements) {
         for(int i=0;i<args->static_nelm;i++) {
             free(args->static_elements[i]);
--- a/ui/common/args.h	Wed May 20 20:00:35 2026 +0200
+++ b/ui/common/args.h	Sat May 23 21:38:30 2026 +0200
@@ -450,14 +450,19 @@
 UIEXPORT void ui_list_args_set_getstyle_data(UiListArgs *args, void *userdata);
 UIEXPORT void ui_list_args_set_onactivate(UiListArgs *args, ui_callback callback);
 UIEXPORT void ui_list_args_set_onactivatedata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_onactivate_action(UiListArgs *args, const char *action);
 UIEXPORT void ui_list_args_set_onselection(UiListArgs *args, ui_callback callback);
 UIEXPORT void ui_list_args_set_onselectiondata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_onselection_action(UiListArgs *args, const char *action);
 UIEXPORT void ui_list_args_set_ondragstart(UiListArgs *args, ui_callback callback);
 UIEXPORT void ui_list_args_set_ondragstartdata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_ondragstart_action(UiListArgs *args, const char *action);
 UIEXPORT void ui_list_args_set_ondragcomplete(UiListArgs *args, ui_callback callback);
 UIEXPORT void ui_list_args_set_ondragcompletedata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_ondragcomplete_action(UiListArgs *args, const char *action);
 UIEXPORT void ui_list_args_set_ondrop(UiListArgs *args, ui_callback callback);
 UIEXPORT void ui_list_args_set_ondropdata(UiListArgs *args, void *userdata);
+UIEXPORT void ui_list_args_set_ondrop_action(UiListArgs *args, const char *action);
 UIEXPORT void ui_list_args_set_onsave(UiListArgs *args, ui_list_savefunc onsave);
 UIEXPORT void ui_list_args_set_onsavedata(UiListArgs *args, void *userdata);
 UIEXPORT void ui_list_args_set_multiselection(UiListArgs *args, UiBool multiselection);
--- a/ui/gtk/list.c	Wed May 20 20:00:35 2026 +0200
+++ b/ui/gtk/list.c	Sat May 23 21:38:30 2026 +0200
@@ -33,6 +33,7 @@
 
 #include "../common/context.h"
 #include "../common/object.h"
+#include "../common/action.h"
 #include "container.h"
 
 #include <cx/array_list.h>
@@ -83,14 +84,19 @@
     tableview->multiselection = args->multiselection;
     tableview->onactivate = args->onactivate;
     tableview->onactivatedata = args->onactivatedata;
+    tableview->onactivate_action = args->onactivate_action ? strdup(args->onactivate_action) : NULL;
     tableview->onselection = args->onselection;
     tableview->onselectiondata = args->onselectiondata;
+    tableview->onselection_action = args->onselection_action ? strdup(args->onselection_action) : NULL;
     tableview->ondragstart = args->ondragstart;
     tableview->ondragstartdata = args->ondragstartdata;
+    tableview->ondragstart_action = args->ondragstart_action ? strdup(args->ondragstart_action) : NULL;
     tableview->ondragcomplete = args->ondragcomplete;
     tableview->ondragcompletedata = args->ondragcompletedata;
+    tableview->ondragcomplete_action = args->ondragcomplete_action ? strdup(args->ondragcomplete_action) : NULL;
     tableview->ondrop = args->ondrop;
     tableview->ondropdata = args->ondropdata;
+    tableview->ondrop_action = args->ondrop_action ? strdup(args->ondrop_action) : NULL;
     tableview->selection.count = 0;
     tableview->selection.rows = NULL;
     tableview->current_row = -1;
@@ -508,7 +514,7 @@
     }
     
     // event handling
-    if(args->onactivate) {
+    if(args->onactivate || args->onactivate_action) {
         // columnview and listview can use the same callback function, because
         // the first parameter (which is technically a different pointer type)
         // is ignored
@@ -806,7 +812,7 @@
     return sel;
 }
 
-static void listview_event(ui_callback cb, void *cbdata, UiListView *view) {
+static void listview_event(ui_callback cb, void *cbdata, const char *action, UiListView *view) {
     UiEvent event;
     event.obj = view->obj;
     event.document = event.obj->ctx->document;
@@ -818,6 +824,10 @@
     if(cb) {
         cb(&event, cbdata);
     }
+    
+    if(action) {
+        uic_action_callback(&event, action);
+    }
 }
 
 static void listview_update_selection(UiListView *view) {
@@ -868,14 +878,14 @@
     if(view->selection.count == 0) {
         listview_update_selection(view);
     }
-    listview_event(view->onactivate, view->onactivatedata, view);
+    listview_event(view->onactivate, view->onactivatedata, view->onactivate_action, view);
 }
 
 void ui_listview_selection_changed(GtkSelectionModel* self, guint position, guint n_items, gpointer userdata) {
     UiListView *view = userdata;
     listview_update_selection(view);
     if(ui_selection_events_is_enabled()) {
-        listview_event(view->onselection, view->onselectiondata, view);
+        listview_event(view->onselection, view->onselectiondata, view->onselection_action, view);
     }
 }
 
@@ -2171,6 +2181,11 @@
 */
 
 void ui_listview_destroy(GtkWidget *w, UiListView *v) {
+    free(v->onactivate_action);
+    free(v->onselection_action);
+    free(v->ondragstart_action);
+    free(v->ondragcomplete_action);
+    free(v->ondrop_action);
     //gtk_tree_view_set_model(GTK_TREE_VIEW(w), NULL);
     if(v->var) {
         ui_destroy_boundvar(v->obj->ctx, v->var);
--- a/ui/gtk/list.h	Wed May 20 20:00:35 2026 +0200
+++ b/ui/gtk/list.h	Sat May 23 21:38:30 2026 +0200
@@ -81,14 +81,19 @@
 #endif
     ui_callback       onactivate;
     void              *onactivatedata;
+    char              *onactivate_action;
     ui_callback       onselection;
     void              *onselectiondata;
+    char              *onselection_action;
     ui_callback       ondragstart;
     void              *ondragstartdata;
+    char              *ondragstart_action;
     ui_callback       ondragcomplete;
     void              *ondragcompletedata;
+    char              *ondragcomplete_action;
     ui_callback       ondrop;
     void              *ondropdata;
+    char              *ondrop_action;
     ui_list_savefunc  onsave;
     void              *onsavedata;
     UiListSelection   selection;
--- a/ui/ui/list.h	Wed May 20 20:00:35 2026 +0200
+++ b/ui/ui/list.h	Sat May 23 21:38:30 2026 +0200
@@ -166,14 +166,19 @@
     void *getstyledata;
     ui_callback onactivate;
     void *onactivatedata;
+    const char *onactivate_action;
     ui_callback onselection;
     void *onselectiondata;
+    const char *onselection_action;
     ui_callback ondragstart;
     void *ondragstartdata;
+    const char *ondragstart_action;
     ui_callback ondragcomplete;
     void *ondragcompletedata;
+    const char *ondragcomplete_action;
     ui_callback ondrop;
     void *ondropdata;
+    const char *ondrop_action;
     UiBool multiselection;
     UiBool hide_header;
     UiMenuBuilder *contextmenu;

mercurial