[gtk/columnview-sorter-api: 5/5] columnview: Clean up interactions




commit ec769269961a439306e9ba3fbda263136d7fe411
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Oct 20 11:42:57 2022 -0400

    columnview: Clean up interactions
    
    Use signals to update column titles instead
    of ad-hoc private API.

 gtk/gtkcolumnviewcolumn.c        | 16 -------
 gtk/gtkcolumnviewcolumnprivate.h |  2 -
 gtk/gtkcolumnviewsorter.c        | 10 -----
 gtk/gtkcolumnviewtitle.c         | 95 ++++++++++++++++++++++++++++------------
 gtk/gtkcolumnviewtitleprivate.h  |  2 -
 5 files changed, 66 insertions(+), 59 deletions(-)
---
diff --git a/gtk/gtkcolumnviewcolumn.c b/gtk/gtkcolumnviewcolumn.c
index 9ff589e5d8..f4faeddbca 100644
--- a/gtk/gtkcolumnviewcolumn.c
+++ b/gtk/gtkcolumnviewcolumn.c
@@ -705,9 +705,6 @@ gtk_column_view_column_set_title (GtkColumnViewColumn *self,
   g_free (self->title);
   self->title = g_strdup (title);
 
-  if (self->header)
-    gtk_column_view_title_update (GTK_COLUMN_VIEW_TITLE (self->header));
-
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TITLE]);
 }
 
@@ -764,9 +761,6 @@ gtk_column_view_column_set_sorter (GtkColumnViewColumn *self,
 
   gtk_column_view_column_remove_from_sorter (self);
 
-  if (self->header)
-    gtk_column_view_title_update (GTK_COLUMN_VIEW_TITLE (self->header));
-
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SORTER]);
 }
 
@@ -786,13 +780,6 @@ gtk_column_view_column_get_sorter (GtkColumnViewColumn *self)
   return self->sorter;
 }
 
-void
-gtk_column_view_column_notify_sort (GtkColumnViewColumn *self)
-{
-  if (self->header)
-    gtk_column_view_title_update (GTK_COLUMN_VIEW_TITLE (self->header));
-}
-
 /**
  * gtk_column_view_column_set_visible: (attributes org.gtk.Method.set_property=visible)
  * @self: a `GtkColumnViewColumn`
@@ -861,9 +848,6 @@ gtk_column_view_column_set_header_menu (GtkColumnViewColumn *self,
   if (!g_set_object (&self->menu, menu))
     return;
 
-  if (self->header)
-    gtk_column_view_title_update (GTK_COLUMN_VIEW_TITLE (self->header));
-
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_HEADER_MENU]);
 }
 
diff --git a/gtk/gtkcolumnviewcolumnprivate.h b/gtk/gtkcolumnviewcolumnprivate.h
index d71bc8a9dd..b16bb5555f 100644
--- a/gtk/gtkcolumnviewcolumnprivate.h
+++ b/gtk/gtkcolumnviewcolumnprivate.h
@@ -49,8 +49,6 @@ void                    gtk_column_view_column_get_allocation           (GtkColu
                                                                          int                    *offset,
                                                                          int                    *size);
 
-void                    gtk_column_view_column_notify_sort              (GtkColumnViewColumn    *self);
-
 void                    gtk_column_view_column_set_header_position      (GtkColumnViewColumn    *self,
                                                                          int                     offset);
 void                    gtk_column_view_column_get_header_allocation    (GtkColumnViewColumn    *self,
diff --git a/gtk/gtkcolumnviewsorter.c b/gtk/gtkcolumnviewsorter.c
index 0c77c28906..72fdef5099 100644
--- a/gtk/gtkcolumnviewsorter.c
+++ b/gtk/gtkcolumnviewsorter.c
@@ -330,17 +330,12 @@ gtk_column_view_sorter_add_column (GtkColumnViewSorter *self,
   g_sequence_insert_before (iter, s);
 
   /* notify the previous first column to stop drawing an arrow */
