implement sourcelist item button (GTK)

Tue, 19 Aug 2025 14:13:43 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 19 Aug 2025 14:13:43 +0200
changeset 698
3496032f0dd0
parent 697
d254b3ec7736
child 699
148618eff948

implement sourcelist item button (GTK)

.hgignore file | annotate | diff | comparison | revisions
ui/gtk/list.c file | annotate | diff | comparison | revisions
--- a/.hgignore	Tue Aug 19 12:59:00 2025 +0200
+++ b/.hgignore	Tue Aug 19 14:13:43 2025 +0200
@@ -1,6 +1,7 @@
 relre:^build/.*$
 relre:^config.mk$
 relre:^core$
+relre:^gmon.out$
 relre:^make/vs/.vs/.*
 relre:^make/vs/packages/.*
 relre:^make/vs/.*vcxproj\.user
@@ -9,4 +10,4 @@
 relre:^ui/winui/Generated Files/.*
 relre:^.qmake.stash$
 relre:^.idea/.*
-relre:^compile_commands.json$
\ No newline at end of file
+relre:^compile_commands.json$
--- a/ui/gtk/list.c	Tue Aug 19 12:59:00 2025 +0200
+++ b/ui/gtk/list.c	Tue Aug 19 14:13:43 2025 +0200
@@ -39,6 +39,7 @@
 #include <cx/linked_list.h>
 
 #include "list.h"
+#include "button.h"
 #include "icon.h"
 #include "menu.h"
 #include "dnd.h"
@@ -1969,6 +1970,31 @@
     }
 }
 
+static void listbox_button_clicked(GtkWidget *widget, UiEventDataExt *data) {
+    UiListBoxSubList *sublist = data->customdata0;
+    
+    UiSubListEventData eventdata;
+    eventdata.list = sublist->var->value;
+    eventdata.sublist_index = sublist->index;
+    eventdata.row_index = data->value0;
+    eventdata.sublist_userdata = sublist->userdata;
+    eventdata.row_data = eventdata.list->get(eventdata.list, eventdata.row_index);
+    eventdata.event_data = data->customdata2;
+    
+    UiEvent event;
+    event.obj = data->obj;
+    event.window = event.obj->window;
+    event.document = event.obj->ctx->document;
+    event.eventdata = &eventdata;
+    event.eventdatatype = UI_EVENT_DATA_SUBLIST;
+    event.intval = data->value0;
+    event.set = ui_get_setop();
+    
+    if(data->callback2) {
+        data->callback2(&event, data->userdata2);
+    }
+}
+
 static GtkWidget* create_listbox_row(UiListBox *listbox, UiListBoxSubList *sublist, UiSubListItem *item, int index) {
     GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
     if(item->icon) {
@@ -1978,7 +2004,9 @@
     GtkWidget *label = gtk_label_new(item->label);
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     BOX_ADD_EXPAND(hbox, label);
-    // TODO: badge, button
+    if(item->badge) {
+        
+    }
     GtkWidget *row = gtk_list_box_row_new();
     LISTBOX_ROW_SET_CHILD(row, hbox);
     
@@ -2003,6 +2031,22 @@
     
     g_object_set_data(G_OBJECT(row), "ui-listbox-row-eventdata", event);
     
+    // TODO: badge
+    // button
+    if(item->button_icon || item->button_label) {
+        GtkWidget *button = gtk_button_new();
+        gtk_button_set_label(GTK_BUTTON(button), item->button_label);
+        ui_button_set_icon_name(button, item->button_icon);
+        WIDGET_ADD_CSS_CLASS(button, "flat");
+        BOX_ADD(hbox, button);
+        g_signal_connect(
+                button,
+                "clicked",
+                G_CALLBACK(listbox_button_clicked),
+                event
+                );
+    }
+    
     return row;
 }
 

mercurial