Committing working version of GtkIconView using GtkCellArea.

Some things still not sorted out, GtkCellAreaContext is not allocated
so icons dont recieve alignments yet, focus navigation is not exactly
what it used to be (maybe we can work around that by observing the
item orientation and explicitly setting focus to the same cell when
navigating in the wrong orientation).
This commit is contained in:
Tristan Van Berkom 2010-12-12 19:59:41 +09:00
parent 951ea857cc
commit c77abe1f83

View File

@ -97,6 +97,11 @@ struct _GtkIconViewPrivate
GtkCellArea *cell_area;
GtkCellAreaContext *cell_area_context;
gulong add_editable_id;
gulong remove_editable_id;
gulong focus_changed_id;
gulong context_changed_id;
gint width, height;
GtkSelectionMode selection_mode;
@ -114,7 +119,6 @@ struct _GtkIconViewPrivate
guint layout_idle_id;
gboolean doing_rubberband;
gint rubberband_x1, rubberband_y1;
gint rubberband_x2, rubberband_y2;
GdkDevice *rubberband_device;
@ -125,8 +129,6 @@ struct _GtkIconViewPrivate
GtkIconViewItem *anchor_item;
GtkIconViewItem *cursor_item;
GtkIconViewItem *edited_item;
GtkCellEditable *editable;
GtkIconViewItem *last_single_clicked;
@ -144,8 +146,8 @@ struct _GtkIconViewPrivate
gint markup_column;
gint pixbuf_column;
gint pixbuf_cell;
gint text_cell;
GtkCellRenderer *pixbuf_cell;
GtkCellRenderer *text_cell;
gint tooltip_column;
@ -181,6 +183,9 @@ struct _GtkIconViewPrivate
* driving the scrollable adjustment values */
guint hscroll_policy : 1;
guint vscroll_policy : 1;
guint doing_rubberband : 1;
};
/* Signals */
@ -371,19 +376,21 @@ static GtkCellArea *gtk_icon_view_cell_layout_get_area (GtkCel
static void gtk_icon_view_item_selected_changed (GtkIconView *icon_view,
GtkIconViewItem *item);
static void gtk_icon_view_put (GtkIconView *icon_view,
GtkWidget *widget,
gint x,
gint y,
gint width,
gint height);
static void gtk_icon_view_remove_widget (GtkCellEditable *editable,
static void gtk_icon_view_add_editable (GtkCellArea *area,
GtkCellRenderer *renderer,
GtkCellEditable *editable,
GdkRectangle *cell_area,
const gchar *path,
GtkIconView *icon_view);
static void gtk_icon_view_remove_editable (GtkCellArea *area,
GtkCellRenderer *renderer,
GtkCellEditable *editable,
GtkIconView *icon_view);
static void gtk_icon_view_focus_changed (GtkCellArea *area,
GtkCellRenderer *renderer,
const gchar *path,
GtkIconView *icon_view);
static void gtk_icon_view_start_editing (GtkIconView *icon_view,
GtkIconViewItem *item,
GdkEvent *event);
static void gtk_icon_view_stop_editing (GtkIconView *icon_view,
gboolean cancel_editing);
/* Source side drag signals */
static void gtk_icon_view_drag_begin (GtkWidget *widget,
@ -1067,8 +1074,8 @@ gtk_icon_view_init (GtkIconView *icon_view)
icon_view->priv->text_column = -1;
icon_view->priv->markup_column = -1;
icon_view->priv->pixbuf_column = -1;
icon_view->priv->text_cell = -1;
icon_view->priv->pixbuf_cell = -1;
icon_view->priv->text_cell = NULL;
icon_view->priv->pixbuf_cell = NULL;
icon_view->priv->tooltip_column = -1;
gtk_widget_set_can_focus (GTK_WIDGET (icon_view), TRUE);
@ -1115,8 +1122,17 @@ gtk_icon_view_constructor (GType type,
priv->cell_area_context = gtk_cell_area_create_context (priv->cell_area);
return object;
priv->add_editable_id =
g_signal_connect (priv->cell_area, "add-editable",
G_CALLBACK (gtk_icon_view_add_editable), icon_view);
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;
}
static void
@ -1136,6 +1152,13 @@ gtk_icon_view_dispose (GObject *object)
if (priv->cell_area)
{
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;
}
@ -1322,7 +1345,7 @@ gtk_icon_view_destroy (GtkWidget *widget)
{
GtkIconView *icon_view = GTK_ICON_VIEW (widget);
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_set_model (icon_view, NULL);
@ -1796,22 +1819,23 @@ gtk_icon_view_item_selected_changed (GtkIconView *icon_view,
}
static void
gtk_icon_view_put (GtkIconView *icon_view,
GtkWidget *widget,
gint x,
gint y,
gint width,
gint height)
gtk_icon_view_add_editable (GtkCellArea *area,
GtkCellRenderer *renderer,
GtkCellEditable *editable,
GdkRectangle *cell_area,
const gchar *path,
GtkIconView *icon_view)
{
GtkIconViewChild *child;
GtkWidget *widget = GTK_WIDGET (editable);
child = g_new (GtkIconViewChild, 1);
child->widget = widget;
child->area.x = x;
child->area.y = y;
child->area.width = width;
child->area.height = height;
child->area.x = cell_area->x;
child->area.y = cell_area->y;
child->area.width = cell_area->width;
child->area.height = cell_area->height;
icon_view->priv->children = g_list_append (icon_view->priv->children, child);
@ -1822,68 +1846,31 @@ gtk_icon_view_put (GtkIconView *icon_view,
}
static void
gtk_icon_view_remove_widget (GtkCellEditable *editable,
gtk_icon_view_remove_editable (GtkCellArea *area,
GtkCellRenderer *renderer,
GtkCellEditable *editable,
GtkIconView *icon_view)
{
GtkIconViewItem *item;
if (icon_view->priv->edited_item == NULL)
return;
item = icon_view->priv->edited_item;
icon_view->priv->edited_item = NULL;
icon_view->priv->editable = NULL;
GtkTreePath *path;
if (gtk_widget_has_focus (GTK_WIDGET (editable)))
gtk_widget_grab_focus (GTK_WIDGET (icon_view));
g_signal_handlers_disconnect_by_func (editable,
gtk_icon_view_remove_widget,
icon_view);
gtk_container_remove (GTK_CONTAINER (icon_view),
GTK_WIDGET (editable));
gtk_icon_view_queue_draw_item (icon_view, item);
}
static void
gtk_icon_view_start_editing (GtkIconView *icon_view,
GtkIconViewItem *item,
GdkEvent *event)
{
GdkRectangle cell_area;
GtkIconViewPrivate *priv = icon_view->priv;
gtk_icon_view_set_cell_data (icon_view, item);
gtk_icon_view_get_cell_area (icon_view, item, &cell_area);
gtk_cell_area_activate (priv->cell_area, priv->cell_area_context,
GTK_WIDGET (icon_view), &cell_area, 0 /* XXX flags */);
path = gtk_tree_path_new_from_string (gtk_cell_area_get_current_path_string (area));
gtk_icon_view_queue_draw_path (icon_view, path);
gtk_tree_path_free (path);
}
static void
gtk_icon_view_stop_editing (GtkIconView *icon_view,
gboolean cancel_editing)
gtk_icon_view_focus_changed (GtkCellArea *area,
GtkCellRenderer *renderer,
const gchar *path,
GtkIconView *icon_view)
{
GtkCellRenderer *cell = NULL;
GtkIconViewItem *item;
GList *l;
if (icon_view->priv->edited_item == NULL)
return;
/*
* This is very evil. We need to do this, because
* gtk_cell_editable_editing_done may trigger gtk_icon_view_row_changed
* later on. If gtk_icon_view_row_changed notices
* icon_view->priv->edited_item != NULL, it'll call
* gtk_icon_view_stop_editing again. Bad things will happen then.
*
* Please read that again if you intend to modify anything here.
*/
/* XXX replace this with add-editable/remove-editable apis */
/* XXX Update cursor item for focus path here */
}
/**
@ -1917,7 +1904,7 @@ gtk_icon_view_set_cursor (GtkIconView *icon_view,
g_return_if_fail (path != NULL);
g_return_if_fail (cell == NULL || GTK_IS_CELL_RENDERER (cell));
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
if (gtk_tree_path_get_depth (path) == 1)
item = g_list_nth_data (icon_view->priv->items,
@ -1930,7 +1917,15 @@ gtk_icon_view_set_cursor (GtkIconView *icon_view,
gtk_icon_view_scroll_to_path (icon_view, path, FALSE, 0.0, 0.0);
if (start_editing)
gtk_icon_view_start_editing (icon_view, item, NULL);
{
GdkRectangle cell_area;
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,
icon_view->priv->cell_area_context,
GTK_WIDGET (icon_view), &cell_area, 0 /* XXX flags */, TRUE);
}
}
/**
@ -2066,16 +2061,16 @@ gtk_icon_view_button_press (GtkWidget *widget,
icon_view->priv->last_single_clicked = item;
/* cancel the current editing, if it exists */
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
if (cell != NULL)
if (cell != NULL && gtk_cell_renderer_is_activatable (cell))
{
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,
icon_view->priv->cell_area_context,
GTK_WIDGET (icon_view),
&cell_area, 0/* XXX flags */);
&cell_area, 0/* XXX flags */, FALSE);
}
}
else
@ -2422,7 +2417,7 @@ gtk_icon_view_real_activate_cursor_item (GtkIconView *icon_view)
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,
icon_view->priv->cell_area_context,
GTK_WIDGET (icon_view), &cell_area, 0 /* XXX flags */);
GTK_WIDGET (icon_view), &cell_area, 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);
@ -2742,10 +2737,13 @@ gtk_icon_view_layout (GtkIconView *icon_view)
item_width = icon_view->priv->item_width;
/* Fetch the new item width */
/* Update the context widths for any invalidated
* items */
gtk_icon_view_cache_widths (icon_view);
/* Fetch the new item width if needed */
if (item_width < 0)
{
gtk_icon_view_cache_widths (icon_view);
gtk_cell_area_context_get_preferred_width (icon_view->priv->cell_area_context,
&item_width, NULL);
item_width += icon_view->priv->item_padding * 2;
@ -2831,14 +2829,17 @@ 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)
{
gtk_icon_view_set_cell_data (icon_view, item);
gtk_cell_area_get_preferred_width (icon_view->priv->cell_area,
icon_view->priv->cell_area_context,
GTK_WIDGET (icon_view), NULL, NULL);
}
}
}
static void
gtk_icon_view_invalidate_sizes (GtkIconView *icon_view)
{
@ -2900,16 +2901,17 @@ gtk_icon_view_paint_item (GtkIconView *icon_view,
item->width, item->height);
}
cell_area.x = x - item->x;
cell_area.y = y - item->y;
cell_area.x = x;
cell_area.y = y;
cell_area.width = item->width;
cell_area.height = item->height;
if (gtk_widget_has_focus (widget) && item == icon_view->priv->cursor_item)
flags |= GTK_CELL_RENDERER_FOCUSED;
gtk_cell_area_render (priv->cell_area, priv->cell_area_context,
widget, cr, &cell_area, &cell_area, flags,
draw_focus &&
gtk_widget_has_focus (widget) &&
item == icon_view->priv->cursor_item);
draw_focus);
}
static void
@ -3060,7 +3062,7 @@ gtk_icon_view_item_new (void)
{
GtkIconViewItem *item;
item = g_new0 (GtkIconViewItem, 1);
item = g_slice_new0 (GtkIconViewItem);
item->width = -1;
item->height = -1;
@ -3073,10 +3075,9 @@ gtk_icon_view_item_free (GtkIconViewItem *item)
{
g_return_if_fail (item != NULL);
g_free (item);
g_slice_free (GtkIconViewItem, item);
}
static GtkIconViewItem *
gtk_icon_view_get_item_at_coords (GtkIconView *icon_view,
gint x,
@ -3093,16 +3094,21 @@ gtk_icon_view_get_item_at_coords (GtkIconView *icon_view,
{
GtkIconViewItem *item = items->data;
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->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 (only_in_cell || cell_at_pos)
{
GdkRectangle cell_area;
GtkCellRenderer *cell;
GtkCellRenderer *cell = NULL;
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)
cell = gtk_cell_area_get_cell_at_position (icon_view->priv->cell_area,
icon_view->priv->cell_area_context,
GTK_WIDGET (icon_view),
@ -3117,11 +3123,9 @@ gtk_icon_view_get_item_at_coords (GtkIconView *icon_view,
else
return item;
}
return item;
}
}
return NULL;
}
@ -3203,7 +3207,7 @@ gtk_icon_view_row_changed (GtkTreeModel *model,
if (gtk_tree_path_get_depth (path) > 1)
return;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
index = gtk_tree_path_get_indices(path)[0];
item = g_list_nth_data (icon_view->priv->items, index);
@ -3281,7 +3285,7 @@ gtk_icon_view_row_deleted (GtkTreeModel *model,
list = g_list_nth (icon_view->priv->items, index);
item = list->data;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
if (item == icon_view->priv->anchor_item)
icon_view->priv->anchor_item = NULL;
@ -3329,7 +3333,7 @@ gtk_icon_view_rows_reordered (GtkTreeModel *model,
if (iter != NULL)
return;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
length = gtk_tree_model_iter_n_children (model, NULL);
@ -3440,7 +3444,7 @@ gtk_icon_view_real_move_cursor (GtkIconView *icon_view,
if (!gtk_widget_has_focus (GTK_WIDGET (icon_view)))
return FALSE;
gtk_icon_view_stop_editing (icon_view, FALSE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, FALSE);
gtk_widget_grab_focus (GTK_WIDGET (icon_view));
if (gtk_get_current_event_state (&state))
@ -3609,9 +3613,8 @@ static void
gtk_icon_view_move_cursor_up_down (GtkIconView *icon_view,
gint count)
{
#if _I_HAD_A_MILLION_DOLLARS_
GtkIconViewItem *item;
gint cell;
GtkCellRenderer *cell;
gboolean dirty = FALSE;
gint step;
GtkDirectionType direction;
@ -3631,23 +3634,27 @@ gtk_icon_view_move_cursor_up_down (GtkIconView *icon_view,
list = g_list_last (icon_view->priv->items);
item = list ? list->data : NULL;
cell = -1;
/* Give focus to the first cell initially */
gtk_icon_view_set_cell_data (icon_view, item);
gtk_cell_area_focus (icon_view->priv->cell_area, direction);
}
else
{
item = icon_view->priv->cursor_item;
cell = icon_view->priv->cursor_cell;
step = count > 0 ? 1 : -1;
/* Save the current focus cell in case we hit the edge */
cell = gtk_cell_area_get_focus_cell (icon_view->priv->cell_area);
while (item)
{
cell = find_cell (icon_view, item, cell,
GTK_ORIENTATION_VERTICAL,
step, &count);
if (count == 0)
gtk_icon_view_set_cell_data (icon_view, item);
if (gtk_cell_area_focus (icon_view->priv->cell_area, direction))
break;
item = find_item (icon_view, item, step, 0);
count = count - step;
}
}
@ -3663,6 +3670,7 @@ gtk_icon_view_move_cursor_up_down (GtkIconView *icon_view,
GTK_DIR_TAB_FORWARD);
}
gtk_cell_area_set_focus_cell (icon_view->priv->cell_area, cell);
return;
}
@ -3672,6 +3680,7 @@ gtk_icon_view_move_cursor_up_down (GtkIconView *icon_view,
icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE)
icon_view->priv->anchor_item = item;
cell = gtk_cell_area_get_focus_cell (icon_view->priv->cell_area);
gtk_icon_view_set_cursor_item (icon_view, item, cell);
if (!icon_view->priv->ctrl_pressed &&
@ -3687,7 +3696,6 @@ gtk_icon_view_move_cursor_up_down (GtkIconView *icon_view,
if (dirty)
g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
#endif
}
static void
@ -3749,9 +3757,8 @@ static void
gtk_icon_view_move_cursor_left_right (GtkIconView *icon_view,
gint count)
{
#if _I_HAD_A_MILLION_DOLLARS_
GtkIconViewItem *item;
gint cell = -1;
GtkCellRenderer *cell = NULL;
gboolean dirty = FALSE;
gint step;
GtkDirectionType direction;
@ -3771,22 +3778,27 @@ gtk_icon_view_move_cursor_left_right (GtkIconView *icon_view,
list = g_list_last (icon_view->priv->items);
item = list ? list->data : NULL;
/* Give focus to the first cell initially */
gtk_icon_view_set_cell_data (icon_view, item);
gtk_cell_area_focus (icon_view->priv->cell_area, direction);
}
else
{
item = icon_view->priv->cursor_item;
cell = icon_view->priv->cursor_cell;
step = count > 0 ? 1 : -1;
/* Save the current focus cell in case we hit the edge */
cell = gtk_cell_area_get_focus_cell (icon_view->priv->cell_area);
while (item)
{
cell = find_cell (icon_view, item, cell,
GTK_ORIENTATION_HORIZONTAL,
step, &count);
if (count == 0)
gtk_icon_view_set_cell_data (icon_view, item);
if (gtk_cell_area_focus (icon_view->priv->cell_area, direction))
break;
item = find_item (icon_view, item, 0, step);
count = count - step;
}
}
@ -3802,6 +3814,7 @@ gtk_icon_view_move_cursor_left_right (GtkIconView *icon_view,
GTK_DIR_TAB_FORWARD);
}
gtk_cell_area_set_focus_cell (icon_view->priv->cell_area, cell);
return;
}
@ -3811,6 +3824,7 @@ gtk_icon_view_move_cursor_left_right (GtkIconView *icon_view,
icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE)
icon_view->priv->anchor_item = item;
cell = gtk_cell_area_get_focus_cell (icon_view->priv->cell_area);
gtk_icon_view_set_cursor_item (icon_view, item, cell);
if (!icon_view->priv->ctrl_pressed &&
@ -3826,7 +3840,6 @@ gtk_icon_view_move_cursor_left_right (GtkIconView *icon_view,
if (dirty)
g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
#endif
}
static void
@ -4628,7 +4641,7 @@ gtk_icon_view_set_model (GtkIconView *icon_view,
icon_view->priv->scroll_to_path = NULL;
}
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
if (model)
{
@ -4743,143 +4756,91 @@ gtk_icon_view_get_model (GtkIconView *icon_view)
static void
update_text_cell (GtkIconView *icon_view)
{
#if _I_HAD_A_MILLION_DOLLARS_
GtkIconViewCellInfo *info;
GList *l;
gint i;
if (icon_view->priv->text_column == -1 &&
icon_view->priv->markup_column == -1)
{
if (icon_view->priv->text_cell != -1)
if (icon_view->priv->text_cell != NULL)
{
if (icon_view->priv->pixbuf_cell > icon_view->priv->text_cell)
icon_view->priv->pixbuf_cell--;
info = g_list_nth_data (icon_view->priv->cell_list,
gtk_cell_area_remove (icon_view->priv->cell_area,
icon_view->priv->text_cell);
icon_view->priv->cell_list = g_list_remove (icon_view->priv->cell_list, info);
free_cell_info (info);
icon_view->priv->n_cells--;
icon_view->priv->text_cell = -1;
icon_view->priv->text_cell = NULL;
}
}
else
{
if (icon_view->priv->text_cell == -1)
if (icon_view->priv->text_cell == NULL)
{
GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (icon_view), cell, FALSE);
for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++)
{
info = l->data;
if (info->cell == cell)
{
icon_view->priv->text_cell = i;
break;
}
}
}
icon_view->priv->text_cell = gtk_cell_renderer_text_new ();
info = g_list_nth_data (icon_view->priv->cell_list,
icon_view->priv->text_cell);
gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (icon_view), icon_view->priv->text_cell, FALSE);
}
if (icon_view->priv->markup_column != -1)
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view),
info->cell,
icon_view->priv->text_cell,
"markup", icon_view->priv->markup_column,
NULL);
else
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view),
info->cell,
icon_view->priv->text_cell,
"text", icon_view->priv->text_column,
NULL);
if (icon_view->priv->item_orientation == GTK_ORIENTATION_VERTICAL)
g_object_set (info->cell,
g_object_set (icon_view->priv->text_cell,
"alignment", PANGO_ALIGN_CENTER,
"wrap-mode", PANGO_WRAP_WORD_CHAR,
"xalign", 0.5,
"yalign", 0.0,
NULL);
else
g_object_set (info->cell,
g_object_set (icon_view->priv->text_cell,
"alignment", PANGO_ALIGN_LEFT,
"wrap-mode", PANGO_WRAP_WORD_CHAR,
"xalign", 0.0,
"yalign", 0.5,
NULL);
}
#endif
}
static void
update_pixbuf_cell (GtkIconView *icon_view)
{
#if _I_HAD_A_MILLION_DOLLARS_
GtkIconViewCellInfo *info;
GList *l;
gint i;
if (icon_view->priv->pixbuf_column == -1)
{
if (icon_view->priv->pixbuf_cell != -1)
if (icon_view->priv->pixbuf_cell != NULL)
{
if (icon_view->priv->text_cell > icon_view->priv->pixbuf_cell)
icon_view->priv->text_cell--;
info = g_list_nth_data (icon_view->priv->cell_list,
gtk_cell_area_remove (icon_view->priv->cell_area,
icon_view->priv->pixbuf_cell);
icon_view->priv->cell_list = g_list_remove (icon_view->priv->cell_list, info);
free_cell_info (info);
icon_view->priv->n_cells--;
icon_view->priv->pixbuf_cell = -1;
icon_view->priv->pixbuf_cell = NULL;
}
}
else
{
if (icon_view->priv->pixbuf_cell == -1)
if (icon_view->priv->pixbuf_cell == NULL)
{
GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
icon_view->priv->pixbuf_cell = gtk_cell_renderer_pixbuf_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view), cell, FALSE);
for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++)
{
info = l->data;
if (info->cell == cell)
{
icon_view->priv->pixbuf_cell = i;
break;
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view), icon_view->priv->pixbuf_cell, FALSE);
}
}
}
info = g_list_nth_data (icon_view->priv->cell_list,
icon_view->priv->pixbuf_cell);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view),
info->cell,
icon_view->priv->pixbuf_cell,
"pixbuf", icon_view->priv->pixbuf_column,
NULL);
if (icon_view->priv->item_orientation == GTK_ORIENTATION_VERTICAL)
g_object_set (info->cell,
g_object_set (icon_view->priv->pixbuf_cell,
"xalign", 0.5,
"yalign", 1.0,
NULL);
else
g_object_set (info->cell,
g_object_set (icon_view->priv->pixbuf_cell,
"xalign", 0.0,
"yalign", 0.0,
NULL);
}
#endif
}
/**
@ -4915,7 +4876,8 @@ gtk_icon_view_set_text_column (GtkIconView *icon_view,
icon_view->priv->text_column = column;
}
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
update_text_cell (icon_view);
@ -4978,7 +4940,7 @@ gtk_icon_view_set_markup_column (GtkIconView *icon_view,
icon_view->priv->markup_column = column;
}
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
update_text_cell (icon_view);
@ -5039,7 +5001,7 @@ gtk_icon_view_set_pixbuf_column (GtkIconView *icon_view,
icon_view->priv->pixbuf_column = column;
}
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
update_pixbuf_cell (icon_view);
@ -5357,7 +5319,11 @@ gtk_icon_view_set_item_orientation (GtkIconView *icon_view,
{
icon_view->priv->item_orientation = orientation;
gtk_icon_view_stop_editing (icon_view, TRUE);
if (GTK_IS_ORIENTABLE (icon_view->priv->cell_area))
gtk_orientable_set_orientation (GTK_ORIENTABLE (icon_view->priv->cell_area),
icon_view->priv->item_orientation);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
gtk_icon_view_queue_layout (icon_view);
@ -5410,7 +5376,7 @@ gtk_icon_view_set_columns (GtkIconView *icon_view,
{
icon_view->priv->columns = columns;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "columns");
@ -5456,7 +5422,7 @@ gtk_icon_view_set_item_width (GtkIconView *icon_view,
{
icon_view->priv->item_width = item_width;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
gtk_icon_view_queue_layout (icon_view);
@ -5506,7 +5472,7 @@ gtk_icon_view_set_spacing (GtkIconView *icon_view,
{
icon_view->priv->spacing = spacing;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
gtk_icon_view_queue_layout (icon_view);
@ -5552,7 +5518,7 @@ gtk_icon_view_set_row_spacing (GtkIconView *icon_view,
{
icon_view->priv->row_spacing = row_spacing;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
gtk_icon_view_queue_layout (icon_view);
@ -5598,7 +5564,7 @@ gtk_icon_view_set_column_spacing (GtkIconView *icon_view,
{
icon_view->priv->column_spacing = column_spacing;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
gtk_icon_view_queue_layout (icon_view);
@ -5645,7 +5611,7 @@ gtk_icon_view_set_margin (GtkIconView *icon_view,
{
icon_view->priv->margin = margin;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
gtk_icon_view_queue_layout (icon_view);
@ -5691,7 +5657,7 @@ gtk_icon_view_set_item_padding (GtkIconView *icon_view,
{
icon_view->priv->item_padding = item_padding;
gtk_icon_view_stop_editing (icon_view, TRUE);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
gtk_icon_view_queue_layout (icon_view);