-  if (first)
-    gtk_column_view_column_notify_sort (first->column);
-
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PRIMARY_SORT_COLUMN]);
 out:
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PRIMARY_SORT_ORDER]);
 
   gtk_sorter_changed (GTK_SORTER (self), GTK_SORTER_CHANGE_DIFFERENT);
 
-  gtk_column_view_column_notify_sort (column);
-
   return TRUE;
 }
 
@@ -357,7 +352,6 @@ gtk_column_view_sorter_remove_column (GtkColumnViewSorter *self,
       g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PRIMARY_SORT_ORDER]);
 
       gtk_sorter_changed (GTK_SORTER (self), GTK_SORTER_CHANGE_DIFFERENT);
-      gtk_column_view_column_notify_sort (column);
       return TRUE;
     }
 
@@ -397,8 +391,6 @@ gtk_column_view_sorter_set_column (GtkColumnViewSorter *self,
 
   gtk_sorter_changed (GTK_SORTER (self), GTK_SORTER_CHANGE_DIFFERENT);
 
-  gtk_column_view_column_notify_sort (column);
-
   g_object_unref (column);
 
   return TRUE;
@@ -428,8 +420,6 @@ gtk_column_view_sorter_clear (GtkColumnViewSorter *self)
 
   gtk_sorter_changed (GTK_SORTER (self), GTK_SORTER_CHANGE_DIFFERENT);
 
-  gtk_column_view_column_notify_sort (column);
-
   g_object_unref (column);
 }
 
diff --git a/gtk/gtkcolumnviewtitle.c b/gtk/gtkcolumnviewtitle.c
index cb75bc1d74..c33a064acf 100644
--- a/gtk/gtkcolumnviewtitle.c
+++ b/gtk/gtkcolumnviewtitle.c
@@ -40,6 +40,7 @@ struct _GtkColumnViewTitle
   GtkWidget parent_instance;
 
   GtkColumnViewColumn *column;
+  GtkColumnViewSorter *sorter;
 
   GtkWidget *box;
   GtkWidget *title;
@@ -147,6 +148,9 @@ gtk_column_view_title_size_allocate (GtkWidget *widget,
     gtk_popover_present (GTK_POPOVER (self->popup_menu));
 }
 
+static void update_cb      (GtkColumnViewTitle *self);
+static void update_view_cb (GtkColumnViewTitle *self);
+
 static void
 gtk_column_view_title_dispose (GObject *object)
 {
@@ -155,6 +159,13 @@ gtk_column_view_title_dispose (GObject *object)
   g_clear_pointer (&self->box, gtk_widget_unparent);
   g_clear_pointer (&self->popup_menu, gtk_widget_unparent);
 
+  if (self->sorter)
+    g_signal_handlers_disconnect_by_func (self->sorter, G_CALLBACK (update_cb), self);
+
+  g_signal_handlers_disconnect_by_func (self->column, G_CALLBACK (update_cb), self);
+  g_signal_handlers_disconnect_by_func (self->column, G_CALLBACK (update_view_cb), self);
+
+  g_clear_object (&self->sorter);
   g_clear_object (&self->column);
 
   G_OBJECT_CLASS (gtk_column_view_title_parent_class)->dispose (object);
@@ -275,45 +286,28 @@ gtk_column_view_title_init (GtkColumnViewTitle *self)
   gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture));
 }
 
