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