* Boston, MA 02111-1307, USA.
*/
-#include <config.h>
+#include "config.h"
#include <string.h>
#include <atk/atk.h>
#include "gtkbindings.h"
#include "gtkdnd.h"
#include "gtkmain.h"
-#include "gtksignal.h"
#include "gtkintl.h"
#include "gtkaccessible.h"
#include "gtkwindow.h"
gint pixbuf_cell;
gint text_cell;
+ gint tooltip_column;
+
/* Drag-and-drop. */
GdkModifierType start_button_mask;
gint pressed_button;
PROP_ROW_SPACING,
PROP_COLUMN_SPACING,
PROP_MARGIN,
- PROP_REORDERABLE
+ PROP_REORDERABLE,
+ PROP_TOOLTIP_COLUMN
};
/* GObject vfuncs */
-static void gtk_icon_view_class_init (GtkIconViewClass *klass);
static void gtk_icon_view_cell_layout_init (GtkCellLayoutIface *iface);
static void gtk_icon_view_finalize (GObject *object);
static void gtk_icon_view_set_property (GObject *object,
/* GtkWidget vfuncs */
static void gtk_icon_view_realize (GtkWidget *widget);
static void gtk_icon_view_unrealize (GtkWidget *widget);
+static void gtk_icon_view_style_set (GtkWidget *widget,
+ GtkStyle *previous_style);
+static void gtk_icon_view_state_changed (GtkWidget *widget,
+ GtkStateType previous_state);
static void gtk_icon_view_size_request (GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_icon_view_size_allocate (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_icon_view_button_release (GtkWidget *widget,
GdkEventButton *event);
+static gboolean gtk_icon_view_key_press (GtkWidget *widget,
+ GdkEventKey *event);
+static gboolean gtk_icon_view_key_release (GtkWidget *widget,
+ GdkEventKey *event);
static AtkObject *gtk_icon_view_get_accessible (GtkWidget *widget);
static void gtk_icon_view_cell_layout_reorder (GtkCellLayout *layout,
GtkCellRenderer *cell,
gint position);
+static GList * gtk_icon_view_cell_layout_get_cells (GtkCellLayout *layout);
+
static void gtk_icon_view_item_activate_cell (GtkIconView *icon_view,
GtkIconViewItem *item,
GtkIconViewCellInfo *cell_info,
GdkEvent *event);
+static void gtk_icon_view_item_selected_changed (GtkIconView *icon_view,
+ GtkIconViewItem *item);
static void gtk_icon_view_put (GtkIconView *icon_view,
GtkWidget *widget,
GtkIconViewItem *item,
GdkEventMotion *event);
static void remove_scroll_timeout (GtkIconView *icon_view);
-
+static void clear_dest_info (GtkIconView *icon_view);
+static void clear_source_info (GtkIconView *icon_view);
+
+static void adjust_wrap_width (GtkIconView *icon_view,
+ GtkIconViewItem *item);
+
+/* GtkBuildable */
+static GtkBuildableIface *parent_buildable_iface;
+static void gtk_icon_view_buildable_init (GtkBuildableIface *iface);
+static gboolean gtk_icon_view_buildable_custom_tag_start (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ GMarkupParser *parser,
+ gpointer *data);
+static void gtk_icon_view_buildable_custom_tag_end (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ gpointer *data);
static guint icon_view_signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE_WITH_CODE (GtkIconView, gtk_icon_view, GTK_TYPE_CONTAINER,
G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
- gtk_icon_view_cell_layout_init));
+ gtk_icon_view_cell_layout_init)
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+ gtk_icon_view_buildable_init))
static void
gtk_icon_view_class_init (GtkIconViewClass *klass)
widget_class->realize = gtk_icon_view_realize;
widget_class->unrealize = gtk_icon_view_unrealize;
+ widget_class->style_set = gtk_icon_view_style_set;
+ widget_class->get_accessible = gtk_icon_view_get_accessible;
widget_class->size_request = gtk_icon_view_size_request;
widget_class->size_allocate = gtk_icon_view_size_allocate;
widget_class->expose_event = gtk_icon_view_expose;
widget_class->motion_notify_event = gtk_icon_view_motion;
widget_class->button_press_event = gtk_icon_view_button_press;
widget_class->button_release_event = gtk_icon_view_button_release;
+ widget_class->key_press_event = gtk_icon_view_key_press;
+ widget_class->key_release_event = gtk_icon_view_key_release;
widget_class->drag_begin = gtk_icon_view_drag_begin;
widget_class->drag_end = gtk_icon_view_drag_end;
widget_class->drag_data_get = gtk_icon_view_drag_data_get;
widget_class->drag_motion = gtk_icon_view_drag_motion;
widget_class->drag_drop = gtk_icon_view_drag_drop;
widget_class->drag_data_received = gtk_icon_view_drag_data_received;
- widget_class->get_accessible = gtk_icon_view_get_accessible;
+ widget_class->state_changed = gtk_icon_view_state_changed;
container_class->remove = gtk_icon_view_remove;
container_class->forall = gtk_icon_view_forall;
/**
- * GtkIconView::item-width:
+ * GtkIconView:item-width:
*
* The item-width property specifies the width to use for each item.
* If it is set to -1, the icon view will automatically determine a
GTK_PARAM_READWRITE));
/**
- * GtkIconView::spacing:
+ * GtkIconView:spacing:
*
* The spacing property specifies the space which is inserted between
* the cells (i.e. the icon and the text) of an item.
GTK_PARAM_READWRITE));
/**
- * GtkIconView::row-spacing:
+ * GtkIconView:row-spacing:
*
* The row-spacing property specifies the space which is inserted between
* the rows of the icon view.
GTK_PARAM_READWRITE));
/**
- * GtkIconView::column-spacing:
+ * GtkIconView:column-spacing:
*
* The column-spacing property specifies the space which is inserted between
* the columns of the icon view.
PROP_COLUMN_SPACING,
g_param_spec_int ("column-spacing",
P_("Column Spacing"),
- P_("Space which is inserted between grid column"),
+ P_("Space which is inserted between grid columns"),
0, G_MAXINT, 6,
GTK_PARAM_READWRITE));
/**
- * GtkIconView::margin:
+ * GtkIconView:margin:
*
* The margin property specifies the space which is inserted
* at the edges of the icon view.
/**
- * GtkIconView::orientation:
+ * GtkIconView:orientation:
*
* The orientation property specifies how the cells (i.e. the icon and
* the text) of the item are positioned relative to each other.
GTK_PARAM_READWRITE));
/**
- * GtkIconView:orientation:
+ * GtkIconView:reorderable:
*
* The reorderable property specifies if the items can be reordered
* by DND.
FALSE,
G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class,
+ PROP_TOOLTIP_COLUMN,
+ g_param_spec_int ("tooltip-column",
+ P_("Tooltip Column"),
+ P_("The column in the model containing the tooltip texts for the items"),
+ -1,
+ G_MAXINT,
+ -1,
+ GTK_PARAM_READWRITE));
+
+
+
/* Style properties */
gtk_widget_class_install_style_property (widget_class,
g_param_spec_boxed ("selection-box-color",
/* Signals */
widget_class->set_scroll_adjustments_signal =
- g_signal_new ("set_scroll_adjustments",
+ g_signal_new (I_("set_scroll_adjustments"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkIconViewClass, set_scroll_adjustments),
GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
icon_view_signals[ITEM_ACTIVATED] =
- g_signal_new ("item_activated",
+ g_signal_new (I_("item_activated"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkIconViewClass, item_activated),
GTK_TYPE_TREE_PATH);
icon_view_signals[SELECTION_CHANGED] =
- g_signal_new ("selection_changed",
+ g_signal_new (I_("selection-changed"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GtkIconViewClass, selection_changed),
G_TYPE_NONE, 0);
icon_view_signals[SELECT_ALL] =
- g_signal_new ("select_all",
+ g_signal_new (I_("select_all"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkIconViewClass, select_all),
G_TYPE_NONE, 0);
icon_view_signals[UNSELECT_ALL] =
- g_signal_new ("unselect_all",
+ g_signal_new (I_("unselect_all"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkIconViewClass, unselect_all),
G_TYPE_NONE, 0);
icon_view_signals[SELECT_CURSOR_ITEM] =
- g_signal_new ("select_cursor_item",
+ g_signal_new (I_("select_cursor_item"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkIconViewClass, select_cursor_item),
G_TYPE_NONE, 0);
icon_view_signals[TOGGLE_CURSOR_ITEM] =
- g_signal_new ("toggle_cursor_item",
+ g_signal_new (I_("toggle_cursor_item"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkIconViewClass, toggle_cursor_item),
G_TYPE_NONE, 0);
icon_view_signals[ACTIVATE_CURSOR_ITEM] =
- g_signal_new ("activate_cursor_item",
+ g_signal_new (I_("activate_cursor_item"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkIconViewClass, activate_cursor_item),
G_TYPE_BOOLEAN, 0);
icon_view_signals[MOVE_CURSOR] =
- g_signal_new ("move_cursor",
+ g_signal_new (I_("move_cursor"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkIconViewClass, move_cursor),
G_TYPE_INT);
/* Key bindings */
- gtk_binding_entry_add_signal (binding_set, GDK_a, GDK_CONTROL_MASK, "select_all", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "unselect_all", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK, "toggle_cursor_item", 0);
-
- gtk_binding_entry_add_signal (binding_set, GDK_space, 0, "activate_cursor_item", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_Return, 0, "activate_cursor_item", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_ISO_Enter, 0, "activate_cursor_item", 0);
- gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0, "activate_cursor_item", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_a, GDK_CONTROL_MASK,
+ "select_all", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
+ "unselect_all", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK,
+ "toggle_cursor_item", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_CONTROL_MASK,
+ "toggle_cursor_item", 0);
+
+ gtk_binding_entry_add_signal (binding_set, GDK_space, 0,
+ "activate_cursor_item", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, 0,
+ "activate_cursor_item", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_Return, 0,
+ "activate_cursor_item", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_ISO_Enter, 0,
+ "activate_cursor_item", 0);
+ gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0,
+ "activate_cursor_item", 0);
gtk_icon_view_add_move_binding (binding_set, GDK_Up, 0,
GTK_MOVEMENT_DISPLAY_LINES, -1);
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
}
+static void
+gtk_icon_view_buildable_init (GtkBuildableIface *iface)
+{
+ parent_buildable_iface = g_type_interface_peek_parent (iface);
+ iface->add_child = _gtk_cell_layout_buildable_add_child;
+ iface->custom_tag_start = gtk_icon_view_buildable_custom_tag_start;
+ iface->custom_tag_end = gtk_icon_view_buildable_custom_tag_end;
+}
+
static void
gtk_icon_view_cell_layout_init (GtkCellLayoutIface *iface)
{
iface->set_cell_data_func = gtk_icon_view_cell_layout_set_cell_data_func;
iface->clear_attributes = gtk_icon_view_cell_layout_clear_attributes;
iface->reorder = gtk_icon_view_cell_layout_reorder;
+ iface->get_cells = gtk_icon_view_cell_layout_get_cells;
}
static void
icon_view->priv->pixbuf_column = -1;
icon_view->priv->text_cell = -1;
icon_view->priv->pixbuf_cell = -1;
+ icon_view->priv->tooltip_column = -1;
GTK_WIDGET_SET_FLAGS (icon_view, GTK_CAN_FOCUS);
}
remove_scroll_timeout (icon_view);
+
+ if (icon_view->priv->hadjustment != NULL)
+ {
+ g_object_unref (icon_view->priv->hadjustment);
+ icon_view->priv->hadjustment = NULL;
+ }
+
+ if (icon_view->priv->vadjustment != NULL)
+ {
+ g_object_unref (icon_view->priv->vadjustment);
+ icon_view->priv->vadjustment = NULL;
+ }
+ clear_dest_info (icon_view);
+ clear_source_info (icon_view);
+
(* GTK_OBJECT_CLASS (gtk_icon_view_parent_class)->destroy) (object);
}
gtk_icon_view_set_reorderable (icon_view, g_value_get_boolean (value));
break;
+ case PROP_TOOLTIP_COLUMN:
+ gtk_icon_view_set_tooltip_column (icon_view, g_value_get_int (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_REORDERABLE:
g_value_set_boolean (value, icon_view->priv->reorderable);
break;
+ case PROP_TOOLTIP_COLUMN:
+ g_value_set_int (value, icon_view->priv->tooltip_column);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
&attributes, attributes_mask);
+ gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
gdk_window_set_user_data (widget->window, widget);
/* Make the window for the icon view */
widget->style = gtk_style_attach (widget->style, widget->window);
gdk_window_set_background (icon_view->priv->bin_window, &widget->style->base[widget->state]);
- gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
gdk_window_show (icon_view->priv->bin_window);
}
(* GTK_WIDGET_CLASS (gtk_icon_view_parent_class)->unrealize) (widget);
}
+static void
+gtk_icon_view_state_changed (GtkWidget *widget,
+ GtkStateType previous_state)
+{
+ GtkIconView *icon_view = GTK_ICON_VIEW (widget);
+
+ if (GTK_WIDGET_REALIZED (widget))
+ {
+ gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
+ gdk_window_set_background (icon_view->priv->bin_window, &widget->style->base[widget->state]);
+ }
+
+ gtk_widget_queue_draw (widget);
+}
+
+static void
+gtk_icon_view_style_set (GtkWidget *widget,
+ GtkStyle *previous_style)
+{
+ GtkIconView *icon_view = GTK_ICON_VIEW (widget);
+
+ if (GTK_WIDGET_REALIZED (widget))
+ {
+ gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
+ gdk_window_set_background (icon_view->priv->bin_window, &widget->style->base[widget->state]);
+ }
+
+ gtk_widget_queue_resize (widget);
+}
+
static void
gtk_icon_view_size_request (GtkWidget *widget,
GtkRequisition *requisition)
{
- GtkIconView *icon_view;
+ GtkIconView *icon_view = GTK_ICON_VIEW (widget);
GList *tmp_list;
- icon_view = GTK_ICON_VIEW (widget);
-
requisition->width = icon_view->priv->width;
requisition->height = icon_view->priv->height;
GtkIconView *icon_view;
gdouble value;
- GDK_THREADS_ENTER ();
-
icon_view = data;
value = MIN (icon_view->priv->vadjustment->value +
gtk_icon_view_update_rubberband (icon_view);
- GDK_THREADS_LEAVE ();
-
return TRUE;
}
icon_view->priv->event_last_y = event->y;
if (icon_view->priv->scroll_timeout_id == 0)
- icon_view->priv->scroll_timeout_id = g_timeout_add (30, rubberband_scroll_timeout,
+ icon_view->priv->scroll_timeout_id = gdk_threads_add_timeout (30, rubberband_scroll_timeout,
icon_view);
}
else
}
}
+static void
+gtk_icon_view_item_selected_changed (GtkIconView *icon_view,
+ GtkIconViewItem *item)
+{
+ AtkObject *obj;
+ AtkObject *item_obj;
+
+ obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
+ if (obj != NULL)
+ {
+ item_obj = atk_object_ref_accessible_child (obj, item->index);
+ if (item_obj != NULL)
+ {
+ atk_object_notify_state_change (item_obj, ATK_STATE_SELECTED, item->selected);
+ g_object_unref (item_obj);
+ }
+ }
+}
+
static void
gtk_icon_view_put (GtkIconView *icon_view,
GtkWidget *widget,
/* FIXME ugly special case */
if (GTK_IS_ENTRY (editable) || GTK_IS_COMBO_BOX (editable))
- g_object_set (editable, "has_frame", TRUE, NULL);
+ g_object_set (editable, "has-frame", TRUE, NULL);
/* the rest corresponds to tree_view_real_start_editing... */
icon_view->priv->edited_item = item;
* gtk_icon_view_set_cursor:
* @icon_view: A #GtkIconView
* @path: A #GtkTreePath
- * @cell: A #GtkCellRenderer or %NULL
+ * @cell: One of the cell renderers of @icon_view, or %NULL
* @start_editing: %TRUE if the specified cell should start being edited.
*
* Sets the current keyboard focus to be at @path, and selects it. This is
GtkCellRenderer *cell,
gboolean start_editing)
{
- GtkIconViewItem *item;
+ GtkIconViewItem *item = NULL;
GtkIconViewCellInfo *info = NULL;
GList *l;
gint i, cell_pos;
gtk_icon_view_stop_editing (icon_view, TRUE);
if (gtk_tree_path_get_depth (path) == 1)
- item = g_list_nth (icon_view->priv->items,
- gtk_tree_path_get_indices(path)[0])->data;
+ item = g_list_nth_data (icon_view->priv->items,
+ gtk_tree_path_get_indices(path)[0]);
if (!item)
return;
-
+
cell_pos = -1;
for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++)
{
info = l->data;
-
+
if (info->cell == cell)
{
cell_pos = i;
break;
}
-
+
info = NULL;
}
+
+ g_return_if_fail (cell == NULL || info != NULL);
gtk_icon_view_set_cursor_item (icon_view, item, cell_pos);
- if (FALSE && GTK_WIDGET_REALIZED (icon_view))
- gtk_icon_view_scroll_to_item (icon_view, item);
- else
- gtk_icon_view_scroll_to_path (icon_view, path,
- FALSE, 0.0, 0.0);
-
- if (start_editing)
+ gtk_icon_view_scroll_to_path (icon_view, path, FALSE, 0.0, 0.0);
+
+ if (info && start_editing)
gtk_icon_view_start_editing (icon_view, item, info, NULL);
}
}
icon_view->priv->last_single_clicked = NULL;
+ icon_view->priv->pressed_button = -1;
}
if (dirty)
return TRUE;
}
+static gboolean
+gtk_icon_view_key_press (GtkWidget *widget,
+ GdkEventKey *event)
+{
+ GtkIconView *icon_view = GTK_ICON_VIEW (widget);
+
+ if (icon_view->priv->doing_rubberband)
+ {
+ if (event->keyval == GDK_Escape)
+ gtk_icon_view_stop_rubberbanding (icon_view);
+
+ return TRUE;
+ }
+
+ return (* GTK_WIDGET_CLASS (gtk_icon_view_parent_class)->key_press_event) (widget, event);
+}
+
+static gboolean
+gtk_icon_view_key_release (GtkWidget *widget,
+ GdkEventKey *event)
+{
+ GtkIconView *icon_view = GTK_ICON_VIEW (widget);
+
+ if (icon_view->priv->doing_rubberband)
+ return TRUE;
+
+ return (* GTK_WIDGET_CLASS (gtk_icon_view_parent_class)->key_press_event) (widget, event);
+}
+
static void
gtk_icon_view_update_rubberband (gpointer data)
{
GList *l;
GdkRectangle box;
+ 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)
+ return FALSE;
+
for (l = icon_view->priv->cell_list; l; l = l->next)
{
GtkIconViewCellInfo *info = (GtkIconViewCellInfo *)l->data;
item->selected = FALSE;
dirty = TRUE;
gtk_icon_view_queue_draw_item (icon_view, item);
+ gtk_icon_view_item_selected_changed (icon_view, item);
}
}
if (icon_view->priv->hadjustment != hadj)
{
icon_view->priv->hadjustment = hadj;
- g_object_ref (icon_view->priv->hadjustment);
- gtk_object_sink (GTK_OBJECT (icon_view->priv->hadjustment));
+ g_object_ref_sink (icon_view->priv->hadjustment);
g_signal_connect (icon_view->priv->hadjustment, "value_changed",
G_CALLBACK (gtk_icon_view_adjustment_changed),
if (icon_view->priv->vadjustment != vadj)
{
icon_view->priv->vadjustment = vadj;
- g_object_ref (icon_view->priv->vadjustment);
- gtk_object_sink (GTK_OBJECT (icon_view->priv->vadjustment));
+ g_object_ref_sink (icon_view->priv->vadjustment);
g_signal_connect (icon_view->priv->vadjustment, "value_changed",
G_CALLBACK (gtk_icon_view_adjustment_changed),
icon_view->priv->cursor_item->selected = !icon_view->priv->cursor_item->selected;
g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
+ gtk_icon_view_item_selected_changed (icon_view, icon_view->priv->cursor_item);
gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
break;
}
gint *maximum_width)
{
gint focus_width;
- gint spacing;
gint x, current_width;
GList *items, *last_item;
gint col;
"focus-line-width", &focus_width,
NULL);
- spacing = icon_view->priv->spacing;
-
x += icon_view->priv->margin + focus_width;
current_width += 2 * (icon_view->priv->margin + focus_width);
gint row;
gint item_width;
+ if (icon_view->priv->layout_idle_id != 0)
+ {
+ g_source_remove (icon_view->priv->layout_idle_id);
+ icon_view->priv->layout_idle_id = 0;
+ }
+
if (icon_view->priv->model == NULL)
return;
}
}
+
icons = icon_view->priv->items;
y += icon_view->priv->margin;
row = 0;
+
+ if (icons)
+ {
+ gtk_icon_view_set_cell_data (icon_view, icons->data);
+ adjust_wrap_width (icon_view, icons->data);
+ }
do
{
while (icons != NULL);
if (maximum_width != icon_view->priv->width)
- {
- icon_view->priv->width = maximum_width;
- }
+ icon_view->priv->width = maximum_width;
+
y += icon_view->priv->margin;
if (y != icon_view->priv->height)
- {
- icon_view->priv->height = y;
- }
+ icon_view->priv->height = y;
+
+ gtk_icon_view_set_adjustment_upper (icon_view->priv->hadjustment,
+ icon_view->priv->width);
+ gtk_icon_view_set_adjustment_upper (icon_view->priv->vadjustment,
+ icon_view->priv->height);
- gtk_icon_view_set_adjustment_upper (icon_view->priv->hadjustment, icon_view->priv->width);
- gtk_icon_view_set_adjustment_upper (icon_view->priv->vadjustment, icon_view->priv->height);
+ if (icon_view->priv->width != widget->requisition.width ||
+ icon_view->priv->height != widget->requisition.height)
+ gtk_widget_queue_resize_no_redraw (widget);
if (GTK_WIDGET_REALIZED (icon_view))
- {
- gdk_window_resize (icon_view->priv->bin_window,
- MAX (icon_view->priv->width, widget->allocation.width),
- MAX (icon_view->priv->height, widget->allocation.height));
- }
+ gdk_window_resize (icon_view->priv->bin_window,
+ MAX (icon_view->priv->width, widget->allocation.width),
+ MAX (icon_view->priv->height, widget->allocation.height));
- if (icon_view->priv->layout_idle_id != 0)
+ if (icon_view->priv->scroll_to_path)
{
- g_source_remove (icon_view->priv->layout_idle_id);
- icon_view->priv->layout_idle_id = 0;
- }
+ GtkTreePath *path;
- gtk_widget_queue_draw (GTK_WIDGET (icon_view));
+ path = gtk_tree_row_reference_get_path (icon_view->priv->scroll_to_path);
+ gtk_tree_row_reference_free (icon_view->priv->scroll_to_path);
+ icon_view->priv->scroll_to_path = NULL;
+
+ gtk_icon_view_scroll_to_path (icon_view, path,
+ icon_view->priv->scroll_to_use_align,
+ icon_view->priv->scroll_to_row_align,
+ icon_view->priv->scroll_to_col_align);
+ gtk_tree_path_free (path);
+ }
+
+ gtk_widget_queue_draw (widget);
}
static void
GtkIconViewCellInfo *info,
GdkRectangle *cell_area)
{
+ g_return_if_fail (info->position < item->n_cells);
+
if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
cell_area->x = item->box[info->position].x - item->before[info->position];
GtkIconViewCellInfo *info,
GdkRectangle *box)
{
+ g_return_if_fail (info->position < item->n_cells);
+
*box = item->box[info->position];
}
GtkIconViewCellInfo *pixbuf_info;
gint pixbuf_width, wrap_width;
- if (icon_view->priv->item_width < 0 &&
- icon_view->priv->text_cell != -1 &&
+ if (icon_view->priv->text_cell != -1 &&
icon_view->priv->pixbuf_cell != -1)
{
+ gint item_width;
+
text_info = g_list_nth_data (icon_view->priv->cell_list,
icon_view->priv->text_cell);
pixbuf_info = g_list_nth_data (icon_view->priv->cell_list,
&pixbuf_width,
NULL);
+
+ if (icon_view->priv->item_width > 0)
+ item_width = icon_view->priv->item_width;
+ else
+ item_width = item->width;
+
if (item->width == -1)
- wrap_width = pixbuf_width;
+ {
+ if (item_width > 0)
+ wrap_width = item_width - pixbuf_width - icon_view->priv->spacing;
+ else
+ wrap_width = MAX (2 * pixbuf_width, 50);
+ }
else if (icon_view->priv->orientation == GTK_ORIENTATION_VERTICAL)
- wrap_width = item->width;
+ wrap_width = item_width;
else
- wrap_width = item->width - pixbuf_width - icon_view->priv->spacing;
+ wrap_width = item_width - pixbuf_width - icon_view->priv->spacing;
g_object_set (text_info->cell, "wrap-width", wrap_width, NULL);
+ g_object_set (text_info->cell, "width", wrap_width, NULL);
}
}
NULL, NULL, NULL,
&item->box[info->position].width,
&item->box[info->position].height);
-
+
if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
item->width += item->box[info->position].width
continue;
if (!info->cell->visible)
- continue;
-
- if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- cell_area.width = item->box[info->position].width;
- cell_area.height = item->height;
- }
- else
- {
- cell_area.width = item->width;
- cell_area.height = max_height[i];
- }
-
- gtk_cell_renderer_get_size (info->cell, GTK_WIDGET (icon_view),
- &cell_area,
- &item->box[info->position].x, &item->box[info->position].y,
- &item->box[info->position].width, &item->box[info->position].height);
-
- item->box[info->position].x += cell_area.x;
- item->box[info->position].y += cell_area.y;
- if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- item->before[info->position] = item->box[info->position].x - cell_area.x;
- item->after[info->position] = cell_area.width - item->box[info->position].width - item->before[info->position];
- cell_area.x += cell_area.width + spacing;
- }
- else
- {
- if (item->box[info->position].width > item->width)
- {
- item->width = item->box[info->position].width;
- cell_area.width = item->width;
- }
- item->before[info->position] = item->box[info->position].y - cell_area.y;
- item->after[info->position] = cell_area.height - item->box[info->position].height - item->before[info->position];
- cell_area.y += cell_area.height + spacing;
- }
- }
+ continue;
+ if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ cell_area.width = item->box[info->position].width;
+ cell_area.height = item->height;
+ }
+ else
+ {
+ cell_area.width = item->width;
+ cell_area.height = max_height[i];
+ }
+
+ gtk_cell_renderer_get_size (info->cell, GTK_WIDGET (icon_view),
+ &cell_area,
+ &item->box[info->position].x, &item->box[info->position].y,
+ &item->box[info->position].width, &item->box[info->position].height);
+
+ item->box[info->position].x += cell_area.x;
+ item->box[info->position].y += cell_area.y;
+ if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ item->before[info->position] = item->box[info->position].x - cell_area.x;
+ item->after[info->position] = cell_area.width - item->box[info->position].width - item->before[info->position];
+ cell_area.x += cell_area.width + spacing;
+ }
+ else
+ {
+ if (item->box[info->position].width > item->width)
+ {
+ item->width = item->box[info->position].width;
+ cell_area.width = item->width;
+ }
+ item->before[info->position] = item->box[info->position].y - cell_area.y;
+ item->after[info->position] = cell_area.height - item->box[info->position].height - item->before[info->position];
+ cell_area.y += cell_area.height + spacing;
+ }
+ }
+
if (rtl && icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
for (i = 0; i < icon_view->priv->n_cells; i++)
gint y,
gboolean draw_focus)
{
- gint focus_width, focus_pad;
- gint spacing, padding;
+ gint focus_width;
+ gint padding;
GdkRectangle cell_area, box;
GList *l;
gint i;
GtkStateType state;
- gboolean rtl;
GtkCellRendererState flags;
if (icon_view->priv->model == NULL)
gtk_icon_view_set_cell_data (icon_view, item);
- rtl = gtk_widget_get_direction (GTK_WIDGET (icon_view)) == GTK_TEXT_DIR_RTL;
-
gtk_widget_style_get (GTK_WIDGET (icon_view),
"focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
NULL);
- spacing = icon_view->priv->spacing;
padding = focus_width;
if (item->selected)
{
GtkIconView *icon_view;
- GDK_THREADS_ENTER ();
-
icon_view = GTK_ICON_VIEW (user_data);
icon_view->priv->layout_idle_id = 0;
gtk_icon_view_layout (icon_view);
- GDK_THREADS_LEAVE();
-
return FALSE;
}
if (icon_view->priv->layout_idle_id != 0)
return;
- icon_view->priv->layout_idle_id = g_idle_add (layout_callback, icon_view);
+ icon_view->priv->layout_idle_id = gdk_threads_add_idle (layout_callback, icon_view);
}
static void
{
AtkObject *obj;
AtkObject *item_obj;
+ AtkObject *cursor_item_obj;
if (icon_view->priv->cursor_item == item &&
(cursor_cell < 0 || cursor_cell == icon_view->priv->cursor_cell))
return;
+ obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
if (icon_view->priv->cursor_item != NULL)
- gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
-
+ {
+ gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
+ if (obj != NULL)
+ {
+ cursor_item_obj = atk_object_ref_accessible_child (obj, icon_view->priv->cursor_item->index);
+ if (cursor_item_obj != NULL)
+ atk_object_notify_state_change (cursor_item_obj, ATK_STATE_FOCUSED, FALSE);
+ }
+ }
icon_view->priv->cursor_item = item;
if (cursor_cell >= 0)
icon_view->priv->cursor_cell = cursor_cell;
gtk_icon_view_queue_draw_item (icon_view, item);
/* Notify that accessible focus object has changed */
- obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
item_obj = atk_object_ref_accessible_child (obj, item->index);
if (item_obj != NULL)
{
atk_focus_tracker_notify (item_obj);
+ atk_object_notify_state_change (item_obj, ATK_STATE_FOCUSED, TRUE);
g_object_unref (item_obj);
}
}
{
GtkIconViewItem *item = items->data;
- if (x >= item->x - icon_view->priv->row_spacing/2 && x <= item->x + item->width + icon_view->priv->row_spacing/2 &&
- y >= item->y - icon_view->priv->column_spacing/2 && y <= item->y + item->height + icon_view->priv->column_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)
{
item->selected = TRUE;
- gtk_icon_view_queue_draw_item (icon_view, item);
-
+ gtk_icon_view_item_selected_changed (icon_view, item);
g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
+
+ gtk_icon_view_queue_draw_item (icon_view, item);
}
item->selected = FALSE;
+ gtk_icon_view_item_selected_changed (icon_view, item);
g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
gtk_icon_view_queue_draw_item (icon_view, item);
GtkTreeIter *iter,
gpointer data)
{
- gint length, index;
+ gint index;
GtkIconViewItem *item;
gboolean iters_persist;
GtkIconView *icon_view;
iters_persist = gtk_tree_model_get_flags (icon_view->priv->model) & GTK_TREE_MODEL_ITERS_PERSIST;
- length = gtk_tree_model_iter_n_children (model, NULL);
index = gtk_tree_path_get_indices(path)[0];
item = gtk_icon_view_item_new ();
}
verify_items (icon_view);
+
+ gtk_icon_view_queue_layout (icon_view);
}
static void
icon_view->priv->items = g_list_delete_link (icon_view->priv->items, list);
- gtk_icon_view_queue_layout (icon_view);
-
verify_items (icon_view);
+ gtk_icon_view_queue_layout (icon_view);
+
if (emit)
g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
}
{
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
- "move_cursor", 2,
+ I_("move_cursor"), 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
col1 <= item->col && item->col <= col2)
{
if (!item->selected)
- dirty = TRUE;
-
- item->selected = TRUE;
-
+ {
+ dirty = TRUE;
+ item->selected = TRUE;
+ gtk_icon_view_item_selected_changed (icon_view, item);
+ }
gtk_icon_view_queue_draw_item (icon_view, item);
}
}
}
if (!item)
- return;
+ {
+ gtk_widget_error_bell (GTK_WIDGET (icon_view));
+ return;
+ }
if (icon_view->priv->ctrl_pressed ||
!icon_view->priv->shift_pressed ||
icon_view->priv->cursor_item,
count);
+ if (item == icon_view->priv->cursor_item)
+ gtk_widget_error_bell (GTK_WIDGET (icon_view));
+
if (!item)
return;
}
if (!item)
- return;
+ {
+ gtk_widget_error_bell (GTK_WIDGET (icon_view));
+ return;
+ }
if (icon_view->priv->ctrl_pressed ||
!icon_view->priv->shift_pressed ||
item = list ? list->data : NULL;
+ if (item == icon_view->priv->cursor_item)
+ gtk_widget_error_bell (GTK_WIDGET (icon_view));
+
if (!item)
return;
* @path: The path of the item to move to.
* @use_align: whether to use alignment arguments, or %FALSE.
* @row_align: The vertical alignment of the item specified by @path.
- * @col_align: The horizontal alignment of the item specified by @column.
+ * @col_align: The horizontal alignment of the item specified by @path.
*
* Moves the alignments of @icon_view to the position specified by @path.
- * @row_align determines where the row is placed, and @col_align determines where
- * @column is placed. Both are expected to be between 0.0 and 1.0.
- * 0.0 means left/top alignment, 1.0 means right/bottom alignment, 0.5 means center.
+ * @row_align determines where the row is placed, and @col_align determines
+ * where @column is placed. Both are expected to be between 0.0 and 1.0.
+ * 0.0 means left/top alignment, 1.0 means right/bottom alignment, 0.5 means
+ * center.
*
* If @use_align is %FALSE, then the alignment arguments are ignored, and the
* tree does the minimum amount of work to scroll the item onto the screen.
* This means that the item will be scrolled to the edge closest to its current
* position. If the item is currently visible on the screen, nothing is done.
*
- * This function only works if the model is set, and @path is a valid row on the
- * model. If the model changes before the @icon_view is realized, the centered
- * path will be modified to reflect this change.
+ * This function only works if the model is set, and @path is a valid row on
+ * the model. If the model changes before the @icon_view is realized, the
+ * centered path will be modified to reflect this change.
*
* Since: 2.8
**/
g_return_if_fail (row_align >= 0.0 && row_align <= 1.0);
g_return_if_fail (col_align >= 0.0 && col_align <= 1.0);
- if (! GTK_WIDGET_REALIZED (icon_view))
+ if (gtk_tree_path_get_depth (path) > 0)
+ item = g_list_nth_data (icon_view->priv->items,
+ gtk_tree_path_get_indices(path)[0]);
+
+ if (!GTK_WIDGET_REALIZED (icon_view) || !item || item->width < 0)
{
if (icon_view->priv->scroll_to_path)
gtk_tree_row_reference_free (icon_view->priv->scroll_to_path);
return;
}
- if (gtk_tree_path_get_depth (path) > 0)
- item = g_list_nth_data (icon_view->priv->items,
- gtk_tree_path_get_indices(path)[0]);
-
- if (!item)
- return;
-
if (use_align)
{
- gint x, y, width, height;
+ gint x, y;
gint focus_width;
gfloat offset, value;
gdk_drawable_get_size (GDK_DRAWABLE (icon_view->priv->bin_window),
&width, &height);
gdk_window_get_position (icon_view->priv->bin_window, &x, &y);
-
+
if (y + item->y - focus_width < 0)
gtk_adjustment_set_value (icon_view->priv->vadjustment,
icon_view->priv->vadjustment->value + y + item->y - focus_width);
GtkTreePath *path;
path = gtk_tree_path_new_from_indices (item->index, -1);
- gtk_tree_model_get_iter (icon_view->priv->model, &iter, path);
+ if (!gtk_tree_model_get_iter (icon_view->priv->model, &iter, path))
+ return;
gtk_tree_path_free (path);
}
else
g_object_thaw_notify (G_OBJECT (info->cell));
}
-
- adjust_wrap_width (icon_view, item);
}
static void
g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
g_return_if_fail (!gtk_icon_view_get_cell_info (icon_view, renderer));
- g_object_ref (renderer);
- gtk_object_sink (GTK_OBJECT (renderer));
+ g_object_ref_sink (renderer);
info = g_new0 (GtkIconViewCellInfo, 1);
info->cell = renderer;
g_return_if_fail (GTK_IS_CELL_RENDERER (renderer));
g_return_if_fail (!gtk_icon_view_get_cell_info (icon_view, renderer));
- g_object_ref (renderer);
- gtk_object_sink (GTK_OBJECT (renderer));
+ g_object_ref_sink (renderer);
info = g_new0 (GtkIconViewCellInfo, 1);
info->cell = renderer;
g_return_if_fail (link != NULL);
- icon_view->priv->cell_list = g_list_remove_link (icon_view->priv->cell_list,
- link);
+ icon_view->priv->cell_list = g_list_delete_link (icon_view->priv->cell_list,
+ link);
icon_view->priv->cell_list = g_list_insert (icon_view->priv->cell_list,
info, position);
gtk_widget_queue_draw (GTK_WIDGET (icon_view));
}
+static GList *
+gtk_icon_view_cell_layout_get_cells (GtkCellLayout *layout)
+{
+ GtkIconView *icon_view = (GtkIconView *)layout;
+ GList *retval = NULL, *l;
+
+ for (l = icon_view->priv->cell_list; l; l = l->next)
+ {
+ GtkIconViewCellInfo *info = (GtkIconViewCellInfo *)l->data;
+
+ retval = g_list_prepend (retval, info->cell);
+ }
+
+ return g_list_reverse (retval);
+}
+
/* Public API */
return g_object_new (GTK_TYPE_ICON_VIEW, "model", model, NULL);
}
+/**
+ * gtk_icon_view_convert_widget_to_bin_window_coords:
+ * @wx: X coordinate relative to the widget
+ * @wy: Y coordinate relative to the widget
+ * @bx: return location for bin_window X coordinate
+ * @by: return location for bin_window Y coordinate
+ *
+ * Converts widget coordinates to coordinates for the bin_window,
+ * as expected by e.g. gtk_icon_view_get_path_at_pos().
+ *
+ * Since: 2.12
+ */
+void
+gtk_icon_view_convert_widget_to_bin_window_coords (GtkIconView *icon_view,
+ gint wx,
+ gint wy,
+ gint *bx,
+ gint *by)
+{
+ gint x, y;
+
+ g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
+
+ if (icon_view->priv->bin_window)
+ gdk_window_get_position (icon_view->priv->bin_window, &x, &y);
+ else
+ x = y = 0;
+
+ if (bx)
+ *bx = wx - x;
+ if (by)
+ *by = wy - y;
+}
/**
* gtk_icon_view_get_path_at_pos:
* @x: The x position to be identified
* @y: The y position to be identified
*
- * Finds the path at the point (@x, @y), relative to widget coordinates.
+ * Finds the path at the point (@x, @y), relative to bin_window coordinates.
* See gtk_icon_view_get_item_at_pos(), if you are also interested in
- * the cell at the specified position.
+ * the cell at the specified position.
+ * See gtk_icon_view_convert_widget_to_bin_window_coords() for converting
+ * widget coordinates to bin_window coordinates.
*
* Return value: The #GtkTreePath corresponding to the icon or %NULL
* if no icon exists at that position.
* @cell: Return location for the renderer responsible for the cell
* at (@x, @y), or %NULL
*
- * Finds the path at the point (@x, @y), relative to widget coordinates.
+ * Finds the path at the point (@x, @y), relative to bin_window coordinates.
* In contrast to gtk_icon_view_get_path_at_pos(), this function also
* obtains the cell at the specified position. The returned path should
* be freed with gtk_tree_path_free().
+ * See gtk_icon_view_convert_widget_to_bin_window_coords() for converting
+ * widget coordinates to bin_window coordinates.
*
* Return value: %TRUE if an item exists at the specified position
*
return (item != NULL);
}
+/**
+ * gtk_icon_view_set_tooltip_item:
+ * @icon_view: a #GtkIconView
+ * @tooltip: a #GtkTooltip
+ * @path: a #GtkTreePath
+ *
+ * Sets the tip area of @tooltip to be the area covered by the item at @path.
+ * See also gtk_tooltip_set_tip_area().
+ *
+ * Since: 2.12
+ */
+void
+gtk_icon_view_set_tooltip_item (GtkIconView *icon_view,
+ GtkTooltip *tooltip,
+ GtkTreePath *path)
+{
+ g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
+ g_return_if_fail (GTK_IS_TOOLTIP (tooltip));
+
+ gtk_icon_view_set_tooltip_cell (icon_view, tooltip, path, NULL);
+}
+
+/**
+ * gtk_icon_view_set_tooltip_cell:
+ * @icon_view: a #GtkIconView
+ * @tooltip: a #GtkTooltip
+ * @path: a #GtkTreePath
+ * @cell: a #GtkCellRenderer or %NULL
+ *
+ * Sets the tip area of @tooltip to the area which @cell occupies in
+ * the item pointed to by @path. See also gtk_tooltip_set_tip_area().
+ *
+ * Since: 2.12
+ */
+void
+gtk_icon_view_set_tooltip_cell (GtkIconView *icon_view,
+ GtkTooltip *tooltip,
+ GtkTreePath *path,
+ GtkCellRenderer *cell)
+{
+ GdkRectangle rect;
+ GtkIconViewItem *item = NULL;
+ GtkIconViewCellInfo *info = NULL;
+ gint x, y;
+
+ g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
+ g_return_if_fail (GTK_IS_TOOLTIP (tooltip));
+ g_return_if_fail (cell == NULL || GTK_IS_CELL_RENDERER (cell));
+
+ if (gtk_tree_path_get_depth (path) > 0)
+ item = g_list_nth_data (icon_view->priv->items,
+ gtk_tree_path_get_indices(path)[0]);
+
+ if (!item)
+ return;
+
+ if (cell)
+ {
+ info = gtk_icon_view_get_cell_info (icon_view, cell);
+ gtk_icon_view_get_cell_area (icon_view, item, info, &rect);
+ }
+ else
+ {
+ rect.x = item->x;
+ rect.y = item->y;
+ rect.width = item->width;
+ rect.height = item->height;
+ }
+
+ if (icon_view->priv->bin_window)
+ {
+ gdk_window_get_position (icon_view->priv->bin_window, &x, &y);
+ rect.x += x;
+ rect.y += y;
+ }
+
+ gtk_tooltip_set_tip_area (tooltip, &rect);
+}
+
+
+/**
+ * gtk_icon_view_get_tooltip_context:
+ * @icon_view: an #GtkIconView
+ * @x: the x coordinate (relative to widget coordinates)
+ * @y: the y coordinate (relative to widget coordinates)
+ * @keyboard_tip: whether this is a keyboard tooltip or not
+ * @model: a pointer to receive a #GtkTreeModel or %NULL
+ * @path: a pointer to receive a #GtkTreePath or %NULL
+ * @iter: a pointer to receive a #GtkTreeIter or %NULL
+ *
+ * This function is supposed to be used in a #GtkWidget::query-tooltip
+ * signal handler for #GtkIconView. The @x, @y and @keyboard_tip values
+ * which are received in the signal handler, should be passed to this
+ * function without modification.
+ *
+ * The return value indicates whether there is an icon view item at the given
+ * coordinates (%TRUE) or not (%FALSE) for mouse tooltips. For keyboard
+ * tooltips the item returned will be the cursor item. When %TRUE, then any of
+ * @model, @path and @iter which have been provided will be set to point to
+ * that row and the corresponding model. @x and @y will always be converted
+ * to be relative to @icon_view's bin_window if @keyboard_tooltip is %FALSE.
+ *
+ * Return value: whether or not the given tooltip context points to a item
+ *
+ * Since: 2.12
+ */
+gboolean
+gtk_icon_view_get_tooltip_context (GtkIconView *icon_view,
+ gint *x,
+ gint *y,
+ gboolean keyboard_tip,
+ GtkTreeModel **model,
+ GtkTreePath **path,
+ GtkTreeIter *iter)
+{
+ GtkTreePath *tmppath = NULL;
+
+ g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), FALSE);
+ g_return_val_if_fail (x != NULL, FALSE);
+ g_return_val_if_fail (y != NULL, FALSE);
+
+ if (keyboard_tip)
+ {
+ gtk_icon_view_get_cursor (icon_view, &tmppath, NULL);
+
+ if (!tmppath)
+ return FALSE;
+ }
+ else
+ {
+ gtk_icon_view_convert_widget_to_bin_window_coords (icon_view, *x, *y,
+ x, y);
+
+ if (!gtk_icon_view_get_item_at_pos (icon_view, *x, *y, &tmppath, NULL))
+ return FALSE;
+ }
+
+ if (model)
+ *model = gtk_icon_view_get_model (icon_view);
+
+ if (iter)
+ gtk_tree_model_get_iter (gtk_icon_view_get_model (icon_view),
+ iter, tmppath);
+
+ if (path)
+ *path = tmppath;
+ else
+ gtk_tree_path_free (tmppath);
+
+ return TRUE;
+}
+
+static gboolean
+gtk_icon_view_set_tooltip_query_cb (GtkWidget *widget,
+ gint x,
+ gint y,
+ gboolean keyboard_tip,
+ GtkTooltip *tooltip,
+ gpointer data)
+{
+ gchar *str;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+ GtkTreeModel *model;
+ GtkIconView *icon_view = GTK_ICON_VIEW (widget);
+
+ if (!gtk_icon_view_get_tooltip_context (GTK_ICON_VIEW (widget),
+ &x, &y,
+ keyboard_tip,
+ &model, &path, &iter))
+ return FALSE;
+
+ gtk_tree_model_get (model, &iter, icon_view->priv->tooltip_column, &str, -1);
+
+ if (!str)
+ {
+ gtk_tree_path_free (path);
+ return FALSE;
+ }
+
+ gtk_tooltip_set_markup (tooltip, str);
+ gtk_icon_view_set_tooltip_item (icon_view, tooltip, path);
+
+ gtk_tree_path_free (path);
+ g_free (str);
+
+ return TRUE;
+}
+
+
+/**
+ * gtk_icon_view_set_tooltip_column:
+ * @icon_view: a #GtkIconView
+ *
+ * @column: an integer, which is a valid column number for @icon_view's model
+ *
+ * If you only plan to have simple (text-only) tooltips on full items, you
+ * can use this function to have #GtkIconView handle these automatically
+ * for you. @column should be set to the column in @icon_view's model
+ * containing the tooltip texts, or -1 to disable this feature.
+ *
+ * When enabled, #GtkWidget::has-tooltip will be set to %TRUE and
+ * @icon_view will connect a #GtkWidget::query-tooltip signal handler.
+ *
+ * Since: 2.12
+ */
+void
+gtk_icon_view_set_tooltip_column (GtkIconView *icon_view,
+ gint column)
+{
+ g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
+
+ if (column == icon_view->priv->tooltip_column)
+ return;
+
+ if (column == -1)
+ {
+ g_signal_handlers_disconnect_by_func (icon_view,
+ gtk_icon_view_set_tooltip_query_cb,
+ NULL);
+ gtk_widget_set_has_tooltip (GTK_WIDGET (icon_view), FALSE);
+ }
+ else
+ {
+ if (icon_view->priv->tooltip_column == -1)
+ {
+ g_signal_connect (icon_view, "query-tooltip",
+ G_CALLBACK (gtk_icon_view_set_tooltip_query_cb), NULL);
+ gtk_widget_set_has_tooltip (GTK_WIDGET (icon_view), TRUE);
+ }
+ }
+
+ icon_view->priv->tooltip_column = column;
+ g_object_notify (G_OBJECT (icon_view), "tooltip-column");
+}
+
+/**
+ * gtk_icon_view_get_tooltip_column:
+ * @icon_view: a #GtkIconView
+ *
+ * Returns the column of @icon_view's model which is being used for
+ * displaying tooltips on @icon_view's rows.
+ *
+ * Return value: the index of the tooltip column that is currently being
+ * used, or -1 if this is disabled.
+ *
+ * Since: 2.12
+ */
+gint
+gtk_icon_view_get_tooltip_column (GtkIconView *icon_view)
+{
+ g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), 0);
+
+ return icon_view->priv->tooltip_column;
+}
/**
* gtk_icon_view_get_visible_range:
{
gint start_index = -1;
gint end_index = -1;
- GtkIconViewItem *item;
GList *icons;
g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), FALSE);
{
if (icon_view->priv->text_cell != -1)
{
+ 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,
icon_view->priv->text_cell);
- g_list_remove (icon_view->priv->cell_list, info);
+ icon_view->priv->cell_list = g_list_remove (icon_view->priv->cell_list, info);
free_cell_info (info);
if (icon_view->priv->orientation == GTK_ORIENTATION_VERTICAL)
g_object_set (info->cell,
- "wrap_mode", PANGO_WRAP_CHAR,
- "wrap_width", icon_view->priv->item_width,
- "xalign", 0.5,
+ "alignment", PANGO_ALIGN_CENTER,
+ "wrap-mode", PANGO_WRAP_WORD_CHAR,
+ "xalign", 0.0,
"yalign", 0.0,
NULL);
else
g_object_set (info->cell,
- "wrap_mode", PANGO_WRAP_CHAR,
- "wrap_width", icon_view->priv->item_width,
+ "alignment", PANGO_ALIGN_LEFT,
+ "wrap-mode", PANGO_WRAP_WORD_CHAR,
"xalign", 0.0,
"yalign", 0.0,
NULL);
{
if (icon_view->priv->pixbuf_cell != -1)
{
+ 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,
icon_view->priv->pixbuf_cell);
- g_list_remove (icon_view->priv->cell_list, info);
+ icon_view->priv->cell_list = g_list_remove (icon_view->priv->cell_list, info);
free_cell_info (info);
if (icon_view->priv->orientation == GTK_ORIENTATION_VERTICAL)
g_object_set (info->cell,
- "follow_state", TRUE,
+ "follow-state", TRUE,
"xalign", 0.5,
"yalign", 1.0,
NULL);
else
g_object_set (info->cell,
- "follow_state", TRUE,
+ "follow-state", TRUE,
"xalign", 0.0,
"yalign", 0.0,
NULL);
/**
* gtk_icon_view_set_text_column:
* @icon_view: A #GtkIconView.
- * @column: A column in the currently used model.
+ * @column: A column in the currently used model, or -1 to display no text
*
* Sets the column with text for @icon_view to be @column. The text
* column must be of type #G_TYPE_STRING.
/**
* gtk_icon_view_set_markup_column:
* @icon_view: A #GtkIconView.
- * @column: A column in the currently used model.
+ * @column: A column in the currently used model, or -1 to display no text
*
* Sets the column with markup information for @icon_view to be
* @column. The markup column must be of type #G_TYPE_STRING.
/**
* gtk_icon_view_set_pixbuf_column:
* @icon_view: A #GtkIconView.
- * @column: A column in the currently used model.
+ * @column: A column in the currently used model, or -1 to disable
*
* Sets the column with pixbufs for @icon_view to be @column. The pixbuf
* column must be of type #GDK_TYPE_PIXBUF
g_return_if_fail (icon_view->priv->model != NULL);
g_return_if_fail (path != NULL);
- item = g_list_nth (icon_view->priv->items,
- gtk_tree_path_get_indices(path)[0])->data;
+ item = g_list_nth_data (icon_view->priv->items,
+ gtk_tree_path_get_indices(path)[0]);
if (!item)
return;
* To do this, you can use gtk_tree_row_reference_new().
*
* To free the return value, use:
- * <informalexample><programlisting>
+ * |[
* g_list_foreach (list, gtk_tree_path_free, NULL);
* g_list_free (list);
- * </programlisting></informalexample>
+ * ]|
*
* Return value: A #GList containing a #GtkTreePath for each selected row.
*
* @path: A #GtkTreePath to check selection on.
*
* Returns %TRUE if the icon pointed to by @path is currently
- * selected. If @icon does not point to a valid location, %FALSE is returned.
+ * selected. If @path does not point to a valid location, %FALSE is returned.
*
* Return value: %TRUE if @path is selected.
*
g_return_val_if_fail (icon_view->priv->model != NULL, FALSE);
g_return_val_if_fail (path != NULL, FALSE);
- item = g_list_nth (icon_view->priv->items,
- gtk_tree_path_get_indices(path)[0])->data;
+ item = g_list_nth_data (icon_view->priv->items,
+ gtk_tree_path_get_indices(path)[0]);
if (!item)
return FALSE;
GdkDragAction suggested_action)
{
g_object_set_data (G_OBJECT (context),
- "gtk-icon-view-status-pending",
+ I_("gtk-icon-view-status-pending"),
GINT_TO_POINTER (suggested_action));
}
{
if (source_row)
g_object_set_data_full (G_OBJECT (context),
- "gtk-icon-view-source-row",
+ I_("gtk-icon-view-source-row"),
gtk_tree_row_reference_new (model, source_row),
(GDestroyNotify) gtk_tree_row_reference_free);
else
g_object_set_data_full (G_OBJECT (context),
- "gtk-icon-view-source-row",
+ I_("gtk-icon-view-source-row"),
NULL, NULL);
}
if (!dest_row)
{
g_object_set_data_full (G_OBJECT (context),
- "gtk-icon-view-dest-row",
+ I_("gtk-icon-view-dest-row"),
NULL, NULL);
return;
}
dr->empty_view_drop = empty_view_drop;
dr->drop_append_mode = drop_append_mode;
g_object_set_data_full (G_OBJECT (context),
- "gtk-icon-view-dest-row",
+ I_("gtk-icon-view-dest-row"),
dr, (GDestroyNotify) dest_row_free);
}
{
GtkIconView *icon_view = GTK_ICON_VIEW (data);
- GDK_THREADS_ENTER ();
-
gtk_icon_view_autoscroll (icon_view);
- GDK_THREADS_LEAVE ();
-
return TRUE;
}
goto done;
/* If drag_data_get does nothing, try providing row data. */
- if (selection_data->target == gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE))
+ if (selection_data->target == gdk_atom_intern_static_string ("GTK_TREE_MODEL_ROW"))
gtk_tree_set_row_drag_data (selection_data,
model,
source_row);
guint time)
{
GtkTreePath *path = NULL;
- GtkTreeModel *model;
GtkIconViewDropPosition pos;
GtkIconView *icon_view;
GdkDragAction suggested_action = 0;
gtk_icon_view_get_drag_dest_item (icon_view, &path, &pos);
/* we only know this *after* set_desination_row */
- model = gtk_icon_view_get_model (icon_view);
empty = icon_view->priv->empty_view_drop;
if (path == NULL && !empty)
if (icon_view->priv->scroll_timeout_id == 0)
{
icon_view->priv->scroll_timeout_id =
- g_timeout_add (50, drag_scroll_timeout, icon_view);
+ gdk_threads_add_timeout (50, drag_scroll_timeout, icon_view);
}
- if (target == gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE))
+ if (target == gdk_atom_intern_static_string ("GTK_TREE_MODEL_ROW"))
{
/* Request data so we can use the source row when
* determining whether to accept the drop
* @icon_view: a #GtkIconView
* @targets: the table of targets that the drag will support
* @n_targets: the number of items in @targets
- * @actions: the bitmask of possible actions for a drag from this
+ * @actions: the bitmask of possible actions for a drag to this
* widget
*
* Turns @icon_view into a drop destination for automatic DND.
* gtk_icon_view_set_drag_dest_item:
* @icon_view: a #GtkIconView
* @path: The path of the item to highlight, or %NULL.
- * @pos: Specifies whether to drop, relative to the item
+ * @pos: Specifies where to drop, relative to the item
*
* Sets the item that is highlighted for feedback.
*
* @icon_view: a #GtkIconView
* @drag_x: the position to determine the destination item for
* @drag_y: the position to determine the destination item for
- * @path: Return location for the path of the highlighted item, or %NULL.
+ * @path: Return location for the path of the item, or %NULL.
* @pos: Return location for the drop position, or %NULL
*
* Determines the destination item for a given position.
gint index;
GdkRectangle area;
+ g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), NULL);
+ g_return_val_if_fail (path != NULL, NULL);
+
widget = GTK_WIDGET (icon_view);
+ if (!GTK_WIDGET_REALIZED (widget))
+ return NULL;
+
index = gtk_tree_path_get_indices (path)[0];
for (l = icon_view->priv->items; l; l = l->next)
GtkIconView *icon_view;
GtkTreePath *path;
- GDK_THREADS_ENTER ();
-
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (data);
item->action_idle_handler = 0;
gtk_tree_path_free (path);
}
- GDK_THREADS_LEAVE ();
-
return FALSE;
}
gint i)
{
GtkIconViewItemAccessible *item;
- GtkIconView *icon_view;
if (i < 0 || i >= LAST_ACTION)
return FALSE;
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return FALSE;
- icon_view = GTK_ICON_VIEW (item->widget);
-
switch (i)
{
case ACTION_ACTIVATE:
if (!item->action_idle_handler)
- item->action_idle_handler = g_idle_add (gtk_icon_view_item_accessible_idle_do_action, item);
+ item->action_idle_handler = gdk_threads_add_idle (gtk_icon_view_item_accessible_idle_do_action, item);
break;
default:
g_assert_not_reached ();
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (action);
- if (item->action_descriptions[i])
- g_free (item->action_descriptions[i]);
+ g_free (item->action_descriptions[i]);
item->action_descriptions[i] = g_strdup (description);
return unichar;
}
+#if 0
static void
get_pango_text_offsets (PangoLayout *layout,
GtkTextBuffer *buffer,
iter = pango_layout_get_iter (layout);
do
{
- line = pango_layout_iter_get_line (iter);
+ line = pango_layout_iter_get_line_readonly (iter);
start_index = line->start_index;
end_index = start_index + line->length;
{
case ATK_TEXT_BOUNDARY_LINE_START:
if (pango_layout_iter_next_line (iter))
- end_index = pango_layout_iter_get_line (iter)->start_index;
+ end_index = pango_layout_iter_get_line_readonly (iter)->start_index;
break;
case ATK_TEXT_BOUNDARY_LINE_END:
if (prev_line)
*/
if (pango_layout_iter_next_line (iter))
{
- line = pango_layout_iter_get_line (iter);
+ line = pango_layout_iter_get_line_readonly (iter);
switch (boundary_type)
{
case ATK_TEXT_BOUNDARY_LINE_START:
start_index = line->start_index;
if (pango_layout_iter_next_line (iter))
- end_index = pango_layout_iter_get_line (iter)->start_index;
+ end_index = pango_layout_iter_get_line_readonly (iter)->start_index;
else
end_index = start_index + line->length;
break;
gtk_text_buffer_get_iter_at_offset (buffer, start_iter, *start_offset);
gtk_text_buffer_get_iter_at_offset (buffer, end_iter, *end_offset);
}
+#endif
static gchar*
gtk_icon_view_item_accessible_text_get_text_before_offset (AtkText *text,
GtkIconViewItemAccessible *item;
GtkTextIter start, end;
GtkTextBuffer *buffer;
+#if 0
GtkIconView *icon_view;
+#endif
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
break;
case ATK_TEXT_BOUNDARY_LINE_START:
case ATK_TEXT_BOUNDARY_LINE_END:
- icon_view = GTK_ICON_VIEW (item->widget);
#if 0
+ icon_view = GTK_ICON_VIEW (item->widget);
/* FIXME we probably have to use GailTextCell to salvage this */
gtk_icon_view_update_item_text (icon_view, item->item);
get_pango_text_offsets (icon_view->priv->layout,
GtkIconViewItemAccessible *item;
GtkTextIter start, end;
GtkTextBuffer *buffer;
+#if 0
GtkIconView *icon_view;
+#endif
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
break;
case ATK_TEXT_BOUNDARY_LINE_START:
case ATK_TEXT_BOUNDARY_LINE_END:
- icon_view = GTK_ICON_VIEW (item->widget);
#if 0
+ icon_view = GTK_ICON_VIEW (item->widget);
/* FIXME we probably have to use GailTextCell to salvage this */
gtk_icon_view_update_item_text (icon_view, item->item);
get_pango_text_offsets (icon_view->priv->layout,
GtkIconViewItemAccessible *item;
GtkTextIter start, end;
GtkTextBuffer *buffer;
+#if 0
GtkIconView *icon_view;
+#endif
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
break;
case ATK_TEXT_BOUNDARY_LINE_START:
case ATK_TEXT_BOUNDARY_LINE_END:
- icon_view = GTK_ICON_VIEW (item->widget);
#if 0
+ icon_view = GTK_ICON_VIEW (item->widget);
/* FIXME we probably have to use GailTextCell to salvage this */
gtk_icon_view_update_item_text (icon_view, item->item);
get_pango_text_offsets (icon_view->priv->layout,
AtkCoordType coord_type)
{
GtkIconViewItemAccessible *item;
+#if 0
GtkIconView *icon_view;
PangoRectangle char_rect;
const gchar *item_text;
gint index;
+#endif
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return;
- icon_view = GTK_ICON_VIEW (item->widget);
#if 0
+ icon_view = GTK_ICON_VIEW (item->widget);
/* FIXME we probably have to use GailTextCell to salvage this */
gtk_icon_view_update_item_text (icon_view, item->item);
item_text = pango_layout_get_text (icon_view->priv->layout);
AtkCoordType coord_type)
{
GtkIconViewItemAccessible *item;
+ gint offset = 0;
+#if 0
GtkIconView *icon_view;
const gchar *item_text;
gint index;
- gint offset;
gint l_x, l_y;
+#endif
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return -1;
- icon_view = GTK_ICON_VIEW (item->widget);
#if 0
+ icon_view = GTK_ICON_VIEW (item->widget);
/* FIXME we probably have to use GailTextCell to salvage this */
gtk_icon_view_update_item_text (icon_view, item->item);
atk_component_get_position (ATK_COMPONENT (text), &l_x, &l_y, coord_type);
atk_state_set_add_state (item->state_set, ATK_STATE_FOCUSED);
else
atk_state_set_remove_state (item->state_set, ATK_STATE_FOCUSED);
+ if (item->item->selected)
+ atk_state_set_add_state (item->state_set, ATK_STATE_SELECTED);
+ else
+ atk_state_set_remove_state (item->state_set, ATK_STATE_SELECTED);
return g_object_ref (item->state_set);
}
if (!type)
{
- static const GTypeInfo tinfo =
+ const GTypeInfo tinfo =
{
sizeof (GtkIconViewItemAccessibleClass),
(GBaseInitFunc) NULL, /* base init */
};
type = g_type_register_static (ATK_TYPE_OBJECT,
- g_intern_static_string ("GtkIconViewItemAccessible"), &tinfo, 0);
+ I_("GtkIconViewItemAccessible"), &tinfo, 0);
g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
&atk_component_info);
g_type_add_interface_static (type, ATK_TYPE_ACTION,
obj = gtk_icon_view_accessible_find_child (accessible, index);
if (!obj)
{
+ gchar *text;
+
obj = g_object_new (gtk_icon_view_item_accessible_get_type (), NULL);
gtk_icon_view_item_accessible_info_new (accessible,
obj,
a11y_item->text_buffer = gtk_text_buffer_new (NULL);
gtk_icon_view_set_cell_data (icon_view, item);
- gtk_text_buffer_set_text (a11y_item->text_buffer,
- get_text (icon_view, item), -1);
+ text = get_text (icon_view, item);
+ if (text)
+ {
+ gtk_text_buffer_set_text (a11y_item->text_buffer, text, -1);
+ g_free (text);
+ }
gtk_icon_view_item_accessible_set_visibility (a11y_item, FALSE);
g_object_add_weak_pointer (G_OBJECT (widget), (gpointer) &(a11y_item->widget));
AtkObject *atk_obj;
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data));
- g_signal_emit_by_name (atk_obj, "visible-data-changed");
+ g_signal_emit_by_name (atk_obj, "visible_data_changed");
return;
}
{
GtkIconViewAccessiblePrivate *priv;
GtkIconViewItemAccessibleInfo *info;
- GtkIconViewAccessible *view;
GtkIconView *icon_view;
GtkIconViewItemAccessible *item;
GList *items;
- GList *tmp_list;
AtkObject *atk_obj;
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data));
icon_view = GTK_ICON_VIEW (user_data);
- view = GTK_ICON_VIEW_ACCESSIBLE (atk_obj);
priv = gtk_icon_view_accessible_get_priv (atk_obj);
items = priv->items;
- tmp_list = NULL;
while (items)
{
info = items->data;
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (info->item);
info->index = new_order[info->index];
- tmp_list = g_list_nth (icon_view->priv->items, info->index);
- item->item = tmp_list->data;
+ item->item = g_list_nth_data (icon_view->priv->items, info->index);
items = items->next;
}
priv->items = g_list_sort (priv->items,
GObject *obj;
obj = G_OBJECT (icon_view->priv->model);
- g_signal_connect_data (obj, "row-changed",
+ g_signal_connect_data (obj, "row_changed",
(GCallback) gtk_icon_view_accessible_model_row_changed,
icon_view, NULL, 0);
- g_signal_connect_data (obj, "row-inserted",
+ g_signal_connect_data (obj, "row_inserted",
(GCallback) gtk_icon_view_accessible_model_row_inserted,
icon_view, NULL, G_CONNECT_AFTER);
- g_signal_connect_data (obj, "row-deleted",
+ g_signal_connect_data (obj, "row_deleted",
(GCallback) gtk_icon_view_accessible_model_row_deleted,
icon_view, NULL, G_CONNECT_AFTER);
- g_signal_connect_data (obj, "rows-reordered",
+ g_signal_connect_data (obj, "rows_reordered",
(GCallback) gtk_icon_view_accessible_model_rows_reordered,
icon_view, NULL, G_CONNECT_AFTER);
}
GtkIconView *icon_view;
GtkWidget *widget;
AtkObject *atk_obj;
- GtkIconViewAccessible *view;
GtkIconViewAccessiblePrivate *priv;
if (strcmp (pspec->name, "model") == 0)
{
widget = GTK_WIDGET (obj);
atk_obj = gtk_widget_get_accessible (widget);
- view = GTK_ICON_VIEW_ACCESSIBLE (atk_obj);
priv = gtk_icon_view_accessible_get_priv (atk_obj);
if (priv->model)
{
GtkWidget *widget;
GtkIconView *icon_view;
GtkIconViewItem *item;
- GList *l;
widget = GTK_ACCESSIBLE (selection)->widget;
if (widget == NULL)
icon_view = GTK_ICON_VIEW (widget);
- l = g_list_nth (icon_view->priv->items, i);
- if (!l)
+ item = g_list_nth_data (icon_view->priv->items, i);
+
+ if (!item)
return FALSE;
- item = l->data;
gtk_icon_view_select_item (icon_view, item);
return TRUE;
gtk_icon_view_accessible_ref_selection (AtkSelection *selection,
gint i)
{
+ GList *l;
GtkWidget *widget;
GtkIconView *icon_view;
GtkIconViewItem *item;
- GList *l;
widget = GTK_ACCESSIBLE (selection)->widget;
if (widget == NULL)
GtkWidget *widget;
GtkIconView *icon_view;
GtkIconViewItem *item;
- GList *l;
widget = GTK_ACCESSIBLE (selection)->widget;
if (widget == NULL)
return FALSE;
icon_view = GTK_ICON_VIEW (widget);
- l = g_list_nth (icon_view->priv->items, i);
- if (!l)
- return FALSE;
- item = l->data;
+ item = g_list_nth_data (icon_view->priv->items, i);
+ if (!item)
+ return FALSE;
return item->selected;
}
tinfo.instance_size = query.instance_size;
type = g_type_register_static (derived_atk_type,
- "GtkIconViewAccessible",
+ I_("GtkIconViewAccessible"),
&tinfo, 0);
g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
&atk_component_info);
if (!type)
{
- static const GTypeInfo tinfo =
+ const GTypeInfo tinfo =
{
sizeof (AtkObjectFactoryClass),
NULL, /* base_init */
};
type = g_type_register_static (ATK_TYPE_OBJECT_FACTORY,
- "GtkIconViewAccessibleFactory",
+ I_("GtkIconViewAccessibleFactory"),
&tinfo, 0);
}
return type;
return (* GTK_WIDGET_CLASS (gtk_icon_view_parent_class)->get_accessible) (widget);
}
+static gboolean
+gtk_icon_view_buildable_custom_tag_start (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ GMarkupParser *parser,
+ gpointer *data)
+{
+ if (parent_buildable_iface->custom_tag_start (buildable, builder, child,
+ tagname, parser, data))
+ return TRUE;
+
+ return _gtk_cell_layout_buildable_custom_tag_start (buildable, builder, child,
+ tagname, parser, data);
+}
+
+static void
+gtk_icon_view_buildable_custom_tag_end (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ gpointer *data)
+{
+ if (strcmp (tagname, "attributes") == 0)
+ _gtk_cell_layout_buildable_custom_tag_end (buildable, builder, child, tagname,
+ data);
+ else
+ parent_buildable_iface->custom_tag_end (buildable, builder, child, tagname,
+ data);
+}
+
+
+
#define __GTK_ICON_VIEW_C__
#include "gtkaliasdef.c"