From 6036c51d523ce2b7bb2f8632c6ae3282c9436392 Mon Sep 17 00:00:00 2001 From: Tristan Van Berkom Date: Mon, 13 Dec 2010 17:41:50 +0900 Subject: [PATCH] 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. --- gtk/gtkiconview.c | 360 +++++++++++++++++++++------------------------- 1 file changed, 164 insertions(+), 196 deletions(-) diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c index 3c760c3e82..9e3129e594 100644 --- a/gtk/gtkiconview.c +++ b/gtk/gtkiconview.c @@ -72,14 +72,15 @@ typedef struct _GtkIconViewItem GtkIconViewItem; struct _GtkIconViewItem { + /* First member is always the rectangle so it + * can be cast to a rectangle. */ + GdkRectangle cell_area; + GtkTreeIter iter; gint index; gint row, col; - /* Bounding box */ - gint x, y, width, height; - guint selected : 1; guint selected_before_rubberbanding : 1; @@ -99,7 +100,6 @@ struct _GtkIconViewPrivate gulong add_editable_id; gulong remove_editable_id; - gulong focus_changed_id; gulong context_changed_id; GPtrArray *row_contexts; @@ -138,7 +138,6 @@ struct _GtkIconViewPrivate gint columns; gint item_width; - gint effective_item_width; gint spacing; gint row_spacing; gint column_spacing; @@ -369,9 +368,6 @@ static GtkIconViewItem * gtk_icon_view_get_item_at_coords (GtkIco gint y, gboolean only_in_cell, 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, GtkIconViewItem *item); @@ -390,10 +386,6 @@ static void gtk_icon_view_remove_editable (GtkCel GtkCellRenderer *renderer, GtkCellEditable *editable, GtkIconView *icon_view); -static void gtk_icon_view_focus_changed (GtkCellArea *area, - GtkCellRenderer *renderer, - const gchar *path, - GtkIconView *icon_view); /* Source side drag signals */ 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->item_width = -1; - icon_view->priv->effective_item_width = -1; icon_view->priv->spacing = 0; icon_view->priv->row_spacing = 6; icon_view->priv->column_spacing = 6; @@ -1135,9 +1126,6 @@ gtk_icon_view_constructor (GType type, priv->remove_editable_id = g_signal_connect (priv->cell_area, "remove-editable", 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; } @@ -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->remove_editable_id); - g_signal_handler_disconnect (priv->cell_area, priv->focus_changed_id); priv->add_editable_id = 0; priv->remove_editable_id = 0; - priv->focus_changed_id = 0; g_object_unref (priv->cell_area); priv->cell_area = NULL; @@ -1616,16 +1602,22 @@ gtk_icon_view_draw (GtkWidget *widget, for (icons = icon_view->priv->items; icons; icons = icons->next) { 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_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); if (gdk_cairo_get_clip_rectangle (cr, NULL)) { gtk_icon_view_paint_item (icon_view, cr, item, - item->x, item->y, + ((GdkRectangle *)item)->x, ((GdkRectangle *)item)->y, icon_view->priv->draw_focus); if (dest_index == item->index) @@ -1646,49 +1638,36 @@ gtk_icon_view_draw (GtkWidget *widget, switch (dest_pos) { case GTK_ICON_VIEW_DROP_INTO: - gtk_paint_focus (style, - cr, - state, - widget, - "iconview-drop-indicator", - dest_item->x, dest_item->y, - dest_item->width, dest_item->height); + gtk_paint_focus (style, cr, state, widget, + "iconview-drop-indicator", + dest_item->cell_area.x, dest_item->cell_area.y, + dest_item->cell_area.width, dest_item->cell_area.height); break; case GTK_ICON_VIEW_DROP_ABOVE: - gtk_paint_focus (style, - cr, - state, - widget, - "iconview-drop-indicator", - dest_item->x, dest_item->y - 1, - dest_item->width, 2); + gtk_paint_focus (style, cr, state, widget, + "iconview-drop-indicator", + dest_item->cell_area.x, dest_item->cell_area.y - 1, + dest_item->cell_area.width, 2); break; case GTK_ICON_VIEW_DROP_LEFT: - gtk_paint_focus (style, - cr, - state, - widget, - "iconview-drop-indicator", - dest_item->x - 1, dest_item->y, - 2, dest_item->height); + gtk_paint_focus (style, cr, state, widget, + "iconview-drop-indicator", + dest_item->cell_area.x - 1, dest_item->cell_area.y, + 2, dest_item->cell_area.height); break; case GTK_ICON_VIEW_DROP_BELOW: - gtk_paint_focus (style, - cr, - state, - widget, - "iconview-drop-indicator", - dest_item->x, dest_item->y + dest_item->height - 1, - dest_item->width, 2); + gtk_paint_focus (style, cr, state, widget, + "iconview-drop-indicator", + dest_item->cell_area.x, + dest_item->cell_area.y + dest_item->cell_area.height - 1, + dest_item->cell_area.width, 2); break; case GTK_ICON_VIEW_DROP_RIGHT: - gtk_paint_focus (style, - cr, - state, - widget, - "iconview-drop-indicator", - dest_item->x + dest_item->width - 1, dest_item->y, - 2, dest_item->height); + gtk_paint_focus (style, cr, state, widget, + "iconview-drop-indicator", + dest_item->cell_area.x + dest_item->cell_area.width - 1, + dest_item->cell_area.y, + 2, dest_item->cell_area.height); case GTK_ICON_VIEW_NO_DROP: ; break; } @@ -1877,15 +1856,6 @@ gtk_icon_view_remove_editable (GtkCellArea *area, 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: * @icon_view: A #GtkIconView @@ -1931,14 +1901,13 @@ gtk_icon_view_set_cursor (GtkIconView *icon_view, if (start_editing) { - GdkRectangle cell_area; GtkCellAreaContext *context; context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); 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_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; gboolean dirty = FALSE; GtkCellRenderer *cell = NULL, *cursor_cell = NULL; - GdkRectangle cell_area; 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); 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_WIDGET (icon_view), - &cell_area, 0/* XXX flags */, FALSE); + (GdkRectangle *)item, 0/* XXX flags */, FALSE); } } else @@ -2354,22 +2321,20 @@ gtk_icon_view_item_hit_test (GtkIconView *icon_view, gint width, gint height) { - GdkRectangle cell_area; HitTestData data = { { x, y, width, height }, FALSE }; GtkCellAreaContext *context; + GdkRectangle *item_area = (GdkRectangle *)item; - if (MIN (x + width, item->x + item->width) - MAX (x, item->x) <= 0 || - MIN (y + height, item->y + item->height) - MAX (y, item->y) <= 0) + if (MIN (x + width, item_area->x + item_area->width) - MAX (x, item_area->x) <= 0 || + MIN (y + height, item_area->y + item_area->height) - MAX (y, item_area->y) <= 0) return FALSE; - context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); 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_WIDGET (icon_view), - &cell_area, &cell_area, + item_area, item_area, (GtkCellAllocCallback)hit_test, &data); return data.hit; @@ -2427,7 +2392,6 @@ static gboolean gtk_icon_view_real_activate_cursor_item (GtkIconView *icon_view) { GtkTreePath *path; - GdkRectangle cell_area; gboolean activated; 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); 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, - 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); 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); 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; while (items) { 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) { @@ -2700,8 +2669,8 @@ gtk_icon_view_layout_single_row (GtkIconView *icon_view, current_width += icon_view->priv->column_spacing; - item->y = *y; - item->x = x; + item_area->y = *y + icon_view->priv->item_padding; + item_area->x = x + icon_view->priv->item_padding; x = current_width - icon_view->priv->margin; @@ -2720,28 +2689,25 @@ 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_allocate (context, item_width, max_height); - max_height += icon_view->priv->item_padding * 2; - - g_ptr_array_add (priv->row_contexts, context); - - /* Now go through the row again and align the icons */ + /* In the second loop the item height has been aligned and derived and + * we just set the height and handle rtl layout */ for (items = first_item; items != last_item; items = items->next) { GtkIconViewItem *item = items->data; + GdkRectangle *item_area = (GdkRectangle *)item; 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; } /* All items in the same row get the same height */ - item->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; + item_area->height = max_height; } + + /* Adjust the new y coordinate. */ + *y += max_height + icon_view->priv->row_spacing + icon_view->priv->item_padding * 2; return last_item; } @@ -2776,13 +2742,10 @@ gtk_icon_view_layout (GtkIconView *icon_view) /* Fetch the new item width if needed */ if (item_width < 0) - { - gtk_cell_area_context_get_preferred_width (icon_view->priv->cell_area_context, - &item_width, NULL); - item_width += icon_view->priv->item_padding * 2; - } + gtk_cell_area_context_get_preferred_width (icon_view->priv->cell_area_context, + &item_width, NULL); - 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; y += icon_view->priv->margin; @@ -2844,17 +2807,6 @@ gtk_icon_view_layout (GtkIconView *icon_view) 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 * 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; /* 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_cell_area_get_preferred_width (icon_view->priv->cell_area, @@ -2888,8 +2840,8 @@ gtk_icon_view_invalidate_sizes (GtkIconView *icon_view) static void gtk_icon_view_item_invalidate_size (GtkIconViewItem *item) { - item->width = -1; - item->height = -1; + item->cell_area.width = -1; + item->cell_area.height = -1; } static void @@ -2936,14 +2888,16 @@ gtk_icon_view_paint_item (GtkIconView *icon_view, GTK_SHADOW_NONE, GTK_WIDGET (icon_view), "icon_view_item", - x, y, - item->width, item->height); + x - icon_view->priv->item_padding, + 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.y = y; - cell_area.width = item->width; - cell_area.height = item->height; + cell_area.width = item->cell_area.width; + cell_area.height = item->cell_area.height; if (gtk_widget_has_focus (widget) && item == icon_view->priv->cursor_item) flags |= GTK_CELL_RENDERER_FOCUSED; @@ -3019,12 +2973,13 @@ static void gtk_icon_view_queue_draw_item (GtkIconView *icon_view, GtkIconViewItem *item) { - GdkRectangle rect; + GdkRectangle rect; + GdkRectangle *item_area = (GdkRectangle *)item; - rect.x = item->x; - rect.y = item->y; - rect.width = item->width; - rect.height = item->height; + rect.x = item_area->x - icon_view->priv->item_padding; + rect.y = item_area->y - icon_view->priv->item_padding; + rect.width = item_area->width + icon_view->priv->item_padding * 2; + rect.height = item_area->height + icon_view->priv->item_padding * 2; if (icon_view->priv->bin_window) 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->width = -1; - item->height = -1; + item->cell_area.width = -1; + item->cell_area.height = -1; 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) { GtkIconViewItem *item = items->data; + GdkRectangle *item_area = (GdkRectangle *)item; - if (x >= item->x - icon_view->priv->column_spacing/2 && - x <= item->x + item->width + icon_view->priv->column_spacing/2 && - y >= item->y - icon_view->priv->row_spacing/2 && - y <= item->y + item->height + icon_view->priv->row_spacing/2) + if (x >= item_area->x - icon_view->priv->column_spacing/2 && + x <= item_area->x + item_area->width + icon_view->priv->column_spacing/2 && + y >= item_area->y - 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) { - GdkRectangle cell_area; GtkCellRenderer *cell = NULL; GtkCellAreaContext *context; context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); 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 && - y >= cell_area.y && y <= cell_area.y + cell_area.height) + if (x >= item_area->x && x <= item_area->x + item_area->width && + 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, GTK_WIDGET (icon_view), - &cell_area, + item_area, x, y, NULL); if (cell_at_pos) @@ -3558,7 +3512,7 @@ find_item_page_up_down (GtkIconView *icon_view, gint y, 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); if (count > 0) @@ -3570,7 +3524,7 @@ find_item_page_up_down (GtkIconView *icon_view, if (((GtkIconViewItem *)next->data)->col == col) break; } - if (!next || ((GtkIconViewItem *)next->data)->y > y) + if (!next || ((GtkIconViewItem *)next->data)->cell_area.y > y) break; item = next; @@ -3585,7 +3539,7 @@ find_item_page_up_down (GtkIconView *icon_view, if (((GtkIconViewItem *)next->data)->col == col) break; } - if (!next || ((GtkIconViewItem *)next->data)->y < y) + if (!next || ((GtkIconViewItem *)next->data)->cell_area.y < y) break; item = next; @@ -3976,7 +3930,7 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view, item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices(path)[0]); - if (!item || item->width < 0 || + if (!item || item->cell_area.width < 0 || !gtk_widget_get_realized (widget)) { if (icon_view->priv->scroll_to_path) @@ -3998,23 +3952,25 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view, { GtkAllocation allocation; gint x, y; - gint focus_width; gfloat offset; + GdkRectangle item_area = + { + 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 + }; - gtk_widget_style_get (widget, - "focus-line-width", &focus_width, - NULL); - gdk_window_get_position (icon_view->priv->bin_window, &x, &y); 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_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_get_value (icon_view->priv->hadjustment) + offset); @@ -4034,11 +3990,13 @@ gtk_icon_view_scroll_to_item (GtkIconView *icon_view, GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (icon_view); gint x, y, width, height; - gint focus_width; - - gtk_widget_style_get (widget, - "focus-line-width", &focus_width, - NULL); + GdkRectangle item_area = + { + 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 + }; width = gdk_window_get_width (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); - if (y + item->y - focus_width < 0) + if (y + item_area.y < 0) gtk_adjustment_set_value (icon_view->priv->vadjustment, - gtk_adjustment_get_value (icon_view->priv->vadjustment) + y + item->y - focus_width); - else if (y + item->y + item->height + focus_width > allocation.height) + gtk_adjustment_get_value (icon_view->priv->vadjustment) + y + item_area.y); + else if (y + item_area.y + item_area.height > allocation.height) gtk_adjustment_set_value (icon_view->priv->vadjustment, - gtk_adjustment_get_value (icon_view->priv->vadjustment) + y + item->y + item->height - + focus_width - allocation.height); + gtk_adjustment_get_value (icon_view->priv->vadjustment) + y + item_area.y + + 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_get_value (icon_view->priv->hadjustment) + x + item->x - focus_width); - else if (x + item->x + item->width + focus_width > allocation.width) + gtk_adjustment_get_value (icon_view->priv->hadjustment) + x + item_area.x); + else if (x + item_area.x + item_area.width > allocation.width) gtk_adjustment_set_value (icon_view->priv->hadjustment, - gtk_adjustment_get_value (icon_view->priv->hadjustment) + x + item->x + item->width - + focus_width - allocation.width); + gtk_adjustment_get_value (icon_view->priv->hadjustment) + x + item_area.x + + item_area.width - allocation.width); gtk_adjustment_changed (icon_view->priv->hadjustment); gtk_adjustment_changed (icon_view->priv->vadjustment); @@ -4334,22 +4292,20 @@ gtk_icon_view_set_tooltip_cell (GtkIconView *icon_view, if (cell) { - GdkRectangle cell_area; GtkCellAreaContext *context; 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_cell_area_get_cell_allocation (icon_view->priv->cell_area, context, GTK_WIDGET (icon_view), - cell, &cell_area, &rect); + cell, (GdkRectangle *)item, &rect); } else { - rect.x = item->x; - rect.y = item->y; - rect.width = item->width; - rect.height = item->height; + rect.x = item->cell_area.x - icon_view->priv->item_padding; + rect.y = item->cell_area.y - icon_view->priv->item_padding; + rect.width = item->cell_area.width + icon_view->priv->item_padding * 2; + rect.height = item->cell_area.height + icon_view->priv->item_padding * 2; } 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) { GtkIconViewItem *item = icons->data; + GdkRectangle *item_area = (GdkRectangle *)item; - if ((item->x + item->width >= (int)gtk_adjustment_get_value (icon_view->priv->hadjustment)) && - (item->y + item->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->y <= (int) (gtk_adjustment_get_value (icon_view->priv->vadjustment) + gtk_adjustment_get_page_size (icon_view->priv->vadjustment)))) + if ((item_area->x + item_area->width >= (int)gtk_adjustment_get_value (icon_view->priv->hadjustment)) && + (item_area->y + item_area->height >= (int)gtk_adjustment_get_value (icon_view->priv->vadjustment)) && + (item_area->x <= + (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) start_index = item->index; @@ -6191,8 +6152,8 @@ gtk_icon_view_drag_begin (GtkWidget *widget, g_return_if_fail (item != NULL); - x = icon_view->priv->press_start_x - item->x + 1; - y = icon_view->priv->press_start_y - item->y + 1; + x = icon_view->priv->press_start_x - item->cell_area.x + 1; + y = icon_view->priv->press_start_y - item->cell_area.y + 1; path = gtk_tree_path_new_from_indices (item->index, -1); 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 (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; - 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; - 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; - 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; else *pos = GTK_ICON_VIEW_DROP_INTO; @@ -6806,29 +6767,38 @@ gtk_icon_view_create_drag_icon (GtkIconView *icon_view, 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, CAIRO_CONTENT_COLOR, - item->width + 2, - item->height + 2); + rect.width + 2, + rect.height + 2); cr = cairo_create (surface); cairo_set_line_width (cr, 1.); gdk_cairo_set_source_color (cr, >k_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_save (cr); - cairo_rectangle (cr, 0, 0, item->width, item->height); + cairo_rectangle (cr, 1, 1, rect.width, rect.height); 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_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_destroy (cr); @@ -7137,16 +7107,14 @@ get_pixbuf_box (GtkIconView *icon_view, GdkRectangle *box) { GetPixbufBoxData data = { { 0, }, FALSE }; - GdkRectangle cell_area; GtkCellAreaContext *context; context = g_ptr_array_index (icon_view->priv->row_contexts, item->row); 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_WIDGET (icon_view), - &cell_area, &cell_area, + (GdkRectangle *)item, (GdkRectangle *)item, (GtkCellAllocCallback)get_pixbuf_foreach, &data); 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)) { - *x+= box.x - item->item->x; - *y+= box.y - item->item->y; + *x+= box.x - item->item->cell_area.x; + *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)) return; - *width = item->item->width; - *height = item->item->height; + *width = item->item->cell_area.width; + *height = item->item->cell_area.height; if (gtk_icon_view_item_accessible_is_showing (item)) { parent_obj = gtk_widget_get_accessible (item->widget); atk_component_get_position (ATK_COMPONENT (parent_obj), &l_x, &l_y, coord_type); - *x = l_x + item->item->x; - *y = l_y + item->item->y; + *x = l_x + item->item->cell_area.x; + *y = l_y + item->item->cell_area.y; } else { @@ -8027,10 +7995,10 @@ gtk_icon_view_item_accessible_is_showing (GtkIconViewItemAccessible *item) visible_rect.width = allocation.width; visible_rect.height = allocation.height; - if (((item->item->x + item->item->width) < visible_rect.x) || - ((item->item->y + item->item->height) < (visible_rect.y)) || - (item->item->x > (visible_rect.x + visible_rect.width)) || - (item->item->y > (visible_rect.y + visible_rect.height))) + if (((item->item->cell_area.x + item->item->cell_area.width) < visible_rect.x) || + ((item->item->cell_area.y + item->item->cell_area.height) < (visible_rect.y)) || + (item->item->cell_area.x > (visible_rect.x + visible_rect.width)) || + (item->item->cell_area.y > (visible_rect.y + visible_rect.height))) is_showing = FALSE; else is_showing = TRUE;