[gtk/columnview-sorter-api: 5/5] columnview: Clean up interactions
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/columnview-sorter-api: 5/5] columnview: Clean up interactions
- Date: Thu, 20 Oct 2022 17:02:19 +0000 (UTC)
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]