[gtk/wip/otte/for-main: 2/2] dropdown: Handle ::selected and ::selected-item separately




commit f30e59fed9aefaa8fc6cf89bfc4b41dd2989866c
Author: Benjamin Otte <otte redhat com>
Date:   Mon Oct 17 20:07:51 2022 +0200

    dropdown: Handle ::selected and ::selected-item separately
    
    GtkSingleSelection will only emit either of those signals if they
    change. But it is possible that only one of those properties changes,
    and in those cases we want to only notify for that property changing in
    the dropdown, too.

 gtk/gtkdropdown.c | 43 ++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 38 insertions(+), 5 deletions(-)
---
diff --git a/gtk/gtkdropdown.c b/gtk/gtkdropdown.c
index 3441e67ea1..c47e35eae8 100644
--- a/gtk/gtkdropdown.c
+++ b/gtk/gtkdropdown.c
@@ -198,11 +198,9 @@ selection_changed (GtkSingleSelection *selection,
 {
   GtkDropDown *self = data;
   guint selected;
-  gpointer item;
   GtkFilter *filter;
 
   selected = gtk_single_selection_get_selected (GTK_SINGLE_SELECTION (self->selection));
-  item = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (self->selection));
 
   if (selected == GTK_INVALID_LIST_POSITION)
     {
@@ -211,7 +209,14 @@ selection_changed (GtkSingleSelection *selection,
   else
     {
       gtk_stack_set_visible_child_name (GTK_STACK (self->button_stack), "item");
-      gtk_list_item_widget_update (GTK_LIST_ITEM_WIDGET (self->button_item), selected, item, FALSE);
+    }
+
+  if (selected != gtk_list_item_widget_get_position (GTK_LIST_ITEM_WIDGET (self->button_item)))
+    {
+      gtk_list_item_widget_update (GTK_LIST_ITEM_WIDGET (self->button_item),
+                                   selected,
+                                   gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION 
(self->selection)),
+                                   FALSE);
     }
 
   /* reset the filter so positions are 1-1 */
@@ -221,6 +226,26 @@ selection_changed (GtkSingleSelection *selection,
   gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (self->popup_selection), selected);
 
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED]);
+}
+
+static void
+selection_item_changed (GtkSingleSelection *selection,
+                        GParamSpec         *pspec,
+                        gpointer            data)
+{
+  GtkDropDown *self = data;
+  gpointer item;
+
+  item = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (self->selection));
+
+  if (item != gtk_list_item_widget_get_item (GTK_LIST_ITEM_WIDGET (self->button_item)))
+    {
+      gtk_list_item_widget_update (GTK_LIST_ITEM_WIDGET (self->button_item),
+                                   gtk_single_selection_get_selected (GTK_SINGLE_SELECTION 
(self->selection)),
+                                   item,
+                                   FALSE);
+    }
+
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED_ITEM]);
 }
 
@@ -289,7 +314,10 @@ gtk_drop_down_dispose (GObject *object)
 
   g_clear_object (&self->model);
   if (self->selection)
-    g_signal_handlers_disconnect_by_func (self->selection, selection_changed, self);
+    {
+      g_signal_handlers_disconnect_by_func (self->selection, selection_changed, self);
+      g_signal_handlers_disconnect_by_func (self->selection, selection_item_changed, self);
+    }
   g_clear_object (&self->filter_model);
   g_clear_pointer (&self->expression, gtk_expression_unref);
   g_clear_object (&self->selection);
@@ -805,7 +833,10 @@ gtk_drop_down_set_model (GtkDropDown *self,
       gtk_list_view_set_model (GTK_LIST_VIEW (self->popup_list), NULL);
 
       if (self->selection)
-        g_signal_handlers_disconnect_by_func (self->selection, selection_changed, self);
+        {
+          g_signal_handlers_disconnect_by_func (self->selection, selection_changed, self);
+          g_signal_handlers_disconnect_by_func (self->selection, selection_item_changed, self);
+        }
 
       g_clear_object (&self->selection);
       g_clear_object (&self->filter_model);
@@ -831,7 +862,9 @@ gtk_drop_down_set_model (GtkDropDown *self,
       g_object_unref (selection);
 
       g_signal_connect (self->selection, "notify::selected", G_CALLBACK (selection_changed), self);
+      g_signal_connect (self->selection, "notify::selected-item", G_CALLBACK (selection_item_changed), self);
       selection_changed (GTK_SINGLE_SELECTION (self->selection), NULL, self);
+      selection_item_changed (GTK_SINGLE_SELECTION (self->selection), NULL, self);
     }
 
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODEL]);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]