} CellAttribute;
typedef struct {
- GSList *attributes;
+ GSList *attributes;
GtkCellLayoutDataFunc func;
gpointer data;
*/
GHashTable *cell_info;
- /* The cell border decides how much space to reserve
- * around each cell for the background_area
- */
- GtkBorder cell_border;
-
/* Current path is saved as a side-effect
* of gtk_cell_area_apply_attributes() */
gchar *current_path;
enum {
PROP_0,
- PROP_CELL_MARGIN_LEFT,
- PROP_CELL_MARGIN_RIGHT,
- PROP_CELL_MARGIN_TOP,
- PROP_CELL_MARGIN_BOTTOM,
PROP_FOCUS_CELL,
PROP_EDITED_CELL,
PROP_EDIT_WIDGET
NULL,
(GDestroyNotify)g_list_free);
- priv->cell_border.left = 0;
- priv->cell_border.right = 0;
- priv->cell_border.top = 0;
- priv->cell_border.bottom = 0;
-
priv->focus_cell = NULL;
priv->edited_cell = NULL;
priv->edit_widget = NULL;
G_TYPE_STRING);
/* Properties */
- g_object_class_install_property (object_class,
- PROP_CELL_MARGIN_LEFT,
- g_param_spec_int
- ("cell-margin-left",
- P_("Margin on Left"),
- P_("Pixels of extra space on the left side of each cell"),
- 0,
- G_MAXINT16,
- 0,
- GTK_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_CELL_MARGIN_RIGHT,
- g_param_spec_int
- ("cell-margin-right",
- P_("Margin on Right"),
- P_("Pixels of extra space on the right side of each cell"),
- 0,
- G_MAXINT16,
- 0,
- GTK_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_CELL_MARGIN_TOP,
- g_param_spec_int
- ("cell-margin-top",
- P_("Margin on Top"),
- P_("Pixels of extra space on the top side of each cell"),
- 0,
- G_MAXINT16,
- 0,
- GTK_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_CELL_MARGIN_BOTTOM,
- g_param_spec_int
- ("cell-margin-bottom",
- P_("Margin on Bottom"),
- P_("Pixels of extra space on the bottom side of each cell"),
- 0,
- G_MAXINT16,
- 0,
- GTK_PARAM_READWRITE));
-
g_object_class_install_property (object_class,
PROP_FOCUS_CELL,
g_param_spec_object
gpointer data,
GDestroyNotify destroy)
{
- CellInfo *info = g_slice_new (CellInfo);
-
- info->attributes = NULL;
- info->func = func;
- info->data = data;
- info->destroy = destroy;
+ CellInfo *info = g_slice_new0 (CellInfo);
+
+ info->func = func;
+ info->data = data;
+ info->destroy = destroy;
return info;
}
switch (prop_id)
{
- case PROP_CELL_MARGIN_LEFT:
- gtk_cell_area_set_cell_margin_left (area, g_value_get_int (value));
- break;
- case PROP_CELL_MARGIN_RIGHT:
- gtk_cell_area_set_cell_margin_right (area, g_value_get_int (value));
- break;
- case PROP_CELL_MARGIN_TOP:
- gtk_cell_area_set_cell_margin_top (area, g_value_get_int (value));
- break;
- case PROP_CELL_MARGIN_BOTTOM:
- gtk_cell_area_set_cell_margin_bottom (area, g_value_get_int (value));
- break;
case PROP_FOCUS_CELL:
gtk_cell_area_set_focus_cell (area, (GtkCellRenderer *)g_value_get_object (value));
break;
switch (prop_id)
{
- case PROP_CELL_MARGIN_LEFT:
- g_value_set_int (value, priv->cell_border.left);
- break;
- case PROP_CELL_MARGIN_RIGHT:
- g_value_set_int (value, priv->cell_border.right);
- break;
- case PROP_CELL_MARGIN_TOP:
- g_value_set_int (value, priv->cell_border.top);
- break;
- case PROP_CELL_MARGIN_BOTTOM:
- g_value_set_int (value, priv->cell_border.bottom);
- break;
case PROP_FOCUS_CELL:
g_value_set_object (value, priv->focus_cell);
break;
*
* XXX Maybe have to do some rtl mode treatment here...
*/
- gtk_cell_area_inner_cell_area (area, cell_area, &inner_area);
+ gtk_cell_area_inner_cell_area (area, widget, cell_area, &inner_area);
g_object_get (renderer, "mode", &mode, NULL);
}
/*************************************************************
- * API: Margins *
+ * API: Convenience for area implementations *
*************************************************************/
-gint
-gtk_cell_area_get_cell_margin_left (GtkCellArea *area)
-{
- g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
-
- return area->priv->cell_border.left;
-}
-
-void
-gtk_cell_area_set_cell_margin_left (GtkCellArea *area,
- gint margin)
-{
- GtkCellAreaPrivate *priv;
-
- g_return_if_fail (GTK_IS_CELL_AREA (area));
-
- priv = area->priv;
-
- if (priv->cell_border.left != margin)
- {
- priv->cell_border.left = margin;
-
- g_object_notify (G_OBJECT (area), "cell-margin-left");
- }
-}
-
-gint
-gtk_cell_area_get_cell_margin_right (GtkCellArea *area)
-{
- g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
-
- return area->priv->cell_border.right;
-}
-
-void
-gtk_cell_area_set_cell_margin_right (GtkCellArea *area,
- gint margin)
-{
- GtkCellAreaPrivate *priv;
-
- g_return_if_fail (GTK_IS_CELL_AREA (area));
-
- priv = area->priv;
-
- if (priv->cell_border.right != margin)
- {
- priv->cell_border.right = margin;
-
- g_object_notify (G_OBJECT (area), "cell-margin-right");
- }
-}
-
-gint
-gtk_cell_area_get_cell_margin_top (GtkCellArea *area)
-{
- g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
-
- return area->priv->cell_border.top;
-}
-
-void
-gtk_cell_area_set_cell_margin_top (GtkCellArea *area,
- gint margin)
-{
- GtkCellAreaPrivate *priv;
-
- g_return_if_fail (GTK_IS_CELL_AREA (area));
-
- priv = area->priv;
-
- if (priv->cell_border.top != margin)
- {
- priv->cell_border.top = margin;
-
- g_object_notify (G_OBJECT (area), "cell-margin-top");
- }
-}
-
-gint
-gtk_cell_area_get_cell_margin_bottom (GtkCellArea *area)
-{
- g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
-
- return area->priv->cell_border.bottom;
-}
-
-void
-gtk_cell_area_set_cell_margin_bottom (GtkCellArea *area,
- gint margin)
-{
- GtkCellAreaPrivate *priv;
-
- g_return_if_fail (GTK_IS_CELL_AREA (area));
-
- priv = area->priv;
-
- if (priv->cell_border.bottom != margin)
- {
- priv->cell_border.bottom = margin;
-
- g_object_notify (G_OBJECT (area), "cell-margin-bottom");
- }
-}
void
gtk_cell_area_inner_cell_area (GtkCellArea *area,
+ GtkWidget *widget,
const GdkRectangle *cell_area,
GdkRectangle *inner_area)
{
- GtkCellAreaPrivate *priv;
+ gint focus_line_width;
g_return_if_fail (GTK_IS_CELL_AREA (area));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (cell_area != NULL);
g_return_if_fail (inner_area != NULL);
- priv = area->priv;
+ gtk_widget_style_get (widget, "focus-line-width", &focus_line_width, NULL);
*inner_area = *cell_area;
- inner_area->x += priv->cell_border.left;
- inner_area->width -= (priv->cell_border.left + priv->cell_border.right);
- inner_area->y += priv->cell_border.top;
- inner_area->height -= (priv->cell_border.top + priv->cell_border.bottom);
+ inner_area->x += focus_line_width;
+ inner_area->width -= focus_line_width * 2;
+ inner_area->y += focus_line_width;
+ inner_area->height -= focus_line_width * 2;
}
void
gint *natural_size)
{
GtkCellAreaPrivate *priv;
+ gint focus_line_width;
g_return_if_fail (GTK_IS_CELL_AREA (area));
g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
priv = area->priv;
+ gtk_widget_style_get (widget, "focus-line-width", &focus_line_width, NULL);
+
+ focus_line_width *= 2;
+
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
if (for_size < 0)
gtk_cell_renderer_get_preferred_width (renderer, widget, minimum_size, natural_size);
else
{
- for_size = MAX (0, for_size - (priv->cell_border.top + priv->cell_border.bottom));
+ for_size = MAX (0, for_size - focus_line_width);
gtk_cell_renderer_get_preferred_width_for_height (renderer, widget, for_size,
minimum_size, natural_size);
}
-
- *minimum_size += (priv->cell_border.left + priv->cell_border.right);
- *natural_size += (priv->cell_border.left + priv->cell_border.right);
}
else /* GTK_ORIENTATION_VERTICAL */
{
gtk_cell_renderer_get_preferred_height (renderer, widget, minimum_size, natural_size);
else
{
- for_size = MAX (0, for_size - (priv->cell_border.left + priv->cell_border.right));
+ for_size = MAX (0, for_size - focus_line_width);
gtk_cell_renderer_get_preferred_height_for_width (renderer, widget, for_size,
minimum_size, natural_size);
}
-
- *minimum_size += (priv->cell_border.top + priv->cell_border.bottom);
- *natural_size += (priv->cell_border.top + priv->cell_border.bottom);
}
+
+ *minimum_size += focus_line_width;
+ *natural_size += focus_line_width;
}
cell_area_scaffold_set_row_spacing (scaffold, value);
}
-static void
-cell_margins_changed (GtkSpinButton *spin_button,
- CellAreaScaffold *scaffold)
-{
- GtkCellArea *area = cell_area_scaffold_get_area (scaffold);
- gint value;
-
- value = (gint)gtk_spin_button_get_value (spin_button);
-
- gtk_cell_area_set_cell_margin_left (area, value);
- gtk_cell_area_set_cell_margin_right (area, value);
- gtk_cell_area_set_cell_margin_top (area, value);
- gtk_cell_area_set_cell_margin_bottom (area, value);
-
- gtk_widget_queue_resize (GTK_WIDGET (scaffold));
-}
-
-
static void
indentation_changed (GtkSpinButton *spin_button,
CellAreaScaffold *scaffold)
label = gtk_label_new ("In this example, row spacing gets devided into the background area, "
"column spacing is added between each background area, indentation is "
- "prepended space distributed to the background area, individual cell margins "
- "are also distributed to the background area for every cell.");
+ "prepended space distributed to the background area.");
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
gtk_label_set_width_chars (GTK_LABEL (label), 40);
gtk_widget_show (label);
g_signal_connect (G_OBJECT (widget), "value-changed",
G_CALLBACK (row_spacing_changed), scaffold);
- widget = gtk_spin_button_new_with_range (0, 10, 1);
- label = gtk_label_new ("Cell Margins");
- hbox = gtk_hbox_new (FALSE, 4);
- gtk_widget_show (hbox);
- gtk_widget_show (label);
- gtk_widget_show (widget);
- gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-
- g_signal_connect (G_OBJECT (widget), "value-changed",
- G_CALLBACK (cell_margins_changed), scaffold);
-
widget = gtk_spin_button_new_with_range (0, 30, 1);
label = gtk_label_new ("Intentation");
hbox = gtk_hbox_new (FALSE, 4);