hide sourcelist row button if the row is not hovered (GTK)

Fri, 17 Oct 2025 16:02:56 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 17 Oct 2025 16:02:56 +0200
changeset 855
37f8a9fa8251
parent 854
9291921f21c5
child 856
b769e01035a7

hide sourcelist row button if the row is not hovered (GTK)

application/main.c file | annotate | diff | comparison | revisions
ui/gtk/list.c file | annotate | diff | comparison | revisions
--- a/application/main.c	Fri Oct 17 16:02:26 2025 +0200
+++ b/application/main.c	Fri Oct 17 16:02:56 2025 +0200
@@ -500,6 +500,7 @@
 
 void sourcelist_getvalue(UiList *list, void *sublistdata, void *rowdata, int index, UiSubListItem *item, void *userdata) {
     item->label = strdup(rowdata);
+    item->button_icon = strdup("view-more-horizontal");
     item->eventdata = sublistdata;
 }
 
--- a/ui/gtk/list.c	Fri Oct 17 16:02:26 2025 +0200
+++ b/ui/gtk/list.c	Fri Oct 17 16:02:56 2025 +0200
@@ -2395,6 +2395,9 @@
                 G_CALLBACK(listbox_button_clicked),
                 event
                 );
+        gtk_widget_set_visible(button, FALSE);
+        
+        g_object_set_data(G_OBJECT(row), "ui-listbox-row-button", button);
     }
 }
 
@@ -2429,6 +2432,58 @@
     free(item.badge);
 }
 
+static void listbox_row_on_enter(GtkWidget *row) {
+    GtkWidget *button = g_object_get_data(G_OBJECT(row), "ui-listbox-row-button");
+    if(button) {
+        gtk_widget_set_visible(button, TRUE);
+    }
+}
+
+static void listbox_row_on_leave(GtkWidget *row) {
+    GtkWidget *button = g_object_get_data(G_OBJECT(row), "ui-listbox-row-button");
+    if(button) {
+        gtk_widget_set_visible(button, FALSE);
+    }
+}
+
+#if GTK_CHECK_VERSION(4, 0, 0)
+static void listbox_row_enter(
+        GtkEventControllerMotion* self,
+        gdouble x,
+        gdouble y,
+        GtkWidget *row)
+{
+    listbox_row_on_enter(row);
+}
+
+static void listbox_row_leave(
+        GtkEventControllerMotion* self,
+        GtkWidget *row)
+{
+    listbox_row_on_leave(row);
+}
+#else
+static gboolean listbox_row_enter(
+        GtkWidget *row,
+        GdkEventCrossing event,
+        gpointer user_data)
+{
+    listbox_row_on_enter(row);
+    return FALSE;
+}
+
+
+static gboolean listbox_row_leave(
+        GtkWidget *row,
+        GdkEventCrossing *event,
+        gpointer user_data)
+{
+    listbox_row_on_leave(row);
+    return FALSE;
+}
+
+#endif
+
 void ui_listbox_update_sublist(UiListBox *listbox, UiListBoxSubList *sublist, size_t listbox_insert_index) {
     // clear sublist
     CxIterator r = cxListIterator(sublist->widgets);
@@ -2458,7 +2513,7 @@
         cxListAdd(sublist->widgets, row);
         g_object_set_data(G_OBJECT(row), "ui_listbox", listbox);
         g_object_set_data(G_OBJECT(row), "ui_listbox_sublist", sublist);
-        intptr_t rowindex = listbox_insert_index + index;
+        //intptr_t rowindex = listbox_insert_index + index;
         //g_object_set_data(G_OBJECT(row), "ui_listbox_row_index", (gpointer)rowindex);
         gtk_list_box_insert(listbox->listbox, row, listbox_insert_index + index);
         sublist->numitems = 1;
@@ -2484,6 +2539,17 @@
         
         // create listbox item
         GtkWidget *row = gtk_list_box_row_new();
+#if GTK_CHECK_VERSION(4, 0, 0)
+        GtkEventController *motion_controller = gtk_event_controller_motion_new();
+        gtk_widget_add_controller(GTK_WIDGET(row), motion_controller);
+        g_signal_connect(motion_controller, "enter", G_CALLBACK(listbox_row_enter), row);
+        g_signal_connect(motion_controller, "leave", G_CALLBACK(listbox_row_leave), row);
+#else
+        gtk_widget_set_events(GTK_WIDGET(row), GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
+        g_signal_connect(row, "enter-notify-event", G_CALLBACK(listbox_row_enter), NULL);
+        g_signal_connect(row, "leave-notify-event", G_CALLBACK(listbox_row_leave), NULL);
+#endif
+        
         listbox_fill_row(listbox, row, sublist, &item, index);
         if(index == first_index) {
             // first row in the sublist, set ui_listbox data to the row
@@ -2496,7 +2562,7 @@
                 listbox->first_row = GTK_LIST_BOX_ROW(row);
             }
         }
-        intptr_t rowindex = listbox_insert_index + index;
+        //intptr_t rowindex = listbox_insert_index + index;
         //g_object_set_data(G_OBJECT(row), "ui_listbox_row_index", (gpointer)rowindex);
         gtk_list_box_insert(listbox->listbox, row, listbox_insert_index + index + header_row);
         cxListAdd(sublist->widgets, row);

mercurial