summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkcolumnview.c16
-rw-r--r--gtk/gtkgridview.c17
-rw-r--r--gtk/gtklistbase.c11
-rw-r--r--gtk/gtklistbaseprivate.h4
-rw-r--r--gtk/gtklistitemmanager.c21
-rw-r--r--gtk/gtklistitemmanagerprivate.h6
-rw-r--r--gtk/gtklistview.c17
7 files changed, 64 insertions, 28 deletions
diff --git a/gtk/gtkcolumnview.c b/gtk/gtkcolumnview.c
index 33fe678c8e..6f6ef5c7d7 100644
--- a/gtk/gtkcolumnview.c
+++ b/gtk/gtkcolumnview.c
@@ -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);
diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c
index 76f2e26e00..b03076bb8f 100644
--- a/gtk/gtkgridview.c
+++ b/gtk/gtkgridview.c
@@ -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;
diff --git a/gtk/gtklistbase.c b/gtk/gtklistbase.c
index a9d6700bf1..a5d85aabb7 100644
--- a/gtk/gtklistbase.c
+++ b/gtk/gtklistbase.c
@@ -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;
diff --git a/gtk/gtklistbaseprivate.h b/gtk/gtklistbaseprivate.h
index c4d436308d..9ee30b79b4 100644
--- a/gtk/gtklistbaseprivate.h
+++ b/gtk/gtklistbaseprivate.h
@@ -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,
diff --git a/gtk/gtklistitemmanager.c b/gtk/gtklistitemmanager.c
index 9f671b6168..2d83b24b9a 100644
--- a/gtk/gtklistitemmanager.c
+++ b/gtk/gtklistitemmanager.c
@@ -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);
}
diff --git a/gtk/gtklistitemmanagerprivate.h b/gtk/gtklistitemmanagerprivate.h
index bd49838db9..02578c5c5b 100644
--- a/gtk/gtklistitemmanagerprivate.h
+++ b/gtk/gtklistitemmanagerprivate.h
@@ -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);
diff --git a/gtk/gtklistview.c b/gtk/gtklistview.c
index f822c53529..ae8322755b 100644
--- a/gtk/gtklistview.c
+++ b/gtk/gtklistview.c
@@ -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;