listitemmanager: Create widgets via vfunc
authorBenjamin Otte <otte@redhat.com>
Sun, 12 Mar 2023 17:36:57 +0000 (18:36 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 23 Mar 2023 03:45:03 +0000 (04:45 +0100)
We now have listitemmanager just create GtkListItemBase objects via
vfunc and use them.

gtk/gtkcolumnview.c
gtk/gtkgridview.c
gtk/gtklistbase.c
gtk/gtklistbaseprivate.h
gtk/gtklistitemmanager.c
gtk/gtklistitemmanagerprivate.h
gtk/gtklistview.c

index 33fe678c8e460c16f2b420d028e61befd4e63d4b..6f6ef5c7d7bb2a53b338b875424140d2f8e01584 100644 (file)
@@ -136,14 +136,26 @@ gtk_column_list_view_init (GtkColumnListView *view)
 {
 }
 
+static GtkListItemBase *
+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),
+                                     "row",
+                                     GTK_ACCESSIBLE_ROLE_ROW);
+
+  return GTK_LIST_ITEM_BASE (result);
+}
+
 static void
 gtk_column_list_view_class_init (GtkColumnListViewClass *klass)
 {
   GtkListBaseClass *list_base_class = GTK_LIST_BASE_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  list_base_class->list_item_name = "row";
-  list_base_class->list_item_role = GTK_ACCESSIBLE_ROLE_ROW;
+  list_base_class->create_list_widget = gtk_column_list_view_create_list_widget;
 
   gtk_widget_class_set_css_name (widget_class, I_("listview"));
   gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_LIST);
index 76f2e26e002c61d8d95b0c345f72ed088f0fef96..b03076bb8fd9ce54335e22d29d36ad7922d7ad1a 100644 (file)
@@ -25,6 +25,7 @@
 #include "gtklistbaseprivate.h"
 #include "gtklistitemfactory.h"
 #include "gtklistitemmanagerprivate.h"
+#include "gtklistitemwidgetprivate.h"
 #include "gtkmain.h"
 #include "gtkprivate.h"
 #include "gtksingleselection.h"
@@ -255,6 +256,19 @@ gtk_grid_view_split (GtkListBase *base,
   return split;
 }
 
