[gtk/wip/otte/listview: 992/1040] listbase: Move item manager here
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/listview: 992/1040] listbase: Move item manager here
- Date: Sun, 2 Feb 2020 23:46:03 +0000 (UTC)
commit b9c9665056d67791b2277d44f63d3db10dbd7362
Author: Benjamin Otte <otte redhat com>
Date: Wed Oct 23 02:34:28 2019 +0200
listbase: Move item manager here
Nothing really changes, because both ListView and GridView still keep
self->item_manager around, but it's set up to point at the base's item
manager.
This way we can slowly move things to GtkListBase that need the item
manager (like trackers).
gtk/gtkgridview.c | 66 +++++++++++++++++++++++++-----------------------
gtk/gtklistbase.c | 26 ++++++++++++++++++-
gtk/gtklistbaseprivate.h | 8 ++++++
gtk/gtklistview.c | 19 +++++---------
4 files changed, 74 insertions(+), 45 deletions(-)
---
diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c
index f71a62ffbe..eac120a74a 100644
--- a/gtk/gtkgridview.c
+++ b/gtk/gtkgridview.c
@@ -149,6 +149,35 @@ dump (GtkGridView *self)
g_print (" => %u widgets in %u list rows\n", n_widgets, n_list_rows);
}
+static void
+cell_augment (GtkRbTree *tree,
+ gpointer node_augment,
+ gpointer node,
+ gpointer left,
+ gpointer right)
+{
+ Cell *cell = node;
+ CellAugment *aug = node_augment;
+
+ gtk_list_item_manager_augment_node (tree, node_augment, node, left, right);
+
+ aug->size = cell->size;
+
+ if (left)
+ {
+ CellAugment *left_aug = gtk_rb_tree_get_augment (tree, left);
+
+ aug->size += left_aug->size;
+ }
+
+ if (right)
+ {
+ CellAugment *right_aug = gtk_rb_tree_get_augment (tree, right);
+
+ aug->size += right_aug->size;
+ }
+}
+
/*<private>
* gtk_grid_view_get_cell_at_y:
* @self: a #GtkGridView
@@ -1059,7 +1088,7 @@ gtk_grid_view_dispose (GObject *object)
gtk_list_item_tracker_free (self->item_manager, self->focus);
self->focus = NULL;
}
- g_clear_object (&self->item_manager);
+ self->item_manager = NULL;
G_OBJECT_CLASS (gtk_grid_view_parent_class)->dispose (object);
}
@@ -1599,6 +1628,10 @@ gtk_grid_view_class_init (GtkGridViewClass *klass)
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkBindingSet *binding_set;
+ list_base_class->list_item_name = "flowboxchild";
+ list_base_class->list_item_size = sizeof (Cell);
+ list_base_class->list_item_augment_size = sizeof (CellAugment);
+ list_base_class->list_item_augment_func = cell_augment;
list_base_class->adjustment_value_changed = gtk_grid_view_adjustment_value_changed;
widget_class->focus = gtk_grid_view_focus;
@@ -1800,39 +1833,10 @@ gtk_grid_view_class_init (GtkGridViewClass *klass)
}
-static void
-cell_augment (GtkRbTree *tree,
- gpointer node_augment,
- gpointer node,
- gpointer left,
- gpointer right)
-{
- Cell *cell = node;
- CellAugment *aug = node_augment;
-
- gtk_list_item_manager_augment_node (tree, node_augment, node, left, right);
-
- aug->size = cell->size;
-
- if (left)
- {
- CellAugment *left_aug = gtk_rb_tree_get_augment (tree, left);
-
- aug->size += left_aug->size;
- }
-
- if (right)
- {
- CellAugment *right_aug = gtk_rb_tree_get_augment (tree, right);
-
- aug->size += right_aug->size;
- }
-}
-
static void
gtk_grid_view_init (GtkGridView *self)
{
- self->item_manager = gtk_list_item_manager_new (GTK_WIDGET (self), "flowboxchild", Cell, CellAugment,
cell_augment);
+ self->item_manager = gtk_list_base_get_manager (GTK_LIST_BASE (self));
self->anchor = gtk_list_item_tracker_new (self->item_manager);
self->anchor_xstart = TRUE;
self->anchor_ystart = TRUE;
diff --git a/gtk/gtklistbase.c b/gtk/gtklistbase.c
index 880b259d93..199d1519e5 100644
--- a/gtk/gtklistbase.c
+++ b/gtk/gtklistbase.c
@@ -28,6 +28,7 @@ typedef struct _GtkListBasePrivate GtkListBasePrivate;
struct _GtkListBasePrivate
{
+ GtkListItemManager *item_manager;
GtkAdjustment *adjustment[2];
GtkScrollablePolicy scroll_policy[2];
};
@@ -43,9 +44,14 @@ enum
N_PROPS
};
+/* HACK: We want the g_class argument in our instance init func and G_DEFINE_TYPE() won't let us */
+static void gtk_list_base_init_real (GtkListBase *self, GtkListBaseClass *g_class);
+#define g_type_register_static_simple(a,b,c,d,e,evil,f) g_type_register_static_simple(a,b,c,d,e,
(GInstanceInitFunc) gtk_list_base_init_real, f);
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GtkListBase, gtk_list_base, GTK_TYPE_WIDGET,
G_ADD_PRIVATE (GtkListBase)
G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE,
NULL))
+#undef g_type_register_static_simple
+G_GNUC_UNUSED static void gtk_list_base_init (GtkListBase *self) { }
static GParamSpec *properties[N_PROPS] = { NULL, };
@@ -82,10 +88,13 @@ static void
gtk_list_base_dispose (GObject *object)
{
GtkListBase *self = GTK_LIST_BASE (object);
+ GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self);
gtk_list_base_clear_adjustment (self, GTK_ORIENTATION_HORIZONTAL);
gtk_list_base_clear_adjustment (self, GTK_ORIENTATION_VERTICAL);
+ g_clear_object (&priv->item_manager);
+
G_OBJECT_CLASS (gtk_list_base_parent_class)->dispose (object);
}
@@ -228,10 +237,17 @@ gtk_list_base_class_init (GtkListBaseClass *klass)
}
static void
-gtk_list_base_init (GtkListBase *self)
+gtk_list_base_init_real (GtkListBase *self,
+ GtkListBaseClass *g_class)
{
GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self);
+ priv->item_manager = gtk_list_item_manager_new_for_size (GTK_WIDGET (self),
+ g_class->list_item_name,
+ g_class->list_item_size,
+ g_class->list_item_augment_size,
+ g_class->list_item_augment_func);
+
priv->adjustment[GTK_ORIENTATION_HORIZONTAL] = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
priv->adjustment[GTK_ORIENTATION_VERTICAL] = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
@@ -313,3 +329,11 @@ gtk_list_base_get_scroll_policy (GtkListBase *self,
return priv->scroll_policy[orientation];
}
+GtkListItemManager *
+gtk_list_base_get_manager (GtkListBase *self)
+{
+ GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self);
+
+ return priv->item_manager;
+}
+
diff --git a/gtk/gtklistbaseprivate.h b/gtk/gtklistbaseprivate.h
index 39acd980e4..4d0c668291 100644
--- a/gtk/gtklistbaseprivate.h
+++ b/gtk/gtklistbaseprivate.h
@@ -22,6 +22,8 @@
#include "gtklistbase.h"
+#include "gtklistitemmanagerprivate.h"
+
struct _GtkListBase
{
GtkWidget parent_instance;
@@ -31,10 +33,16 @@ struct _GtkListBaseClass
{
GtkWidgetClass parent_class;
+ const char * list_item_name;
+ gsize list_item_size;
+ gsize list_item_augment_size;
+ GtkRbTreeAugmentFunc list_item_augment_func;
+
void (* adjustment_value_changed) (GtkListBase *self,
GtkOrientation orientation);
};
+GtkListItemManager * gtk_list_base_get_manager (GtkListBase *self);
GtkScrollablePolicy gtk_list_base_get_scroll_policy (GtkListBase *self,
GtkOrientation orientation);
void gtk_list_base_get_adjustment_values (GtkListBase *self,
diff --git a/gtk/gtklistview.c b/gtk/gtklistview.c
index 3affde8d10..411bca0e70 100644
--- a/gtk/gtklistview.c
+++ b/gtk/gtklistview.c
@@ -792,21 +792,11 @@ gtk_list_view_dispose (GObject *object)
gtk_list_item_tracker_free (self->item_manager, self->focus);
self->focus = NULL;
}
- g_clear_object (&self->item_manager);
+ self->item_manager = NULL;
G_OBJECT_CLASS (gtk_list_view_parent_class)->dispose (object);
}
-static void
-gtk_list_view_finalize (GObject *object)
-{
- GtkListView *self = GTK_LIST_VIEW (object);
-
- g_clear_object (&self->item_manager);
-
- G_OBJECT_CLASS (gtk_list_view_parent_class)->finalize (object);
-}
-
static void
gtk_list_view_get_property (GObject *object,
guint property_id,
@@ -1322,6 +1312,10 @@ gtk_list_view_class_init (GtkListViewClass *klass)
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkBindingSet *binding_set;
+ list_base_class->list_item_name = "row";
+ list_base_class->list_item_size = sizeof (ListRow);
+ list_base_class->list_item_augment_size = sizeof (ListRowAugment);
+ list_base_class->list_item_augment_func = list_row_augment;
list_base_class->adjustment_value_changed = gtk_list_view_adjustment_value_changed;
widget_class->measure = gtk_list_view_measure;
@@ -1329,7 +1323,6 @@ gtk_list_view_class_init (GtkListViewClass *klass)
widget_class->focus = gtk_list_view_focus;
gobject_class->dispose = gtk_list_view_dispose;
- gobject_class->finalize = gtk_list_view_finalize;
gobject_class->get_property = gtk_list_view_get_property;
gobject_class->set_property = gtk_list_view_set_property;
@@ -1510,7 +1503,7 @@ gtk_list_view_class_init (GtkListViewClass *klass)
static void
gtk_list_view_init (GtkListView *self)
{
- self->item_manager = gtk_list_item_manager_new (GTK_WIDGET (self), "row", ListRow, ListRowAugment,
list_row_augment);
+ self->item_manager = gtk_list_base_get_manager (GTK_LIST_BASE (self));
self->focus = gtk_list_item_tracker_new (self->item_manager);
self->anchor = gtk_list_item_tracker_new (self->item_manager);
self->selected = gtk_list_item_tracker_new (self->item_manager);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]