Implemented cell packing properties on GtkCellAreaBox

This commit is contained in:
Tristan Van Berkom 2010-10-31 17:45:29 +09:00
parent 01d2eddf03
commit 25b00759c5

View File

@ -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)
{