-GtkWidget *
-gtk_column_view_title_new (GtkColumnViewColumn *column)
-{
-  GtkColumnViewTitle *title;
-
-  title = g_object_new (GTK_TYPE_COLUMN_VIEW_TITLE, NULL);
-
-  title->column = g_object_ref (column);
-  gtk_column_view_title_update (title);
-
-  return GTK_WIDGET (title);
-}
-
-void
-gtk_column_view_title_update (GtkColumnViewTitle *self)
+static void
+update_cb (GtkColumnViewTitle *self)
 {
-  GtkSorter *sorter;
-  GtkColumnView *view;
-  GtkColumnViewSorter *view_sorter;
-  gboolean inverted;
-  GtkColumnViewColumn *active;
-
   gtk_label_set_label (GTK_LABEL (self->title), gtk_column_view_column_get_title (self->column));
 
-  sorter = gtk_column_view_column_get_sorter (self->column);
-
-  if (sorter)
+  if (gtk_column_view_column_get_sorter (self->column))
     {
-      view = gtk_column_view_column_get_column_view (self->column);
-      view_sorter = GTK_COLUMN_VIEW_SORTER (gtk_column_view_get_sorter (view));
-      active = gtk_column_view_sorter_get_sort_column (view_sorter, &inverted);
+      GtkColumnViewColumn *primary;
+      GtkSortType sort_order;
+
+      primary = gtk_column_view_sorter_get_primary_sort_column (self->sorter);
+      sort_order = gtk_column_view_sorter_get_primary_sort_order (self->sorter);
 
       gtk_widget_show (self->sort);
+
       gtk_widget_remove_css_class (self->sort, "ascending");
       gtk_widget_remove_css_class (self->sort, "descending");
       gtk_widget_remove_css_class (self->sort, "unsorted");
-      if (self->column != active)
+
+      if (self->column != primary)
         gtk_widget_add_css_class (self->sort, "unsorted");
-      else if (inverted)
+      else if (sort_order == GTK_SORT_DESCENDING)
         gtk_widget_add_css_class (self->sort, "descending");
       else
         gtk_widget_add_css_class (self->sort, "ascending");
@@ -324,6 +318,49 @@ gtk_column_view_title_update (GtkColumnViewTitle *self)
   g_clear_pointer (&self->popup_menu, gtk_widget_unparent);
 }
 
+static void
+update_view_cb (GtkColumnViewTitle *self)
+{
+  GtkColumnView *view;
+
+  if (self->sorter)
+    g_signal_handlers_disconnect_by_func (self->sorter, G_CALLBACK (update_cb), self);
+
+  view = gtk_column_view_column_get_column_view (self->column);
+  if (view)
+    {
+      GtkSorter *sorter = gtk_column_view_get_sorter (view);
+
+      g_signal_connect_swapped (sorter, "notify::primary-sort-column", G_CALLBACK (update_cb), self);
+      g_signal_connect_swapped (sorter, "notify::primary-sort-order", G_CALLBACK (update_cb), self);
+
+      g_set_object (&self->sorter, GTK_COLUMN_VIEW_SORTER (sorter));
+    }
+  else
+    {
+      g_clear_object (&self->sorter);
+    }
+}
+
+GtkWidget *
+gtk_column_view_title_new (GtkColumnViewColumn *column)
+{
+  GtkColumnViewTitle *self;
+
+  self = g_object_new (GTK_TYPE_COLUMN_VIEW_TITLE, NULL);
+
+  self->column = g_object_ref (column);
+
+  g_signal_connect_swapped (column, "notify::column-view", G_CALLBACK (update_view_cb), self);
+  g_signal_connect_swapped (column, "notify::title", G_CALLBACK (update_cb), self);
+  g_signal_connect_swapped (column, "notify::header-menu", G_CALLBACK (update_cb), self);
+
+  update_view_cb (self);
+  update_cb (self);
+
+  return GTK_WIDGET (self);
+}
+
 GtkColumnViewColumn *
 gtk_column_view_title_get_column (GtkColumnViewTitle *self)
 {
diff --git a/gtk/gtkcolumnviewtitleprivate.h b/gtk/gtkcolumnviewtitleprivate.h
index 84bc6a4050..59c103294e 100644
--- a/gtk/gtkcolumnviewtitleprivate.h
+++ b/gtk/gtkcolumnviewtitleprivate.h
@@ -38,8 +38,6 @@ GType                   gtk_column_view_title_get_type          (void) G_GNUC_CO
 
 GtkWidget *             gtk_column_view_title_new               (GtkColumnViewColumn    *column);
 
-void                    gtk_column_view_title_update            (GtkColumnViewTitle     *self);
-
 GtkColumnViewColumn *   gtk_column_view_title_get_column        (GtkColumnViewTitle     *self);
 
 G_END_DECLS


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