gtk+ r21506 - in trunk: . gtk
- From: denisw svn gnome org
- To: svn-commits-list gnome org
- Subject: gtk+ r21506 - in trunk: . gtk
- Date: Wed, 24 Sep 2008 08:04:15 +0000 (UTC)
Author: denisw
Date: Wed Sep 24 08:04:15 2008
New Revision: 21506
URL: http://svn.gnome.org/viewvc/gtk+?rev=21506&view=rev
Log:
2008-09-24 Denis Washington <denisw svn gnome org>
* gtk/gtkiconview.c: draw focus as a rectangle around the
complete item, not just the text. (Bug #38254)
Modified:
trunk/ChangeLog
trunk/gtk/gtkiconview.c
Modified: trunk/gtk/gtkiconview.c
==============================================================================
--- trunk/gtk/gtkiconview.c (original)
+++ trunk/gtk/gtkiconview.c Wed Sep 24 08:04:15 2008
@@ -46,6 +46,7 @@
#undef DEBUG_ICON_VIEW
#define SCROLL_EDGE_SIZE 15
+#define ITEM_PADDING 6
#define GTK_ICON_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ICON_VIEW, GtkIconViewPrivate))
@@ -1301,10 +1302,10 @@
/* totally ignore our child's requisition */
if (child->cell < 0)
{
- allocation.x = child->item->x;
- allocation.y = child->item->y;
- allocation.width = child->item->width;
- allocation.height = child->item->height;
+ allocation.x = child->item->x + ITEM_PADDING;
+ allocation.y = child->item->y + ITEM_PADDING;
+ allocation.width = child->item->width - ITEM_PADDING * 2;
+ allocation.height = child->item->height - ITEM_PADDING * 2;
}
else
{
@@ -1770,10 +1771,6 @@
0);
g_free (path_string);
- /* FIXME ugly special case */
- if (GTK_IS_ENTRY (editable) || GTK_IS_COMBO_BOX (editable))
- g_object_set (editable, "has-frame", TRUE, NULL);
-
/* the rest corresponds to tree_view_real_start_editing... */
icon_view->priv->edited_item = item;
icon_view->priv->editable = editable;
@@ -1965,7 +1962,7 @@
GtkIconViewCellInfo *info = NULL;
gboolean dirty = FALSE;
GtkCellRendererMode mode;
- gint cursor_cell;
+ gint cursor_cell = -1;
icon_view = GTK_ICON_VIEW (widget);
@@ -1979,18 +1976,25 @@
{
item = gtk_icon_view_get_item_at_coords (icon_view,
event->x, event->y,
- TRUE,
- &info);
- if (item != NULL)
+ FALSE,
+ &info);
+
+ /*
+ * We consider only the the cells' area as the item area if the
+ * item is not selected, but if it *is* selected, the complete
+ * selection rectangle is considered to be part of the item.
+ */
+ if (item != NULL && (info != NULL || item->selected))
{
- g_object_get (info->cell, "mode", &mode, NULL);
-
- if (mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE ||
- mode == GTK_CELL_RENDERER_MODE_EDITABLE)
- cursor_cell = g_list_index (icon_view->priv->cell_list, info);
- else
- cursor_cell = -1;
-
+ if (info != NULL)
+ {
+ g_object_get (info->cell, "mode", &mode, NULL);
+
+ if (mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE ||
+ mode == GTK_CELL_RENDERER_MODE_EDITABLE)
+ cursor_cell = g_list_index (icon_view->priv->cell_list, info);
+ }
+
gtk_icon_view_scroll_to_item (icon_view, item);
if (icon_view->priv->selection_mode == GTK_SELECTION_NONE)
@@ -2049,13 +2053,16 @@
/* cancel the current editing, if it exists */
gtk_icon_view_stop_editing (icon_view, TRUE);
-
- if (mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE)
- gtk_icon_view_item_activate_cell (icon_view, item, info,
- (GdkEvent *)event);
- else if (mode == GTK_CELL_RENDERER_MODE_EDITABLE)
- gtk_icon_view_start_editing (icon_view, item, info,
- (GdkEvent *)event);
+
+ if (info != NULL)
+ {
+ if (mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE)
+ gtk_icon_view_item_activate_cell (icon_view, item, info,
+ (GdkEvent *)event);
+ else if (mode == GTK_CELL_RENDERER_MODE_EDITABLE)
+ gtk_icon_view_start_editing (icon_view, item, info,
+ (GdkEvent *)event);
+ }
}
else
{
@@ -2075,7 +2082,7 @@
{
item = gtk_icon_view_get_item_at_coords (icon_view,
event->x, event->y,
- TRUE,
+ FALSE,
NULL);
if (item && item == icon_view->priv->last_single_clicked)
@@ -2726,16 +2733,16 @@
if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
cell_area->x = item->box[info->position].x - item->before[info->position];
- cell_area->y = item->y;
+ cell_area->y = item->y + ITEM_PADDING;
cell_area->width = item->box[info->position].width +
item->before[info->position] + item->after[info->position];
- cell_area->height = item->height;
+ cell_area->height = item->height - ITEM_PADDING * 2;
}
else
{
- cell_area->x = item->x;
+ cell_area->x = item->x + ITEM_PADDING;
cell_area->y = item->box[info->position].y - item->before[info->position];
- cell_area->width = item->width;
+ cell_area->width = item->width - ITEM_PADDING * 2;
cell_area->height = item->box[info->position].height +
item->before[info->position] + item->after[info->position];
}
@@ -2796,6 +2803,8 @@
else
wrap_width = item_width - pixbuf_width - icon_view->priv->spacing;
+ wrap_width -= ITEM_PADDING * 2;
+
g_object_set (text_info->cell, "wrap-width", wrap_width, NULL);
g_object_set (text_info->cell, "width", wrap_width, NULL);
}
@@ -2854,6 +2863,9 @@
item->height += item->box[info->position].height + (info->position > 0 ? spacing : 0);
}
}
+
+ item->width += ITEM_PADDING * 2;
+ item->height += ITEM_PADDING * 2;
}
static void
@@ -2882,8 +2894,8 @@
item->height += max_height[i] + (i > 0 ? spacing : 0);
}
- cell_area.x = item->x;
- cell_area.y = item->y;
+ cell_area.x = item->x + ITEM_PADDING;
+ cell_area.y = item->y + ITEM_PADDING;
for (k = 0; k < 2; k++)
for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++)
@@ -2898,12 +2910,19 @@
if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
+ /* We should not subtract ITEM_PADDING from item->height,
+ * because item->height is recalculated above using
+ * max_height which does not contain item padding.
+ */
cell_area.width = item->box[info->position].width;
cell_area.height = item->height;
}
else
{
- cell_area.width = item->width;
+ /* item->width is not recalculated and thus needs to be
+ * corrected for the padding.
+ */
+ cell_area.width = item->width - 2 * ITEM_PADDING;
cell_area.height = max_height[i];
}
@@ -2922,9 +2941,9 @@
}
else
{
- if (item->box[info->position].width > item->width)
+ if (item->box[info->position].width > item->width - ITEM_PADDING * 2)
{
- item->width = item->box[info->position].width;
+ item->width = item->box[info->position].width + ITEM_PADDING * 2;
cell_area.width = item->width;
}
item->before[info->position] = item->box[info->position].y - cell_area.y;
@@ -2940,7 +2959,9 @@
item->box[i].x = item->x + item->width -
(item->box[i].x + item->box[i].width - item->x);
}
- }
+ }
+
+ item->height += ITEM_PADDING * 2;
}
static void
@@ -3009,28 +3030,17 @@
#endif
if (item->selected)
- for (l = icon_view->priv->cell_list; l; l = l->next)
- {
- GtkIconViewCellInfo *info = (GtkIconViewCellInfo *)l->data;
-
- if (!info->cell->visible)
- continue;
-
- gtk_icon_view_get_cell_box (icon_view, item, info, &box);
-
- /* FIXME we hardwire background drawing behind text
- * cell renderers here
- */
- if (GTK_IS_CELL_RENDERER_TEXT (info->cell))
- {
- gdk_cairo_set_source_color (cr, >K_WIDGET (icon_view)->style->base[state]);
- cairo_rectangle (cr,
- x - item->x + box.x,
- y - item->y + box.y,
- box.width, box.height);
- cairo_fill (cr);
- }
- }
+ {
+ gtk_paint_flat_box (GTK_WIDGET (icon_view)->style,
+ (GdkWindow *) drawable,
+ GTK_STATE_SELECTED,
+ GTK_SHADOW_NONE,
+ area,
+ GTK_WIDGET (icon_view),
+ "icon_view_item",
+ x, y,
+ item->width, item->height);
+ }
for (l = icon_view->priv->cell_list; l; l = l->next)
{
@@ -3066,42 +3076,57 @@
drawable,
GTK_WIDGET (icon_view),
&cell_area, &cell_area, area, flags);
-
}
- /* FIXME where to draw the focus with generic cell renderers ? */
- if (draw_focus &&
+ if (draw_focus &&
GTK_WIDGET_HAS_FOCUS (icon_view) &&
item == icon_view->priv->cursor_item)
- for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++)
- {
- GtkIconViewCellInfo *info = (GtkIconViewCellInfo *)l->data;
-
- if (!info->cell->visible)
- continue;
-
- if (icon_view->priv->cursor_cell < 0 &&
- (info->cell->mode != GTK_CELL_RENDERER_MODE_INERT ||
- GTK_IS_CELL_RENDERER_TEXT (info->cell)))
- icon_view->priv->cursor_cell = i;
-
- if (i == icon_view->priv->cursor_cell)
- {
- gtk_icon_view_get_cell_box (icon_view, item, info, &box);
+ {
+ for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++)
+ {
+ GtkIconViewCellInfo *info = (GtkIconViewCellInfo *)l->data;
- gtk_paint_focus (GTK_WIDGET (icon_view)->style,
- drawable,
- GTK_STATE_NORMAL,
- area,
- GTK_WIDGET (icon_view),
- "icon_view",
- x - item->x + box.x - padding,
- y - item->y + box.y - padding,
- box.width + 2 * padding,
- box.height + 2 * padding);
- break;
- }
- }
+ if (!info->cell->visible)
+ continue;
+
+ /* If found a editable/activatable cell, draw focus on it. */
+ if (icon_view->priv->cursor_cell < 0 &&
+ info->cell->mode != GTK_CELL_RENDERER_MODE_INERT)
+ icon_view->priv->cursor_cell = i;
+
+ gtk_icon_view_get_cell_box (icon_view, item, info, &box);
+
+ if (i == icon_view->priv->cursor_cell)
+ {
+ gtk_paint_focus (GTK_WIDGET (icon_view)->style,
+ drawable,
+ GTK_STATE_NORMAL,
+ area,
+ GTK_WIDGET (icon_view),
+ "icon_view",
+ x - item->x + box.x - padding,
+ y - item->y + box.y - padding,
+ box.width + 2 * padding,
+ box.height + 2 * padding);
+ break;
+ }
+ }
+
+ /* If there are no editable/activatable cells, draw focus
+ * around the whole item.
+ */
+ if (icon_view->priv->cursor_cell < 0)
+ gtk_paint_focus (GTK_WIDGET (icon_view)->style,
+ drawable,
+ GTK_STATE_NORMAL,
+ area,
+ GTK_WIDGET (icon_view),
+ "icon_view",
+ x - padding,
+ y - padding,
+ item->width + 2 * padding,
+ item->height + 2 * padding);
+ }
}
static void
@@ -3724,7 +3749,6 @@
{
gint n_focusable;
gint *focusable;
- gint first_text;
gint current;
gint i, k;
GList *l;
@@ -3737,7 +3761,6 @@
focusable = g_new0 (gint, icon_view->priv->n_cells);
n_focusable = 0;
- first_text = 0;
current = 0;
for (k = 0; k < 2; k++)
for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++)
@@ -3749,9 +3772,6 @@
if (!info->cell->visible)
continue;
-
- if (GTK_IS_CELL_RENDERER_TEXT (info->cell))
- first_text = i;
if (info->cell->mode != GTK_CELL_RENDERER_MODE_INERT)
{
@@ -3765,7 +3785,10 @@
}
if (n_focusable == 0)
- focusable[n_focusable++] = first_text;
+ {
+ g_free (focusable);
+ return -1;
+ }
if (cell < 0)
{
@@ -5349,13 +5372,11 @@
if (icon_view->priv->orientation == GTK_ORIENTATION_VERTICAL)
g_object_set (info->cell,
- "follow-state", TRUE,
"xalign", 0.5,
"yalign", 1.0,
NULL);
else
g_object_set (info->cell,
- "follow-state", TRUE,
"xalign", 0.0,
"yalign", 0.0,
NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]