summaryrefslogtreecommitdiff
path: root/gtk/gtkiconview.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2011-01-31 17:34:37 -0500
committerMatthias Clasen <mclasen@redhat.com>2011-01-31 17:39:42 -0500
commit726b0d8736a9d5ac8d7f2395f234662b204290fc (patch)
treea189b93f5ce6aaec7a300efb170d6c1231a5639b /gtk/gtkiconview.c
parent1f3a5a8d92927ce9ce22bc8dcd8fe990e6f8431f (diff)
downloadgtk+-726b0d8736a9d5ac8d7f2395f234662b204290fc.tar.gz
Bandaid fix for icon view subclassing
I've decided that it is isn't feasible to make cell areas runtime-settable in the time we have left before 3.0, therefore, I'm going with the approach to allow init() functions to instantiate the default cell area and issue a warning if a construct property is ignored. This is not ideal, but it keeps existing icon view and combo box subclasses working. https://bugzilla.gnome.org/show_bug.cgi?id=639139
Diffstat (limited to 'gtk/gtkiconview.c')
-rw-r--r--gtk/gtkiconview.c79
1 files changed, 53 insertions, 26 deletions
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index 781c66819e..7e107da962 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -370,6 +370,9 @@ static GtkIconViewItem * gtk_icon_view_get_item_at_coords (GtkIco
static void gtk_icon_view_set_cell_data (GtkIconView *icon_view,
GtkIconViewItem *item);
+static void gtk_icon_view_ensure_cell_area (GtkIconView *icon_view,
+ GtkCellArea *cell_area);
+
static GtkCellArea *gtk_icon_view_cell_layout_get_area (GtkCellLayout *layout);
static void gtk_icon_view_item_selected_changed (GtkIconView *icon_view,
@@ -1100,35 +1103,14 @@ gtk_icon_view_constructor (GType type,
GObjectConstructParam *construct_properties)
{
GtkIconView *icon_view;
- GtkIconViewPrivate *priv;
GObject *object;
object = G_OBJECT_CLASS (gtk_icon_view_parent_class)->constructor
(type, n_construct_properties, construct_properties);
icon_view = (GtkIconView *) object;
- priv = icon_view->priv;
-
- if (!priv->cell_area)
- {
- priv->cell_area = gtk_cell_area_box_new ();
- g_object_ref_sink (priv->cell_area);
- }
-
- if (GTK_IS_ORIENTABLE (priv->cell_area))
- gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->cell_area), priv->item_orientation);
-
- priv->cell_area_context = gtk_cell_area_create_context (priv->cell_area);
- 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->context_changed_id =
- g_signal_connect (priv->cell_area_context, "notify",
- G_CALLBACK (gtk_icon_view_context_changed), icon_view);
+ gtk_icon_view_ensure_cell_area (icon_view, NULL);
return object;
}
@@ -1237,9 +1219,17 @@ gtk_icon_view_set_property (GObject *object,
case PROP_CELL_AREA:
/* Construct-only, can only be assigned once */
area = g_value_get_object (value);
-
if (area)
- icon_view->priv->cell_area = g_object_ref_sink (area);
+ {
+ if (icon_view->priv->cell_area != NULL)
+ {
+ g_warning ("cell-area has already been set, ignoring construct property");
+ g_object_ref_sink (area);
+ g_object_unref (area);
+ }
+ else
+ gtk_icon_view_ensure_cell_area (icon_view, area);
+ }
break;
case PROP_HADJUSTMENT:
@@ -4097,21 +4087,58 @@ gtk_icon_view_scroll_to_item (GtkIconView *icon_view,
}
/* GtkCellLayout implementation */
+
+static void
+gtk_icon_view_ensure_cell_area (GtkIconView *icon_view,
+ GtkCellArea *cell_area)
+{
+ GtkIconViewPrivate *priv = icon_view->priv;
+
+ if (priv->cell_area)
+ return;
+
+ if (cell_area)
+ priv->cell_area = cell_area;
+ else
+ priv->cell_area = gtk_cell_area_box_new ();
+
+ g_object_ref_sink (priv->cell_area);
+
+ if (GTK_IS_ORIENTABLE (priv->cell_area))
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->cell_area), priv->item_orientation);
+
+ priv->cell_area_context = gtk_cell_area_create_context (priv->cell_area);
+
+ 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->context_changed_id =
+ g_signal_connect (priv->cell_area_context, "notify",
+ G_CALLBACK (gtk_icon_view_context_changed), icon_view);
+}
+
static GtkCellArea *
gtk_icon_view_cell_layout_get_area (GtkCellLayout *cell_layout)
{
GtkIconView *icon_view = GTK_ICON_VIEW (cell_layout);
+ GtkIconViewPrivate *priv = icon_view->priv;
+
+ if (G_UNLIKELY (!priv->cell_area))
+ gtk_icon_view_ensure_cell_area (icon_view, NULL);
return icon_view->priv->cell_area;
}
static void
-gtk_icon_view_set_cell_data (GtkIconView *icon_view,
+gtk_icon_view_set_cell_data (GtkIconView *icon_view,
GtkIconViewItem *item)
{
gboolean iters_persist;
GtkTreeIter iter;
-
+
iters_persist = gtk_tree_model_get_flags (icon_view->priv->model) & GTK_TREE_MODEL_ITERS_PERSIST;
if (!iters_persist)