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).
This commit is contained in:
@@ -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
|
||||
@@ -1036,7 +1065,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);
|
||||
}
|
||||
@@ -1576,6 +1605,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;
|
||||
@@ -1777,39 +1810,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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user