Removed gtk_icon_view_get_item_area()

Now use a GdkRectangle at the begining of the GtkIconViewItem
structure and just re-cast the struct to get the item area.
This commit is contained in:
Tristan Van Berkom 2010-12-13 17:41:50 +09:00
parent d0f13ae52c
commit 6036c51d52

View File

@ -72,14 +72,15 @@
typedef struct _GtkIconViewItem GtkIconViewItem; typedef struct _GtkIconViewItem GtkIconViewItem;
struct _GtkIconViewItem struct _GtkIconViewItem
{ {
/* First member is always the rectangle so it
* can be cast to a rectangle. */
GdkRectangle cell_area;
GtkTreeIter iter; GtkTreeIter iter;
gint index; gint index;
gint row, col; gint row, col;
/* Bounding box */
gint x, y, width, height;
guint selected : 1; guint selected : 1;
guint selected_before_rubberbanding : 1; guint selected_before_rubberbanding : 1;
@ -99,7 +100,6 @@ struct _GtkIconViewPrivate
gulong add_editable_id; gulong add_editable_id;
gulong remove_editable_id; gulong remove_editable_id;
gulong focus_changed_id;
gulong context_changed_id; gulong context_changed_id;
GPtrArray *row_contexts; GPtrArray *row_contexts;
@ -138,7 +138,6 @@ struct _GtkIconViewPrivate
gint columns; gint columns;
gint item_width; gint item_width;
gint effective_item_width;
gint spacing; gint spacing;
gint row_spacing; gint row_spacing;
gint column_spacing; gint column_spacing;
@ -369,9 +368,6 @@ static GtkIconViewItem * gtk_icon_view_get_item_at_coords (GtkIco
gint y, gint y,
gboolean only_in_cell, gboolean only_in_cell,
GtkCellRenderer **cell_at_pos); GtkCellRenderer **cell_at_pos);
static void gtk_icon_view_get_cell_area (GtkIconView *icon_view,
GtkIconViewItem *item,
GdkRectangle *cell_area);
static void gtk_icon_view_set_cell_data (GtkIconView *icon_view, static void gtk_icon_view_set_cell_data (GtkIconView *icon_view,
GtkIconViewItem *item); GtkIconViewItem *item);
@ -390,10 +386,6 @@ static void gtk_icon_view_remove_editable (GtkCel
GtkCellRenderer *renderer, GtkCellRenderer *renderer,
GtkCellEditable *editable, GtkCellEditable *editable,
GtkIconView *icon_view); GtkIconView *icon_view);
static void gtk_icon_view_focus_changed (GtkCellArea *area,
GtkCellRenderer *renderer,
const gchar *path,
GtkIconView *icon_view);
/* Source side drag signals */ /* Source side drag signals */
static void gtk_icon_view_drag_begin (GtkWidget *widget, static void gtk_icon_view_drag_begin (GtkWidget *widget,
@ -1087,7 +1079,6 @@ gtk_icon_view_init (GtkIconView *icon_view)
icon_view->priv->columns = -1; icon_view->priv->columns = -1;
icon_view->priv->item_width = -1; icon_view->priv->item_width = -1;
icon_view->priv->effective_item_width = -1;
icon_view->priv->spacing = 0; icon_view->priv->spacing = 0;
icon_view->priv->row_spacing = 6; icon_view->priv->row_spacing = 6;
icon_view->priv->column_spacing = 6; icon_view->priv->column_spacing = 6;
@ -1135,9 +1126,6 @@ gtk_icon_view_constructor (GType type,
priv->remove_editable_id = priv->remove_editable_id =
g_signal_connect (priv->cell_area, "remove-editable", g_signal_connect (priv->cell_area, "remove-editable",
G_CALLBACK (gtk_icon_view_remove_editable), icon_view); G_CALLBACK (gtk_icon_view_remove_editable), icon_view);
priv->focus_changed_id =
g_signal_connect (priv->cell_area, "focus-changed",
G_CALLBACK (gtk_icon_view_focus_changed), icon_view);
return object; return object;
} }
@ -1167,10 +1155,8 @@ gtk_icon_view_dispose (GObject *object)
{ {
g_signal_handler_disconnect (priv->cell_area, priv->add_editable_id); g_signal_handler_disconnect (priv->cell_area, priv->add_editable_id);
g_signal_handler_disconnect (priv->cell_area, priv->remove_editable_id); g_signal_handler_disconnect (priv->cell_area, priv->remove_editable_id);
g_signal_handler_disconnect (priv->cell_area, priv->focus_changed_id);
priv->add_editable_id = 0; priv->add_editable_id = 0;
priv->remove_editable_id = 0; priv->remove_editable_id = 0;
priv->focus_changed_id = 0;
g_object_unref (priv->cell_area); g_object_unref (priv->cell_area);
priv->cell_area = NULL; priv->cell_area = NULL;
@ -1616,16 +1602,22 @@ gtk_icon_view_draw (GtkWidget *widget,
for (icons = icon_view->priv->items; icons; icons = icons->next) for (icons = icon_view->priv->items; icons; icons = icons->next)
{ {
GtkIconViewItem *item = icons->data; GtkIconViewItem *item = icons->data;
GdkRectangle paint_area;
paint_area.x = ((GdkRectangle *)item)->x - icon_view->priv->item_padding;
paint_area.y = ((GdkRectangle *)item)->y - icon_view->priv->item_padding;
paint_area.width = ((GdkRectangle *)item)->width + icon_view->priv->item_padding * 2;
paint_area.height = ((GdkRectangle *)item)->height + icon_view->priv->item_padding * 2;
cairo_save (cr); cairo_save (cr);
cairo_rectangle (cr, item->x, item->y, item->width, item->height); cairo_rectangle (cr, paint_area.x, paint_area.y, paint_area.width, paint_area.height);
cairo_clip (cr); cairo_clip (cr);
if (gdk_cairo_get_clip_rectangle (cr, NULL)) if (gdk_cairo_get_clip_rectangle (cr, NULL))
{ {
gtk_icon_view_paint_item (icon_view, cr, item, gtk_icon_view_paint_item (icon_view, cr, item,
item->x, item->y, ((GdkRectangle *)item)->x, ((GdkRectangle *)item)->y,
icon_view->priv->draw_focus); icon_view->priv->draw_focus);
if (dest_index == item->index) if (dest_index == item->index)
@ -1646,49 +1638,36 @@ gtk_icon_view_draw (GtkWidget *widget,
switch (dest_pos) switch (dest_pos)
{ {
case GTK_ICON_VIEW_DROP_INTO: case GTK_ICON_VIEW_DROP_INTO:
gtk_paint_focus (style, gtk_paint_focus (style, cr, state, widget,
cr, "iconview-drop-indicator",
state, dest_item->cell_area.x, dest_item->cell_area.y,
widget, dest_item->cell_area.width, dest_item->cell_area.height);
"iconview-drop-indicator",
dest_item->x, dest_item->y,
dest_item->width, dest_item->height);
break; break;
case GTK_ICON_VIEW_DROP_ABOVE: case GTK_ICON_VIEW_DROP_ABOVE:
gtk_paint_focus (style, gtk_paint_focus (style, cr, state, widget,
cr, "iconview-drop-indicator",
state, dest_item->cell_area.x, dest_item->cell_area.y - 1,
widget, dest_item->cell_area.width, 2);
"iconview-drop-indicator",
dest_item->x, dest_item->y - 1,
dest_item->width, 2);
break; break;
case GTK_ICON_VIEW_DROP_LEFT: case GTK_ICON_VIEW_DROP_LEFT:
gtk_paint_focus (style, gtk_paint_focus (style, cr, state, widget,
cr, "iconview-drop-indicator",
state, dest_item->cell_area.x - 1, dest_item->cell_area.y,
widget, 2, dest_item->cell_area.height);
"iconview-drop-indicator",
dest_item->x - 1, dest_item->y,
2, dest_item->height);
break; break;
case GTK_ICON_VIEW_DROP_BELOW: case GTK_ICON_VIEW_DROP_BELOW:
gtk_paint_focus (style, gtk_paint_focus (style, cr, state, widget,
cr, "iconview-drop-indicator",
state, dest_item->cell_area.x,
widget, dest_item->cell_area.y + dest_item->cell_area.height - 1,
"iconview-drop-indicator", dest_item->cell_area.width, 2);
dest_item->x, dest_item->y + dest_item->height - 1,
dest_item->width, 2);
break; break;
case GTK_ICON_VIEW_DROP_RIGHT: case GTK_ICON_VIEW_DROP_RIGHT:
gtk_paint_focus (style, gtk_paint_focus (style, cr, state, widget,
cr, "iconview-drop-indicator",
state, dest_item->cell_area.x + dest_item->cell_area.width - 1,
widget, dest_item->cell_area.y,
"iconview-drop-indicator", 2, dest_item->cell_area.height);
dest_item->x + dest_item->width - 1, dest_item->y,
2, dest_item->height);
case GTK_ICON_VIEW_NO_DROP: ; case GTK_ICON_VIEW_NO_DROP: ;
break; break;
} }
@ -1877,15 +1856,6 @@ gtk_icon_view_remove_editable (GtkCellArea *area,
gtk_tree_path_free (path); gtk_tree_path_free (path);
} }
static void
gtk_icon_view_focus_changed (GtkCellArea *area,
GtkCellRenderer *renderer,
const gchar *path,
GtkIconView *icon_view)
{
/* XXX Update cursor item for focus path here */
}
/** /**
* gtk_icon_view_set_cursor: * gtk_icon_view_set_cursor:
* @icon_view: A #GtkIconView * @icon_view: A #GtkIconView
@ -1931,14 +1901,13 @@ gtk_icon_view_set_cursor (GtkIconView *icon_view,
if (start_editing) if (start_editing)
{ {
GdkRectangle cell_area;
GtkCellAreaContext *context; GtkCellAreaContext *context;
context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); context = g_ptr_array_index (icon_view->priv->row_contexts, item->row);
gtk_icon_view_set_cell_data (icon_view, item); gtk_icon_view_set_cell_data (icon_view, item);
gtk_icon_view_get_cell_area (icon_view, item, &cell_area);
gtk_cell_area_activate (icon_view->priv->cell_area, context, gtk_cell_area_activate (icon_view->priv->cell_area, context,
GTK_WIDGET (icon_view), &cell_area, 0 /* XXX flags */, TRUE); GTK_WIDGET (icon_view), (GdkRectangle *)item,
0 /* XXX flags */, TRUE);
} }
} }
@ -1991,7 +1960,6 @@ gtk_icon_view_button_press (GtkWidget *widget,
GtkIconViewItem *item; GtkIconViewItem *item;
gboolean dirty = FALSE; gboolean dirty = FALSE;
GtkCellRenderer *cell = NULL, *cursor_cell = NULL; GtkCellRenderer *cell = NULL, *cursor_cell = NULL;
GdkRectangle cell_area;
icon_view = GTK_ICON_VIEW (widget); icon_view = GTK_ICON_VIEW (widget);
@ -2084,10 +2052,9 @@ gtk_icon_view_button_press (GtkWidget *widget,
context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); context = g_ptr_array_index (icon_view->priv->row_contexts, item->row);
gtk_icon_view_set_cell_data (icon_view, item); gtk_icon_view_set_cell_data (icon_view, item);
gtk_icon_view_get_cell_area (icon_view, item, &cell_area);
gtk_cell_area_activate (icon_view->priv->cell_area, context, gtk_cell_area_activate (icon_view->priv->cell_area, context,
GTK_WIDGET (icon_view), GTK_WIDGET (icon_view),
&cell_area, 0/* XXX flags */, FALSE); (GdkRectangle *)item, 0/* XXX flags */, FALSE);
} }
} }
else else
@ -2354,22 +2321,20 @@ gtk_icon_view_item_hit_test (GtkIconView *icon_view,
gint width, gint width,
gint height) gint height)
{ {
GdkRectangle cell_area;
HitTestData data = { { x, y, width, height }, FALSE }; HitTestData data = { { x, y, width, height }, FALSE };
GtkCellAreaContext *context; GtkCellAreaContext *context;
GdkRectangle *item_area = (GdkRectangle *)item;
if (MIN (x + width, item->x + item->width) - MAX (x, item->x) <= 0 || if (MIN (x + width, item_area->x + item_area->width) - MAX (x, item_area->x) <= 0 ||
MIN (y + height, item->y + item->height) - MAX (y, item->y) <= 0) MIN (y + height, item_area->y + item_area->height) - MAX (y, item_area->y) <= 0)
return FALSE; return FALSE;
context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); context = g_ptr_array_index (icon_view->priv->row_contexts, item->row);
gtk_icon_view_set_cell_data (icon_view, item); gtk_icon_view_set_cell_data (icon_view, item);
gtk_icon_view_get_cell_area (icon_view, item, &cell_area);
gtk_cell_area_foreach_alloc (icon_view->priv->cell_area, context, gtk_cell_area_foreach_alloc (icon_view->priv->cell_area, context,
GTK_WIDGET (icon_view), GTK_WIDGET (icon_view),
&cell_area, &cell_area, item_area, item_area,
(GtkCellAllocCallback)hit_test, &data); (GtkCellAllocCallback)hit_test, &data);
return data.hit; return data.hit;
@ -2427,7 +2392,6 @@ static gboolean
gtk_icon_view_real_activate_cursor_item (GtkIconView *icon_view) gtk_icon_view_real_activate_cursor_item (GtkIconView *icon_view)
{ {
GtkTreePath *path; GtkTreePath *path;
GdkRectangle cell_area;
gboolean activated; gboolean activated;
GtkCellAreaContext *context; GtkCellAreaContext *context;
@ -2437,9 +2401,10 @@ gtk_icon_view_real_activate_cursor_item (GtkIconView *icon_view)
context = g_ptr_array_index (icon_view->priv->row_contexts, icon_view->priv->cursor_item->row); context = g_ptr_array_index (icon_view->priv->row_contexts, icon_view->priv->cursor_item->row);
gtk_icon_view_set_cell_data (icon_view, icon_view->priv->cursor_item); gtk_icon_view_set_cell_data (icon_view, icon_view->priv->cursor_item);
gtk_icon_view_get_cell_area (icon_view, icon_view->priv->cursor_item, &cell_area);
activated = gtk_cell_area_activate (icon_view->priv->cell_area, context, activated = gtk_cell_area_activate (icon_view->priv->cell_area, context,
GTK_WIDGET (icon_view), &cell_area, 0 /* XXX flags */, FALSE); GTK_WIDGET (icon_view),
(GdkRectangle *)icon_view->priv->cursor_item,
0 /* XXX flags */, FALSE);
path = gtk_tree_path_new_from_indices (icon_view->priv->cursor_item->index, -1); path = gtk_tree_path_new_from_indices (icon_view->priv->cursor_item->index, -1);
gtk_icon_view_item_activated (icon_view, path); gtk_icon_view_item_activated (icon_view, path);
@ -2674,15 +2639,19 @@ gtk_icon_view_layout_single_row (GtkIconView *icon_view,
gtk_widget_get_allocation (widget, &allocation); gtk_widget_get_allocation (widget, &allocation);
context = gtk_cell_area_copy_context (priv->cell_area, priv->cell_area_context); context = gtk_cell_area_copy_context (priv->cell_area, priv->cell_area_context);
g_ptr_array_add (priv->row_contexts, context);
/* In the first loop we iterate horizontally until we hit allocation width
* and collect the aligned height-for-width */
items = first_item; items = first_item;
while (items) while (items)
{ {
GtkIconViewItem *item = items->data; GtkIconViewItem *item = items->data;
GdkRectangle *item_area = (GdkRectangle *)item;
item->width = item_width; item_area->width = item_width;
current_width += item->width; current_width += item_area->width + icon_view->priv->item_padding * 2;
if (items != first_item) if (items != first_item)
{ {
@ -2700,8 +2669,8 @@ gtk_icon_view_layout_single_row (GtkIconView *icon_view,
current_width += icon_view->priv->column_spacing; current_width += icon_view->priv->column_spacing;
item->y = *y; item_area->y = *y + icon_view->priv->item_padding;
item->x = x; item_area->x = x + icon_view->priv->item_padding;
x = current_width - icon_view->priv->margin; x = current_width - icon_view->priv->margin;
@ -2720,29 +2689,26 @@ gtk_icon_view_layout_single_row (GtkIconView *icon_view,
gtk_cell_area_context_get_preferred_height_for_width (context, item_width, &max_height, NULL); gtk_cell_area_context_get_preferred_height_for_width (context, item_width, &max_height, NULL);
gtk_cell_area_context_allocate (context, item_width, max_height); gtk_cell_area_context_allocate (context, item_width, max_height);
max_height += icon_view->priv->item_padding * 2; /* In the second loop the item height has been aligned and derived and
* we just set the height and handle rtl layout */
g_ptr_array_add (priv->row_contexts, context);
/* Now go through the row again and align the icons */
for (items = first_item; items != last_item; items = items->next) for (items = first_item; items != last_item; items = items->next)
{ {
GtkIconViewItem *item = items->data; GtkIconViewItem *item = items->data;
GdkRectangle *item_area = (GdkRectangle *)item;
if (rtl) if (rtl)
{ {
item->x = *maximum_width - item->width - item->x; item_area->x = *maximum_width - item_area->width - item_area->x;
item->col = col - 1 - item->col; item->col = col - 1 - item->col;
} }
/* All items in the same row get the same height */ /* All items in the same row get the same height */
item->height = max_height; item_area->height = max_height;
/* Adjust the new y coordinate. */
if (item->y + item->height + icon_view->priv->row_spacing > *y)
*y = item->y + item->height + icon_view->priv->row_spacing;
} }
/* Adjust the new y coordinate. */
*y += max_height + icon_view->priv->row_spacing + icon_view->priv->item_padding * 2;
return last_item; return last_item;
} }
@ -2776,13 +2742,10 @@ gtk_icon_view_layout (GtkIconView *icon_view)
/* Fetch the new item width if needed */ /* Fetch the new item width if needed */
if (item_width < 0) if (item_width < 0)
{ gtk_cell_area_context_get_preferred_width (icon_view->priv->cell_area_context,
gtk_cell_area_context_get_preferred_width (icon_view->priv->cell_area_context, &item_width, NULL);
&item_width, NULL);
item_width += icon_view->priv->item_padding * 2;
}
icon_view->priv->effective_item_width = item_width; gtk_cell_area_context_allocate (icon_view->priv->cell_area_context, item_width, -1);
icons = icon_view->priv->items; icons = icon_view->priv->items;
y += icon_view->priv->margin; y += icon_view->priv->margin;
@ -2844,17 +2807,6 @@ gtk_icon_view_layout (GtkIconView *icon_view)
gtk_widget_queue_draw (widget); gtk_widget_queue_draw (widget);
} }
static void
gtk_icon_view_get_cell_area (GtkIconView *icon_view,
GtkIconViewItem *item,
GdkRectangle *cell_area)
{
cell_area->x = item->x + icon_view->priv->item_padding;
cell_area->width = item->width - icon_view->priv->item_padding * 2;
cell_area->y = item->y + icon_view->priv->item_padding;
cell_area->height = item->height - icon_view->priv->item_padding * 2;
}
/* This ensures that all widths have been cached in the /* This ensures that all widths have been cached in the
* context and we have proper alignments to go on. * context and we have proper alignments to go on.
*/ */
@ -2868,7 +2820,7 @@ gtk_icon_view_cache_widths (GtkIconView *icon_view)
GtkIconViewItem *item = items->data; GtkIconViewItem *item = items->data;
/* Only fetch the width of items with invalidated sizes */ /* Only fetch the width of items with invalidated sizes */
if (item->width < 0) if (item->cell_area.width < 0)
{ {
gtk_icon_view_set_cell_data (icon_view, item); gtk_icon_view_set_cell_data (icon_view, item);
gtk_cell_area_get_preferred_width (icon_view->priv->cell_area, gtk_cell_area_get_preferred_width (icon_view->priv->cell_area,
@ -2888,8 +2840,8 @@ gtk_icon_view_invalidate_sizes (GtkIconView *icon_view)
static void static void
gtk_icon_view_item_invalidate_size (GtkIconViewItem *item) gtk_icon_view_item_invalidate_size (GtkIconViewItem *item)
{ {
item->width = -1; item->cell_area.width = -1;
item->height = -1; item->cell_area.height = -1;
} }
static void static void
@ -2936,14 +2888,16 @@ gtk_icon_view_paint_item (GtkIconView *icon_view,
GTK_SHADOW_NONE, GTK_SHADOW_NONE,
GTK_WIDGET (icon_view), GTK_WIDGET (icon_view),
"icon_view_item", "icon_view_item",
x, y, x - icon_view->priv->item_padding,
item->width, item->height); y - icon_view->priv->item_padding,
item->cell_area.width + icon_view->priv->item_padding * 2,
item->cell_area.height + icon_view->priv->item_padding * 2);
} }
cell_area.x = x; cell_area.x = x;
cell_area.y = y; cell_area.y = y;
cell_area.width = item->width; cell_area.width = item->cell_area.width;
cell_area.height = item->height; cell_area.height = item->cell_area.height;
if (gtk_widget_has_focus (widget) && item == icon_view->priv->cursor_item) if (gtk_widget_has_focus (widget) && item == icon_view->priv->cursor_item)
flags |= GTK_CELL_RENDERER_FOCUSED; flags |= GTK_CELL_RENDERER_FOCUSED;
@ -3019,12 +2973,13 @@ static void
gtk_icon_view_queue_draw_item (GtkIconView *icon_view, gtk_icon_view_queue_draw_item (GtkIconView *icon_view,
GtkIconViewItem *item) GtkIconViewItem *item)
{ {
GdkRectangle rect; GdkRectangle rect;
GdkRectangle *item_area = (GdkRectangle *)item;
rect.x = item->x; rect.x = item_area->x - icon_view->priv->item_padding;
rect.y = item->y; rect.y = item_area->y - icon_view->priv->item_padding;
rect.width = item->width; rect.width = item_area->width + icon_view->priv->item_padding * 2;
rect.height = item->height; rect.height = item_area->height + icon_view->priv->item_padding * 2;
if (icon_view->priv->bin_window) if (icon_view->priv->bin_window)
gdk_window_invalidate_rect (icon_view->priv->bin_window, &rect, TRUE); gdk_window_invalidate_rect (icon_view->priv->bin_window, &rect, TRUE);
@ -3104,8 +3059,8 @@ gtk_icon_view_item_new (void)
item = g_slice_new0 (GtkIconViewItem); item = g_slice_new0 (GtkIconViewItem);
item->width = -1; item->cell_area.width = -1;
item->height = -1; item->cell_area.height = -1;
return item; return item;
} }
@ -3133,27 +3088,26 @@ gtk_icon_view_get_item_at_coords (GtkIconView *icon_view,
for (items = icon_view->priv->items; items; items = items->next) for (items = icon_view->priv->items; items; items = items->next)
{ {
GtkIconViewItem *item = items->data; GtkIconViewItem *item = items->data;
GdkRectangle *item_area = (GdkRectangle *)item;
if (x >= item->x - icon_view->priv->column_spacing/2 && if (x >= item_area->x - icon_view->priv->column_spacing/2 &&
x <= item->x + item->width + icon_view->priv->column_spacing/2 && x <= item_area->x + item_area->width + icon_view->priv->column_spacing/2 &&
y >= item->y - icon_view->priv->row_spacing/2 && y >= item_area->y - icon_view->priv->row_spacing/2 &&
y <= item->y + item->height + icon_view->priv->row_spacing/2) y <= item_area->y + item_area->height + icon_view->priv->row_spacing/2)
{ {
if (only_in_cell || cell_at_pos) if (only_in_cell || cell_at_pos)
{ {
GdkRectangle cell_area;
GtkCellRenderer *cell = NULL; GtkCellRenderer *cell = NULL;
GtkCellAreaContext *context; GtkCellAreaContext *context;
context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); context = g_ptr_array_index (icon_view->priv->row_contexts, item->row);
gtk_icon_view_set_cell_data (icon_view, item); gtk_icon_view_set_cell_data (icon_view, item);
gtk_icon_view_get_cell_area (icon_view, item, &cell_area);
if (x >= cell_area.x && x <= cell_area.x + cell_area.width && if (x >= item_area->x && x <= item_area->x + item_area->width &&
y >= cell_area.y && y <= cell_area.y + cell_area.height) y >= item_area->y && y <= item_area->y + item_area->height)
cell = gtk_cell_area_get_cell_at_position (icon_view->priv->cell_area, context, cell = gtk_cell_area_get_cell_at_position (icon_view->priv->cell_area, context,
GTK_WIDGET (icon_view), GTK_WIDGET (icon_view),
&cell_area, item_area,
x, y, NULL); x, y, NULL);
if (cell_at_pos) if (cell_at_pos)
@ -3558,7 +3512,7 @@ find_item_page_up_down (GtkIconView *icon_view,
gint y, col; gint y, col;
col = current->col; col = current->col;
y = current->y + count * gtk_adjustment_get_page_size (icon_view->priv->vadjustment); y = current->cell_area.y + count * gtk_adjustment_get_page_size (icon_view->priv->vadjustment);
item = g_list_find (icon_view->priv->items, current); item = g_list_find (icon_view->priv->items, current);
if (count > 0) if (count > 0)
@ -3570,7 +3524,7 @@ find_item_page_up_down (GtkIconView *icon_view,
if (((GtkIconViewItem *)next->data)->col == col) if (((GtkIconViewItem *)next->data)->col == col)
break; break;
} }
if (!next || ((GtkIconViewItem *)next->data)->y > y) if (!next || ((GtkIconViewItem *)next->data)->cell_area.y > y)
break; break;
item = next; item = next;
@ -3585,7 +3539,7 @@ find_item_page_up_down (GtkIconView *icon_view,
if (((GtkIconViewItem *)next->data)->col == col) if (((GtkIconViewItem *)next->data)->col == col)
break; break;
} }
if (!next || ((GtkIconViewItem *)next->data)->y < y) if (!next || ((GtkIconViewItem *)next->data)->cell_area.y < y)
break; break;
item = next; item = next;
@ -3976,7 +3930,7 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view,
item = g_list_nth_data (icon_view->priv->items, item = g_list_nth_data (icon_view->priv->items,
gtk_tree_path_get_indices(path)[0]); gtk_tree_path_get_indices(path)[0]);
if (!item || item->width < 0 || if (!item || item->cell_area.width < 0 ||
!gtk_widget_get_realized (widget)) !gtk_widget_get_realized (widget))
{ {
if (icon_view->priv->scroll_to_path) if (icon_view->priv->scroll_to_path)
@ -3998,23 +3952,25 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view,
{ {
GtkAllocation allocation; GtkAllocation allocation;
gint x, y; gint x, y;
gint focus_width;
gfloat offset; gfloat offset;
GdkRectangle item_area =
gtk_widget_style_get (widget, {
"focus-line-width", &focus_width, item->cell_area.x - icon_view->priv->item_padding,
NULL); item->cell_area.y - icon_view->priv->item_padding,
item->cell_area.width + icon_view->priv->item_padding * 2,
item->cell_area.height + icon_view->priv->item_padding * 2
};
gdk_window_get_position (icon_view->priv->bin_window, &x, &y); gdk_window_get_position (icon_view->priv->bin_window, &x, &y);
gtk_widget_get_allocation (widget, &allocation); gtk_widget_get_allocation (widget, &allocation);
offset = y + item->y - focus_width - row_align * (allocation.height - item->height); offset = y + item_area.y - row_align * (allocation.height - item_area.height);
gtk_adjustment_set_value (icon_view->priv->vadjustment, gtk_adjustment_set_value (icon_view->priv->vadjustment,
gtk_adjustment_get_value (icon_view->priv->vadjustment) + offset); gtk_adjustment_get_value (icon_view->priv->vadjustment) + offset);
offset = x + item->x - focus_width - col_align * (allocation.width - item->width); offset = x + item_area.x - col_align * (allocation.width - item_area.width);
gtk_adjustment_set_value (icon_view->priv->hadjustment, gtk_adjustment_set_value (icon_view->priv->hadjustment,
gtk_adjustment_get_value (icon_view->priv->hadjustment) + offset); gtk_adjustment_get_value (icon_view->priv->hadjustment) + offset);
@ -4034,11 +3990,13 @@ gtk_icon_view_scroll_to_item (GtkIconView *icon_view,
GtkAllocation allocation; GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (icon_view); GtkWidget *widget = GTK_WIDGET (icon_view);
gint x, y, width, height; gint x, y, width, height;
gint focus_width; GdkRectangle item_area =
{
gtk_widget_style_get (widget, item->cell_area.x - icon_view->priv->item_padding,
"focus-line-width", &focus_width, item->cell_area.y - icon_view->priv->item_padding,
NULL); item->cell_area.width + icon_view->priv->item_padding * 2,
item->cell_area.height + icon_view->priv->item_padding * 2
};
width = gdk_window_get_width (icon_view->priv->bin_window); width = gdk_window_get_width (icon_view->priv->bin_window);
height = gdk_window_get_height (icon_view->priv->bin_window); height = gdk_window_get_height (icon_view->priv->bin_window);
@ -4046,21 +4004,21 @@ gtk_icon_view_scroll_to_item (GtkIconView *icon_view,
gtk_widget_get_allocation (widget, &allocation); gtk_widget_get_allocation (widget, &allocation);
if (y + item->y - focus_width < 0) if (y + item_area.y < 0)
gtk_adjustment_set_value (icon_view->priv->vadjustment, gtk_adjustment_set_value (icon_view->priv->vadjustment,
gtk_adjustment_get_value (icon_view->priv->vadjustment) + y + item->y - focus_width); gtk_adjustment_get_value (icon_view->priv->vadjustment) + y + item_area.y);
else if (y + item->y + item->height + focus_width > allocation.height) else if (y + item_area.y + item_area.height > allocation.height)
gtk_adjustment_set_value (icon_view->priv->vadjustment, gtk_adjustment_set_value (icon_view->priv->vadjustment,
gtk_adjustment_get_value (icon_view->priv->vadjustment) + y + item->y + item->height gtk_adjustment_get_value (icon_view->priv->vadjustment) + y + item_area.y +
+ focus_width - allocation.height); item_area.height - allocation.height);
if (x + item->x - focus_width < 0) if (x + item_area.x < 0)
gtk_adjustment_set_value (icon_view->priv->hadjustment, gtk_adjustment_set_value (icon_view->priv->hadjustment,
gtk_adjustment_get_value (icon_view->priv->hadjustment) + x + item->x - focus_width); gtk_adjustment_get_value (icon_view->priv->hadjustment) + x + item_area.x);
else if (x + item->x + item->width + focus_width > allocation.width) else if (x + item_area.x + item_area.width > allocation.width)
gtk_adjustment_set_value (icon_view->priv->hadjustment, gtk_adjustment_set_value (icon_view->priv->hadjustment,
gtk_adjustment_get_value (icon_view->priv->hadjustment) + x + item->x + item->width gtk_adjustment_get_value (icon_view->priv->hadjustment) + x + item_area.x +
+ focus_width - allocation.width); item_area.width - allocation.width);
gtk_adjustment_changed (icon_view->priv->hadjustment); gtk_adjustment_changed (icon_view->priv->hadjustment);
gtk_adjustment_changed (icon_view->priv->vadjustment); gtk_adjustment_changed (icon_view->priv->vadjustment);
@ -4334,22 +4292,20 @@ gtk_icon_view_set_tooltip_cell (GtkIconView *icon_view,
if (cell) if (cell)
{ {
GdkRectangle cell_area;
GtkCellAreaContext *context; GtkCellAreaContext *context;
context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); context = g_ptr_array_index (icon_view->priv->row_contexts, item->row);
gtk_icon_view_get_cell_area (icon_view, item, &cell_area);
gtk_icon_view_set_cell_data (icon_view, item); gtk_icon_view_set_cell_data (icon_view, item);
gtk_cell_area_get_cell_allocation (icon_view->priv->cell_area, context, gtk_cell_area_get_cell_allocation (icon_view->priv->cell_area, context,
GTK_WIDGET (icon_view), GTK_WIDGET (icon_view),
cell, &cell_area, &rect); cell, (GdkRectangle *)item, &rect);
} }
else else
{ {
rect.x = item->x; rect.x = item->cell_area.x - icon_view->priv->item_padding;
rect.y = item->y; rect.y = item->cell_area.y - icon_view->priv->item_padding;
rect.width = item->width; rect.width = item->cell_area.width + icon_view->priv->item_padding * 2;
rect.height = item->height; rect.height = item->cell_area.height + icon_view->priv->item_padding * 2;
} }
if (icon_view->priv->bin_window) if (icon_view->priv->bin_window)
@ -4577,11 +4533,16 @@ gtk_icon_view_get_visible_range (GtkIconView *icon_view,
for (icons = icon_view->priv->items; icons; icons = icons->next) for (icons = icon_view->priv->items; icons; icons = icons->next)
{ {
GtkIconViewItem *item = icons->data; GtkIconViewItem *item = icons->data;
GdkRectangle *item_area = (GdkRectangle *)item;
if ((item->x + item->width >= (int)gtk_adjustment_get_value (icon_view->priv->hadjustment)) && if ((item_area->x + item_area->width >= (int)gtk_adjustment_get_value (icon_view->priv->hadjustment)) &&
(item->y + item->height >= (int)gtk_adjustment_get_value (icon_view->priv->vadjustment)) && (item_area->y + item_area->height >= (int)gtk_adjustment_get_value (icon_view->priv->vadjustment)) &&
(item->x <= (int) (gtk_adjustment_get_value (icon_view->priv->hadjustment) + gtk_adjustment_get_page_size (icon_view->priv->hadjustment))) && (item_area->x <=
(item->y <= (int) (gtk_adjustment_get_value (icon_view->priv->vadjustment) + gtk_adjustment_get_page_size (icon_view->priv->vadjustment)))) (int) (gtk_adjustment_get_value (icon_view->priv->hadjustment) +
gtk_adjustment_get_page_size (icon_view->priv->hadjustment))) &&
(item_area->y <=
(int) (gtk_adjustment_get_value (icon_view->priv->vadjustment) +
gtk_adjustment_get_page_size (icon_view->priv->vadjustment))))
{ {
if (start_index == -1) if (start_index == -1)
start_index = item->index; start_index = item->index;
@ -6191,8 +6152,8 @@ gtk_icon_view_drag_begin (GtkWidget *widget,
g_return_if_fail (item != NULL); g_return_if_fail (item != NULL);
x = icon_view->priv->press_start_x - item->x + 1; x = icon_view->priv->press_start_x - item->cell_area.x + 1;
y = icon_view->priv->press_start_y - item->y + 1; y = icon_view->priv->press_start_y - item->cell_area.y + 1;
path = gtk_tree_path_new_from_indices (item->index, -1); path = gtk_tree_path_new_from_indices (item->index, -1);
icon = gtk_icon_view_create_drag_icon (icon_view, path); icon = gtk_icon_view_create_drag_icon (icon_view, path);
@ -6753,13 +6714,13 @@ gtk_icon_view_get_dest_item_at_pos (GtkIconView *icon_view,
if (pos) if (pos)
{ {
if (drag_x < item->x + item->width / 4) if (drag_x < item->cell_area.x + item->cell_area.width / 4)
*pos = GTK_ICON_VIEW_DROP_LEFT; *pos = GTK_ICON_VIEW_DROP_LEFT;
else if (drag_x > item->x + item->width * 3 / 4) else if (drag_x > item->cell_area.x + item->cell_area.width * 3 / 4)
*pos = GTK_ICON_VIEW_DROP_RIGHT; *pos = GTK_ICON_VIEW_DROP_RIGHT;
else if (drag_y < item->y + item->height / 4) else if (drag_y < item->cell_area.y + item->cell_area.height / 4)
*pos = GTK_ICON_VIEW_DROP_ABOVE; *pos = GTK_ICON_VIEW_DROP_ABOVE;
else if (drag_y > item->y + item->height * 3 / 4) else if (drag_y > item->cell_area.y + item->cell_area.height * 3 / 4)
*pos = GTK_ICON_VIEW_DROP_BELOW; *pos = GTK_ICON_VIEW_DROP_BELOW;
else else
*pos = GTK_ICON_VIEW_DROP_INTO; *pos = GTK_ICON_VIEW_DROP_INTO;
@ -6806,29 +6767,38 @@ gtk_icon_view_create_drag_icon (GtkIconView *icon_view,
if (index == item->index) if (index == item->index)
{ {
GdkRectangle rect = {
item->cell_area.x - icon_view->priv->item_padding,
item->cell_area.y - icon_view->priv->item_padding,
item->cell_area.width + icon_view->priv->item_padding * 2,
item->cell_area.height + icon_view->priv->item_padding * 2
};
surface = gdk_window_create_similar_surface (icon_view->priv->bin_window, surface = gdk_window_create_similar_surface (icon_view->priv->bin_window,
CAIRO_CONTENT_COLOR, CAIRO_CONTENT_COLOR,
item->width + 2, rect.width + 2,
item->height + 2); rect.height + 2);
cr = cairo_create (surface); cr = cairo_create (surface);
cairo_set_line_width (cr, 1.); cairo_set_line_width (cr, 1.);
gdk_cairo_set_source_color (cr, &gtk_widget_get_style (widget)->base[gtk_widget_get_state (widget)]); gdk_cairo_set_source_color (cr, &gtk_widget_get_style (widget)->base[gtk_widget_get_state (widget)]);
cairo_rectangle (cr, 0, 0, item->width + 2, item->height + 2); cairo_rectangle (cr, 0, 0, rect.width + 2, rect.height + 2);
cairo_fill (cr); cairo_fill (cr);
cairo_save (cr); cairo_save (cr);
cairo_rectangle (cr, 0, 0, item->width, item->height); cairo_rectangle (cr, 1, 1, rect.width, rect.height);
cairo_clip (cr); cairo_clip (cr);
gtk_icon_view_paint_item (icon_view, cr, item, 1, 1, FALSE); gtk_icon_view_paint_item (icon_view, cr, item,
icon_view->priv->item_padding + 1,
icon_view->priv->item_padding + 1, FALSE);
cairo_restore (cr); cairo_restore (cr);
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
cairo_rectangle (cr, 0.5, 0.5, item->width + 1, item->height + 1); cairo_rectangle (cr, 0.5, 0.5, rect.width + 1, rect.height + 1);
cairo_stroke (cr); cairo_stroke (cr);
cairo_destroy (cr); cairo_destroy (cr);
@ -7137,16 +7107,14 @@ get_pixbuf_box (GtkIconView *icon_view,
GdkRectangle *box) GdkRectangle *box)
{ {
GetPixbufBoxData data = { { 0, }, FALSE }; GetPixbufBoxData data = { { 0, }, FALSE };
GdkRectangle cell_area;
GtkCellAreaContext *context; GtkCellAreaContext *context;
context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); context = g_ptr_array_index (icon_view->priv->row_contexts, item->row);
gtk_icon_view_set_cell_data (icon_view, item); gtk_icon_view_set_cell_data (icon_view, item);
gtk_icon_view_get_cell_area (icon_view, item, &cell_area);
gtk_cell_area_foreach_alloc (icon_view->priv->cell_area, context, gtk_cell_area_foreach_alloc (icon_view->priv->cell_area, context,
GTK_WIDGET (icon_view), GTK_WIDGET (icon_view),
&cell_area, &cell_area, (GdkRectangle *)item, (GdkRectangle *)item,
(GtkCellAllocCallback)get_pixbuf_foreach, &data); (GtkCellAllocCallback)get_pixbuf_foreach, &data);
return data.pixbuf_found; return data.pixbuf_found;
@ -7222,8 +7190,8 @@ gtk_icon_view_item_accessible_image_get_image_position (AtkImage *image,
if (get_pixbuf_box (GTK_ICON_VIEW (item->widget), item->item, &box)) if (get_pixbuf_box (GTK_ICON_VIEW (item->widget), item->item, &box))
{ {
*x+= box.x - item->item->x; *x+= box.x - item->item->cell_area.x;
*y+= box.y - item->item->y; *y+= box.y - item->item->cell_area.y;
} }
} }
@ -7897,14 +7865,14 @@ gtk_icon_view_item_accessible_get_extents (AtkComponent *component,
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return; return;
*width = item->item->width; *width = item->item->cell_area.width;
*height = item->item->height; *height = item->item->cell_area.height;
if (gtk_icon_view_item_accessible_is_showing (item)) if (gtk_icon_view_item_accessible_is_showing (item))
{ {
parent_obj = gtk_widget_get_accessible (item->widget); parent_obj = gtk_widget_get_accessible (item->widget);
atk_component_get_position (ATK_COMPONENT (parent_obj), &l_x, &l_y, coord_type); atk_component_get_position (ATK_COMPONENT (parent_obj), &l_x, &l_y, coord_type);
*x = l_x + item->item->x; *x = l_x + item->item->cell_area.x;
*y = l_y + item->item->y; *y = l_y + item->item->cell_area.y;
} }
else else
{ {
@ -8027,10 +7995,10 @@ gtk_icon_view_item_accessible_is_showing (GtkIconViewItemAccessible *item)
visible_rect.width = allocation.width; visible_rect.width = allocation.width;
visible_rect.height = allocation.height; visible_rect.height = allocation.height;
if (((item->item->x + item->item->width) < visible_rect.x) || if (((item->item->cell_area.x + item->item->cell_area.width) < visible_rect.x) ||
((item->item->y + item->item->height) < (visible_rect.y)) || ((item->item->cell_area.y + item->item->cell_area.height) < (visible_rect.y)) ||
(item->item->x > (visible_rect.x + visible_rect.width)) || (item->item->cell_area.x > (visible_rect.x + visible_rect.width)) ||
(item->item->y > (visible_rect.y + visible_rect.height))) (item->item->cell_area.y > (visible_rect.y + visible_rect.height)))
is_showing = FALSE; is_showing = FALSE;
else else
is_showing = TRUE; is_showing = TRUE;