[gtk+/treeview-refactor] Implemented cell packing properties on GtkCellAreaBox
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/treeview-refactor] Implemented cell packing properties on GtkCellAreaBox
- Date: Sun, 31 Oct 2010 08:41:28 +0000 (UTC)
commit 25b00759c5a8b6928eb8545ed2b488a4872b5bc9
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Sun Oct 31 17:45:29 2010 +0900
Implemented cell packing properties on GtkCellAreaBox
gtk/gtkcellareabox.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 170 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkcellareabox.c b/gtk/gtkcellareabox.c
index 537edcc..a6a9edb 100644
--- a/gtk/gtkcellareabox.c
+++ b/gtk/gtkcellareabox.c
@@ -61,6 +61,17 @@ static void gtk_cell_area_box_render (GtkCellArea
cairo_t *cr,
const GdkRectangle *cell_area);
+static void gtk_cell_area_box_set_cell_property (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gtk_cell_area_box_get_cell_property (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+
static GtkCellAreaIter *gtk_cell_area_box_create_iter (GtkCellArea *area);
static GtkSizeRequestMode gtk_cell_area_box_get_request_mode (GtkCellArea *area);
static void gtk_cell_area_box_get_preferred_width (GtkCellArea *area,
@@ -168,14 +179,19 @@ struct _GtkCellAreaBoxPrivate
gint spacing;
};
-
-
enum {
PROP_0,
PROP_ORIENTATION,
PROP_SPACING
};
+enum {
+ CELL_PROP_0,
+ CELL_PROP_EXPAND,
+ CELL_PROP_ALIGN,
+ CELL_PROP_PACK_TYPE
+};
+
G_DEFINE_TYPE_WITH_CODE (GtkCellAreaBox, gtk_cell_area_box, GTK_TYPE_CELL_AREA,
G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
gtk_cell_area_box_cell_layout_init)
@@ -215,11 +231,13 @@ gtk_cell_area_box_class_init (GtkCellAreaBoxClass *class)
object_class->get_property = gtk_cell_area_box_get_property;
/* GtkCellAreaClass */
- area_class->add = gtk_cell_area_box_add;
- area_class->remove = gtk_cell_area_box_remove;
- area_class->forall = gtk_cell_area_box_forall;
- area_class->event = gtk_cell_area_box_event;
- area_class->render = gtk_cell_area_box_render;
+ area_class->add = gtk_cell_area_box_add;
+ area_class->remove = gtk_cell_area_box_remove;
+ area_class->forall = gtk_cell_area_box_forall;
+ area_class->event = gtk_cell_area_box_event;
+ area_class->render = gtk_cell_area_box_render;
+ area_class->set_cell_property = gtk_cell_area_box_set_cell_property;
+ area_class->get_cell_property = gtk_cell_area_box_get_cell_property;
area_class->create_iter = gtk_cell_area_box_create_iter;
area_class->get_request_mode = gtk_cell_area_box_get_request_mode;
@@ -228,6 +246,7 @@ gtk_cell_area_box_class_init (GtkCellAreaBoxClass *class)
area_class->get_preferred_height_for_width = gtk_cell_area_box_get_preferred_height_for_width;
area_class->get_preferred_width_for_height = gtk_cell_area_box_get_preferred_width_for_height;
+ /* Properties */
g_object_class_override_property (object_class, PROP_ORIENTATION, "orientation");
g_object_class_install_property (object_class,
@@ -240,6 +259,35 @@ gtk_cell_area_box_class_init (GtkCellAreaBoxClass *class)
0,
GTK_PARAM_READWRITE));
+ /* Cell Properties */
+ gtk_cell_area_class_install_cell_property (area_class,
+ CELL_PROP_EXPAND,
+ g_param_spec_boolean
+ ("expand",
+ P_("Expand"),
+ P_("Whether the cell expands"),
+ FALSE,
+ GTK_PARAM_READWRITE));
+
+ gtk_cell_area_class_install_cell_property (area_class,
+ CELL_PROP_ALIGN,
+ g_param_spec_boolean
+ ("align",
+ P_("Align"),
+ P_("Whether cell should align with adjacent rows"),
+ TRUE,
+ GTK_PARAM_READWRITE));
+
+ gtk_cell_area_class_install_cell_property (area_class,
+ CELL_PROP_PACK_TYPE,
+ g_param_spec_enum
+ ("pack-type",
+ P_("Pack Type"),
+ P_("A GtkPackType indicating whether the cell is packed with "
+ "reference to the start or end of the cell area"),
+ GTK_TYPE_PACK_TYPE, GTK_PACK_START,
+ GTK_PARAM_READWRITE));
+
g_type_class_add_private (object_class, sizeof (GtkCellAreaBoxPrivate));
}
@@ -745,6 +793,121 @@ gtk_cell_area_box_render (GtkCellArea *area,
g_slist_free (allocated_cells);
}
+static void
+gtk_cell_area_box_set_cell_property (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GtkCellAreaBox *box = GTK_CELL_AREA_BOX (area);
+ GtkCellAreaBoxPrivate *priv = box->priv;
+ GList *node;
+ CellInfo *info;
+ gboolean rebuild = FALSE;
+ gboolean flush = FALSE;
+ gboolean val;
+ GtkPackType pack_type;
+
+ node = g_list_find_custom (priv->cells, renderer,
+ (GCompareFunc)cell_info_find);
+ if (!node)
+ return;
+
+ info = node->data;
+
+ switch (prop_id)
+ {
+ case CELL_PROP_EXPAND:
+ val = g_value_get_boolean (value);
+
+ if (info->expand != val)
+ {
+ info->expand = val;
+ flush = TRUE;
+ }
+ break;
+
+ case CELL_PROP_ALIGN:
+ val = g_value_get_boolean (value);
+
+ if (info->align != val)
+ {
+ info->align = val;
+ flush = TRUE;
+ }
+ break;
+
+ case CELL_PROP_PACK_TYPE:
+ pack_type = g_value_get_enum (value);
+
+ if (info->pack != pack_type)
+ {
+ info->pack = pack_type;
+ rebuild = TRUE;
+ }
+ break;
+ default:
+ GTK_CELL_AREA_WARN_INVALID_CHILD_PROPERTY_ID (area, prop_id, pspec);
+ break;
+ }
+
+ /* Groups need to be rebuilt */
+ if (rebuild)
+ {
+ /* Reconstruct cell groups */
+ g_list_foreach (priv->groups, (GFunc)cell_group_free, NULL);
+ g_list_free (priv->groups);
+ priv->groups = construct_cell_groups (box);
+
+ /* Reinitialize groups on iters */
+ init_iter_groups (box);
+ }
+ else if (flush)
+ {
+ flush_iters (box);
+ }
+}
+
+static void
+gtk_cell_area_box_get_cell_property (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtkCellAreaBox *box = GTK_CELL_AREA_BOX (area);
+ GtkCellAreaBoxPrivate *priv = box->priv;
+ GList *node;
+ CellInfo *info;
+
+ node = g_list_find_custom (priv->cells, renderer,
+ (GCompareFunc)cell_info_find);
+ if (!node)
+ return;
+
+ info = node->data;
+
+ switch (prop_id)
+ {
+ case CELL_PROP_EXPAND:
+ g_value_set_boolean (value, info->expand);
+ break;
+
+ case CELL_PROP_ALIGN:
+ g_value_set_boolean (value, info->align);
+ break;
+
+ case CELL_PROP_PACK_TYPE:
+ g_value_set_enum (value, info->pack);
+ break;
+ default:
+ GTK_CELL_AREA_WARN_INVALID_CHILD_PROPERTY_ID (area, prop_id, pspec);
+ break;
+ }
+}
+
+
static GtkCellAreaIter *
gtk_cell_area_box_create_iter (GtkCellArea *area)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]