GdkRectangle edit_rect;
gulong editing_started_id;
gulong remove_editable_id;
+
+
+ gint row_spacing;
+ gint indent;
};
enum {
static guint scaffold_signals[N_SIGNALS] = { 0 };
-#define ROW_SPACING 2
-
#define DIRECTION_STR(dir) \
((dir) == GTK_DIR_TAB_FORWARD ? "tab forward" : \
(dir) == GTK_DIR_TAB_BACKWARD ? "tab backward" : \
priv->remove_editable_id =
g_signal_connect (priv->area, "remove-editable",
G_CALLBACK (remove_editable_cb), scaffold);
-
-
}
static void
GtkOrientation orientation;
GtkTreeIter iter;
gboolean valid;
+ GdkRectangle background_area;
GdkRectangle render_area;
GtkAllocation allocation;
gint i = 0;
render_area.width = allocation.width;
render_area.height = allocation.height;
+ background_area = render_area;
+
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ render_area.x = priv->indent;
+ render_area.width -= priv->indent;
+ }
+ else
+ {
+ render_area.y = priv->indent;
+ render_area.height -= priv->indent;
+ }
+
valid = gtk_tree_model_get_iter_first (priv->model, &iter);
while (valid)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
- render_area.height = data->size;
+ render_area.height = data->size;
+
+ background_area.height = render_area.height;
+ background_area.y = render_area.y;
+
+ if (i == 0)
+ {
+ background_area.height += priv->row_spacing / 2;
+ background_area.height += priv->row_spacing % 2;
+ }
+ else if (i == priv->row_data->len - 1)
+ {
+ background_area.y -= priv->row_spacing / 2;
+ background_area.height += priv->row_spacing / 2;
+ }
+ else
+ {
+ background_area.y -= priv->row_spacing / 2;
+ background_area.height += priv->row_spacing;
+ }
}
- else
+ else /* GTK_ORIENTATION_VERTICAL */
{
- render_area.width = data->size;
+ render_area.width = data->size;
+
+ background_area.width = render_area.height;
+ background_area.x = render_area.x;
+
+ if (i == 0)
+ {
+ background_area.width += priv->row_spacing / 2;
+ background_area.width += priv->row_spacing % 2;
+ }
+ else if (i == priv->row_data->len - 1)
+ {
+ background_area.x -= priv->row_spacing / 2;
+ background_area.width += priv->row_spacing / 2;
+ }
+ else
+ {
+ background_area.x -= priv->row_spacing / 2;
+ background_area.width += priv->row_spacing;
+ }
}
gtk_cell_area_apply_attributes (priv->area, priv->model, &iter, FALSE, FALSE);
gtk_cell_area_render (priv->area, priv->iter, widget, cr,
- &render_area, &render_area, flags,
+ &background_area, &render_area, flags,
(have_focus && i == priv->focus_row));
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
render_area.y += data->size;
- render_area.y += ROW_SPACING;
+ render_area.y += priv->row_spacing;
}
else
{
render_area.x += data->size;
- render_area.x += ROW_SPACING;
+ render_area.x += priv->row_spacing;
}
i++;
request_all_base (scaffold);
gtk_cell_area_iter_get_preferred_width (priv->iter, minimum_size, natural_size);
+
+ *minimum_size += priv->indent;
+ *natural_size += priv->indent;
}
else
{
memset (request_array->data, 0x0, n_rows * sizeof (RowData));
/* Gather each contextual size into the request array */
- get_row_sizes (scaffold, request_array, for_size);
+ get_row_sizes (scaffold, request_array, for_size - priv->indent);
/* Sum up the size and add some row spacing */
for (i = 0; i < n_rows; i++)
full_size += data->size;
}
- full_size += MAX (0, n_rows -1) * ROW_SPACING;
+ full_size += MAX (0, n_rows -1) * priv->row_spacing;
g_array_free (request_array, TRUE);
request_all_base (scaffold);
gtk_cell_area_iter_get_preferred_height (priv->iter, minimum_size, natural_size);
+
+ *minimum_size += priv->indent;
+ *natural_size += priv->indent;
}
else
{
memset (request_array->data, 0x0, n_rows * sizeof (RowData));
/* Gather each contextual size into the request array */
- get_row_sizes (scaffold, request_array, for_size);
+ get_row_sizes (scaffold, request_array, for_size - priv->indent);
/* Sum up the size and add some row spacing */
for (i = 0; i < n_rows; i++)
full_size += data->size;
}
- full_size += MAX (0, n_rows -1) * ROW_SPACING;
+ full_size += MAX (0, n_rows -1) * priv->row_spacing;
g_array_free (request_array, TRUE);
event_area.width = allocation.width;
event_area.height = allocation.height;
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ event_area.x = priv->indent;
+ event_area.width -= priv->indent;
+ }
+ else
+ {
+ event_area.y = priv->indent;
+ event_area.height -= priv->indent;
+ }
+
valid = gtk_tree_model_get_iter_first (priv->model, &iter);
while (valid)
{
}
event_area.y += data->size;
- event_area.y += ROW_SPACING;
+ event_area.y += priv->row_spacing;
}
else
{
}
event_area.x += data->size;
- event_area.x += ROW_SPACING;
+ event_area.x += priv->row_spacing;
}
i++;
cell_area.width = allocation.width;
cell_area.height = allocation.height;
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ cell_area.x = priv->indent;
+ cell_area.width -= priv->indent;
+ }
+ else
+ {
+ cell_area.y = priv->indent;
+ cell_area.height -= priv->indent;
+ }
+
valid = gtk_tree_model_get_iter_first (priv->model, &iter);
while (valid)
{
}
if (orientation == GTK_ORIENTATION_HORIZONTAL)
- cell_area.y += data->size + ROW_SPACING;
+ cell_area.y += data->size + priv->row_spacing;
else
- cell_area.x += data->size + ROW_SPACING;
+ cell_area.x += data->size + priv->row_spacing;
i++;
valid = gtk_tree_model_iter_next (priv->model, &iter);
return priv->model;
}
+
+
+void
+cell_area_scaffold_set_row_spacing (CellAreaScaffold *scaffold,
+ gint spacing)
+{
+ CellAreaScaffoldPrivate *priv;
+
+ g_return_if_fail (IS_CELL_AREA_SCAFFOLD (scaffold));
+
+ priv = scaffold->priv;
+
+ if (priv->row_spacing != spacing)
+ {
+ priv->row_spacing = spacing;
+ gtk_widget_queue_resize (GTK_WIDGET (scaffold));
+ }
+}
+
+gint
+cell_area_scaffold_get_row_spacing (CellAreaScaffold *scaffold)
+{
+ CellAreaScaffoldPrivate *priv;
+
+ g_return_val_if_fail (IS_CELL_AREA_SCAFFOLD (scaffold), 0);
+
+ priv = scaffold->priv;
+
+ return priv->row_spacing;
+}
+
+void
+cell_area_scaffold_set_indentation (CellAreaScaffold *scaffold,
+ gint indent)
+{
+ CellAreaScaffoldPrivate *priv;
+
+ g_return_if_fail (IS_CELL_AREA_SCAFFOLD (scaffold));
+
+ priv = scaffold->priv;
+
+ if (priv->indent != indent)
+ {
+ priv->indent = indent;
+ gtk_widget_queue_resize (GTK_WIDGET (scaffold));
+ }
+}
+
+gint
+cell_area_scaffold_get_indentation (CellAreaScaffold *scaffold)
+{
+ CellAreaScaffoldPrivate *priv;
+
+ g_return_val_if_fail (IS_CELL_AREA_SCAFFOLD (scaffold), 0);
+
+ priv = scaffold->priv;
+
+ return priv->indent;
+}
+
+