From 107133ec6d6832614050c7b78fd4b1bae771bd70 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 12 Mar 2023 22:03:03 +0100 Subject: [PATCH] listview: Move ::factory out of the item manager It's a listitemwidget property, and the item manager manages the items, not the widgets. --- gtk/gtkcolumnview.c | 2 +- gtk/gtkgridview.c | 20 ++++++++++---- gtk/gtklistitemmanager.c | 47 --------------------------------- gtk/gtklistitemmanagerprivate.h | 3 --- gtk/gtklistview.c | 18 +++++++++---- gtk/gtklistviewprivate.h | 1 + 6 files changed, 30 insertions(+), 61 deletions(-) diff --git a/gtk/gtkcolumnview.c b/gtk/gtkcolumnview.c index c5eb91a364..ff325f0a5b 100644 --- a/gtk/gtkcolumnview.c +++ b/gtk/gtkcolumnview.c @@ -142,7 +142,7 @@ gtk_column_list_view_create_list_widget (GtkListBase *base) GtkListView *self = GTK_LIST_VIEW (base); GtkWidget *result; - result = gtk_list_item_widget_new (gtk_list_item_manager_get_factory (self->item_manager), + result = gtk_list_item_widget_new (self->factory, "row", GTK_ACCESSIBLE_ROLE_ROW); diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c index eb261b8a81..991b76a5be 100644 --- a/gtk/gtkgridview.c +++ b/gtk/gtkgridview.c @@ -88,6 +88,7 @@ struct _GtkGridView GtkListBase parent_instance; GtkListItemManager *item_manager; + GtkListItemFactory *factory; guint min_columns; guint max_columns; gboolean single_click_activate; @@ -263,7 +264,7 @@ gtk_grid_view_create_list_widget (GtkListBase *base) GtkGridView *self = GTK_GRID_VIEW (base); GtkWidget *result; - result = gtk_list_item_widget_new (gtk_list_item_manager_get_factory (self->item_manager), + result = gtk_list_item_widget_new (self->factory, "child", GTK_ACCESSIBLE_ROLE_GRID_CELL); @@ -877,7 +878,7 @@ gtk_grid_view_get_property (GObject *object, switch (property_id) { case PROP_FACTORY: - g_value_set_object (value, gtk_list_item_manager_get_factory (self->item_manager)); + g_value_set_object (value, self->factory); break; case PROP_MAX_COLUMNS: @@ -1202,7 +1203,7 @@ gtk_grid_view_get_factory (GtkGridView *self) { g_return_val_if_fail (GTK_IS_GRID_VIEW (self), NULL); - return gtk_list_item_manager_get_factory (self->item_manager); + return self->factory; } /** @@ -1216,13 +1217,22 @@ void gtk_grid_view_set_factory (GtkGridView *self, GtkListItemFactory *factory) { + GtkListTile *tile; + g_return_if_fail (GTK_IS_GRID_VIEW (self)); g_return_if_fail (factory == NULL || GTK_IS_LIST_ITEM_FACTORY (factory)); - if (factory == gtk_list_item_manager_get_factory (self->item_manager)) + if (!g_set_object (&self->factory, factory)) return; - gtk_list_item_manager_set_factory (self->item_manager, factory); + for (tile = gtk_list_item_manager_get_first (self->item_manager); + tile != NULL; + tile = gtk_rb_tree_node_get_next (tile)) + { + if (tile->widget) + gtk_list_item_widget_set_factory (GTK_LIST_ITEM_WIDGET (tile->widget), factory); + } + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FACTORY]); } diff --git a/gtk/gtklistitemmanager.c b/gtk/gtklistitemmanager.c index cb0d070960..8ef33b5def 100644 --- a/gtk/gtklistitemmanager.c +++ b/gtk/gtklistitemmanager.c @@ -31,7 +31,6 @@ struct _GtkListItemManager GtkWidget *widget; GtkSelectionModel *model; - GtkListItemFactory *factory; GtkRbTree *items; GSList *trackers; @@ -1063,8 +1062,6 @@ gtk_list_item_manager_dispose (GObject *object) gtk_list_item_manager_clear_model (self); - g_clear_object (&self->factory); - g_clear_pointer (&self->items, gtk_rb_tree_unref); G_OBJECT_CLASS (gtk_list_item_manager_parent_class)->dispose (object); @@ -1083,50 +1080,6 @@ gtk_list_item_manager_init (GtkListItemManager *self) { } -void -gtk_list_item_manager_set_factory (GtkListItemManager *self, - GtkListItemFactory *factory) -{ - guint n_items; - GSList *l; - - g_return_if_fail (GTK_IS_LIST_ITEM_MANAGER (self)); - g_return_if_fail (factory == NULL || GTK_IS_LIST_ITEM_FACTORY (factory)); - - if (self->factory == factory) - return; - - n_items = self->model ? g_list_model_get_n_items (G_LIST_MODEL (self->model)) : 0; - gtk_list_item_manager_remove_items (self, NULL, 0, n_items); - - g_set_object (&self->factory, factory); - - gtk_list_item_manager_add_items (self, 0, n_items); - - gtk_list_item_manager_ensure_items (self, NULL, G_MAXUINT); - - for (l = self->trackers; l; l = l->next) - { - GtkListItemTracker *tracker = l->data; - GtkListTile *tile; - - if (tracker->widget == NULL) - continue; - - tile = gtk_list_item_manager_get_nth (self, tracker->position, NULL); - g_assert (tile); - tracker->widget = GTK_LIST_ITEM_BASE (tile->widget); - } -} - -GtkListItemFactory * -gtk_list_item_manager_get_factory (GtkListItemManager *self) -{ - g_return_val_if_fail (GTK_IS_LIST_ITEM_MANAGER (self), NULL); - - return self->factory; -} - void gtk_list_item_manager_set_model (GtkListItemManager *self, GtkSelectionModel *model) diff --git a/gtk/gtklistitemmanagerprivate.h b/gtk/gtklistitemmanagerprivate.h index 74772651c9..9b5d33812c 100644 --- a/gtk/gtklistitemmanagerprivate.h +++ b/gtk/gtklistitemmanagerprivate.h @@ -101,9 +101,6 @@ GtkListTile * gtk_list_tile_split (GtkListItemMana GtkListTile * gtk_list_tile_gc (GtkListItemManager *self, GtkListTile *tile); -void gtk_list_item_manager_set_factory (GtkListItemManager *self, - GtkListItemFactory *factory); -GtkListItemFactory * gtk_list_item_manager_get_factory (GtkListItemManager *self); void gtk_list_item_manager_set_model (GtkListItemManager *self, GtkSelectionModel *model); GtkSelectionModel * gtk_list_item_manager_get_model (GtkListItemManager *self); diff --git a/gtk/gtklistview.c b/gtk/gtklistview.c index cb4e601269..eff45468f9 100644 --- a/gtk/gtklistview.c +++ b/gtk/gtklistview.c @@ -222,7 +222,7 @@ gtk_list_view_create_list_widget (GtkListBase *base) GtkListView *self = GTK_LIST_VIEW (base); GtkWidget *result; - result = gtk_list_item_widget_new (gtk_list_item_manager_get_factory (self->item_manager), + result = gtk_list_item_widget_new (self->factory, "row", GTK_ACCESSIBLE_ROLE_LIST_ITEM); @@ -628,7 +628,7 @@ gtk_list_view_get_property (GObject *object, switch (property_id) { case PROP_FACTORY: - g_value_set_object (value, gtk_list_item_manager_get_factory (self->item_manager)); + g_value_set_object (value, self->factory); break; case PROP_MODEL: @@ -927,7 +927,7 @@ gtk_list_view_get_factory (GtkListView *self) { g_return_val_if_fail (GTK_IS_LIST_VIEW (self), NULL); - return gtk_list_item_manager_get_factory (self->item_manager); + return self->factory; } /** @@ -941,13 +941,21 @@ void gtk_list_view_set_factory (GtkListView *self, GtkListItemFactory *factory) { + GtkListTile *tile; + g_return_if_fail (GTK_IS_LIST_VIEW (self)); g_return_if_fail (factory == NULL || GTK_IS_LIST_ITEM_FACTORY (factory)); - if (factory == gtk_list_item_manager_get_factory (self->item_manager)) + if (!g_set_object (&self->factory, factory)) return; - gtk_list_item_manager_set_factory (self->item_manager, factory); + for (tile = gtk_list_item_manager_get_first (self->item_manager); + tile != NULL; + tile = gtk_rb_tree_node_get_next (tile)) + { + if (tile->widget) + gtk_list_item_widget_set_factory (GTK_LIST_ITEM_WIDGET (tile->widget), factory); + } g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FACTORY]); } diff --git a/gtk/gtklistviewprivate.h b/gtk/gtklistviewprivate.h index 42aea60454..791a0818f2 100644 --- a/gtk/gtklistviewprivate.h +++ b/gtk/gtklistviewprivate.h @@ -30,6 +30,7 @@ struct _GtkListView GtkListBase parent_instance; GtkListItemManager *item_manager; + GtkListItemFactory *factory; gboolean show_separators; gboolean single_click_activate; }; -- 2.30.2