+static GtkListItemBase *
+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),
+                                     "child",
+                                     GTK_ACCESSIBLE_ROLE_GRID_CELL);
+
+  return GTK_LIST_ITEM_BASE (result);
+}
+
 static gboolean
 gtk_grid_view_get_allocation (GtkListBase  *base,
                               guint         pos,
@@ -954,9 +968,8 @@ gtk_grid_view_class_init (GtkGridViewClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 
-  list_base_class->list_item_name = "child";
-  list_base_class->list_item_role = GTK_ACCESSIBLE_ROLE_GRID_CELL;
   list_base_class->split = gtk_grid_view_split;
+  list_base_class->create_list_widget = gtk_grid_view_create_list_widget;
   list_base_class->get_allocation = gtk_grid_view_get_allocation;
   list_base_class->get_items_in_rect = gtk_grid_view_get_items_in_rect;
   list_base_class->get_position_from_allocation = gtk_grid_view_get_position_from_allocation;
index a9d6700bf1dca46bb2e85e83a8e8909b34a343f0..a5d85aabb767fe18bc0f4d9d537b9bac9b97e9c3 100644 (file)
@@ -1920,6 +1920,12 @@ gtk_list_base_split_func (GtkWidget   *widget,
   return GTK_LIST_BASE_GET_CLASS (widget)->split (GTK_LIST_BASE (widget), tile, n_items);
 }
 
+static GtkListItemBase *
+gtk_list_base_create_widget_func (GtkWidget *widget)
+{
+  return GTK_LIST_BASE_GET_CLASS (widget)->create_list_widget (GTK_LIST_BASE (widget));
+}
+
 static void
 gtk_list_base_init_real (GtkListBase      *self,
                          GtkListBaseClass *g_class)
@@ -1928,9 +1934,8 @@ gtk_list_base_init_real (GtkListBase      *self,
   GtkEventController *controller;
 
   priv->item_manager = gtk_list_item_manager_new (GTK_WIDGET (self),
-                                                  g_class->list_item_name,
-                                                  g_class->list_item_role,
-                                                  gtk_list_base_split_func);
+                                                  gtk_list_base_split_func,
+                                                  gtk_list_base_create_widget_func);
   priv->anchor = gtk_list_item_tracker_new (priv->item_manager);
   priv->anchor_side_along = GTK_PACK_START;
   priv->anchor_side_across = GTK_PACK_START;
index c4d436308dbea73b66a1a574a6cc4a945424f267..9ee30b79b431f52fde94464aadf66fbee52f164e 100644 (file)
@@ -34,12 +34,10 @@ struct _GtkListBaseClass
 {
   GtkWidgetClass parent_class;
 
-  const char *         list_item_name;
-  GtkAccessibleRole    list_item_role;
-
   GtkListTile *        (* split)                                (GtkListBase            *self,
                                                                  GtkListTile            *tile,
                                                                  guint                   n_items);
+  GtkListItemBase *    (* create_list_widget)                   (GtkListBase            *self);
 
   gboolean             (* get_allocation)                       (GtkListBase            *self,
                                                                  guint                   pos,
index 9f671b6168757ad8f4472dc6cf9c68ec86f65916..2d83b24b9aa905845a2a65f03ab4ba854cb71736 100644 (file)
@@ -33,13 +33,12 @@ struct _GtkListItemManager
   GtkSelectionModel *model;
   GtkListItemFactory *factory;
   gboolean single_click_activate;
-  const char *item_css_name;
-  GtkAccessibleRole item_role;
 
   GtkRbTree *items;
   GSList *trackers;
 
   GtkListTile * (* split_func) (GtkWidget *, GtkListTile *, guint);
+  GtkListItemBase * (* create_widget) (GtkWidget *);
 };
 
 struct _GtkListItemManagerClass
@@ -131,9 +130,8 @@ gtk_list_item_manager_clear_node (gpointer _tile)
 
 GtkListItemManager *
 gtk_list_item_manager_new (GtkWidget         *widget,
-                           const char        *item_css_name,
-                           GtkAccessibleRole  item_role,
-                           GtkListTile *      (* split_func) (GtkWidget *, GtkListTile *, guint))
+                           GtkListTile *      (* split_func) (GtkWidget *, GtkListTile *, guint),
+                           GtkListItemBase *  (* create_widget) (GtkWidget *))
 {
   GtkListItemManager *self;
 
@@ -143,9 +141,8 @@ gtk_list_item_manager_new (GtkWidget         *widget,
 
   /* not taking a ref because the widget refs us */
   self->widget = widget;
-  self->item_css_name = g_intern_string (item_css_name);
-  self->item_role = item_role;
   self->split_func = split_func;
+  self->create_widget = create_widget;
 
   self->items = gtk_rb_tree_new_for_size (sizeof (GtkListTile),
                                           sizeof (GtkListTileAugment),
@@ -1191,24 +1188,22 @@ gtk_list_item_manager_acquire_list_item (GtkListItemManager *self,
                                          guint               position,
                                          GtkWidget          *prev_sibling)
 {
-  GtkWidget *result;
+  GtkListItemBase *result;
   gpointer item;
   gboolean selected;
 
   g_return_val_if_fail (GTK_IS_LIST_ITEM_MANAGER (self), NULL);
   g_return_val_if_fail (prev_sibling == NULL || GTK_IS_WIDGET (prev_sibling), NULL);
 
-  result = gtk_list_item_widget_new (self->factory,
-                                     self->item_css_name,
-                                     self->item_role);
+  result = self->create_widget (self->widget);
 
   gtk_list_item_widget_set_single_click_activate (GTK_LIST_ITEM_WIDGET (result), self->single_click_activate);
 
   item = g_list_model_get_item (G_LIST_MODEL (self->model), position);
   selected = gtk_selection_model_is_selected (self->model, position);
-  gtk_list_item_base_update (GTK_LIST_ITEM_BASE (result), position, item, selected);
+  gtk_list_item_base_update (result, position, item, selected);
   g_object_unref (item);
-  gtk_widget_insert_after (result, self->widget, prev_sibling);
+  gtk_widget_insert_after (GTK_WIDGET (result), self->widget, prev_sibling);
 
   return GTK_WIDGET (result);
 }
index bd49838db9f53fd9ed7c319a99ea5fc94a3554fe..02578c5c5b087dd98732b443d6b1fe88bdf4b80a 100644 (file)
@@ -24,6 +24,7 @@
 #include "gtk/gtktypes.h"
 #include "gtk/gtkenums.h"
 
+#include "gtk/gtklistitembaseprivate.h"
 #include "gtk/gtklistitemfactory.h"
 #include "gtk/gtkrbtreeprivate.h"
 #include "gtk/gtkselectionmodel.h"
@@ -62,9 +63,8 @@ struct _GtkListTileAugment
 GType                   gtk_list_item_manager_get_type          (void) G_GNUC_CONST;
 
 GtkListItemManager *    gtk_list_item_manager_new               (GtkWidget              *widget,
-                                                                 const char             *item_css_name,
-                                                                 GtkAccessibleRole       item_role,
-                                                                 GtkListTile *           (* split_func) (GtkWidget *, GtkListTile *, guint));
+                                                                 GtkListTile *           (* split_func) (GtkWidget *, GtkListTile *, guint),
+                                                                 GtkListItemBase *       (* create_widget) (GtkWidget *));
 
 void                    gtk_list_item_manager_get_tile_bounds   (GtkListItemManager     *self,
                                                                  GdkRectangle           *out_bounds);
index f822c53529af2079d9ecb362813f0b831f14ccfd..ae8322755b4fbc79db52bc8c0b0663bf17c12fbe 100644 (file)
@@ -24,6 +24,7 @@
 #include "gtkbitset.h"
 #include "gtklistbaseprivate.h"
 #include "gtklistitemmanagerprivate.h"
+#include "gtklistitemwidgetprivate.h"
 #include "gtkmain.h"
 #include "gtkprivate.h"
 #include "gtkrbtreeprivate.h"
@@ -215,6 +216,19 @@ gtk_list_view_split (GtkListBase *base,
   return new_tile;
 }
 
+static GtkListItemBase *
+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),
+                                     "row",
+                                     GTK_ACCESSIBLE_ROLE_LIST_ITEM);
+
+  return GTK_LIST_ITEM_BASE (result);
+}
+
 static gboolean
 gtk_list_view_get_allocation (GtkListBase  *base,
                               guint         pos,
@@ -698,9 +712,8 @@ gtk_list_view_class_init (GtkListViewClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 
-  list_base_class->list_item_name = "row";
-  list_base_class->list_item_role = GTK_ACCESSIBLE_ROLE_LIST_ITEM;
   list_base_class->split = gtk_list_view_split;
+  list_base_class->create_list_widget = gtk_list_view_create_list_widget;
   list_base_class->get_allocation = gtk_list_view_get_allocation;
   list_base_class->get_items_in_rect = gtk_list_view_get_items_in_rect;
   list_base_class->get_position_from_allocation = gtk_list_view_get_position_from_allocation;