diff options
author | Benjamin Otte <otte@redhat.com> | 2015-12-08 11:27:37 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2015-12-09 13:30:40 +0100 |
commit | 866e7dc733aa059ec5760ef14d03fef1aaf8577c (patch) | |
tree | f17009f3ba526a65c5a37d7e2306d8baa7e86220 /gtk/gtkcellrendererpixbuf.c | |
parent | 01387428a359a2a3f04f81514e5cf622e1d981fe (diff) | |
download | gtk+-866e7dc733aa059ec5760ef14d03fef1aaf8577c.tar.gz |
cellrendererpixbuf: Create iconhelper on-demand
Instead of storing one in the priv structure, only store an image
definition there.
This will allow future refactorings of the icon helper.
Diffstat (limited to 'gtk/gtkcellrendererpixbuf.c')
-rw-r--r-- | gtk/gtkcellrendererpixbuf.c | 94 |
1 files changed, 61 insertions, 33 deletions
diff --git a/gtk/gtkcellrendererpixbuf.c b/gtk/gtkcellrendererpixbuf.c index 6459c0934f..09597ce204 100644 --- a/gtk/gtkcellrendererpixbuf.c +++ b/gtk/gtkcellrendererpixbuf.c @@ -87,8 +87,8 @@ enum { struct _GtkCellRendererPixbufPrivate { - GtkIconHelper *icon_helper; - GtkIconSize icon_size; + GtkImageDefinition *image_def; + GtkIconSize icon_size; GdkPixbuf *pixbuf_expander_open; GdkPixbuf *pixbuf_expander_closed; @@ -108,8 +108,7 @@ gtk_cell_renderer_pixbuf_init (GtkCellRendererPixbuf *cellpixbuf) cellpixbuf->priv = gtk_cell_renderer_pixbuf_get_instance_private (cellpixbuf); priv = cellpixbuf->priv; - priv->icon_helper = _gtk_icon_helper_new (); - _gtk_icon_helper_set_force_scale_pixbuf (priv->icon_helper, TRUE); + priv->image_def = gtk_image_definition_new_empty (); priv->icon_size = GTK_ICON_SIZE_MENU; priv->follow_state = TRUE; } @@ -120,7 +119,7 @@ gtk_cell_renderer_pixbuf_finalize (GObject *object) GtkCellRendererPixbuf *cellpixbuf = GTK_CELL_RENDERER_PIXBUF (object); GtkCellRendererPixbufPrivate *priv = cellpixbuf->priv; - g_clear_object (&priv->icon_helper); + gtk_image_definition_unref (priv->image_def); if (priv->pixbuf_expander_open) g_object_unref (priv->pixbuf_expander_open); @@ -284,7 +283,7 @@ gtk_cell_renderer_pixbuf_get_property (GObject *object, switch (param_id) { case PROP_PIXBUF: - g_value_set_object (value, _gtk_icon_helper_peek_pixbuf (priv->icon_helper)); + g_value_set_object (value, gtk_image_definition_get_pixbuf (priv->image_def)); break; case PROP_PIXBUF_EXPANDER_OPEN: g_value_set_object (value, priv->pixbuf_expander_open); @@ -293,10 +292,10 @@ gtk_cell_renderer_pixbuf_get_property (GObject *object, g_value_set_object (value, priv->pixbuf_expander_closed); break; case PROP_SURFACE: - g_value_set_boxed (value, _gtk_icon_helper_peek_surface (priv->icon_helper)); + g_value_set_boxed (value, gtk_image_definition_get_surface (priv->image_def)); break; case PROP_STOCK_ID: - g_value_set_string (value, _gtk_icon_helper_get_stock_id (priv->icon_helper)); + g_value_set_string (value, gtk_image_definition_get_stock (priv->image_def)); break; case PROP_STOCK_SIZE: g_value_set_uint (value, priv->icon_size); @@ -308,10 +307,10 @@ gtk_cell_renderer_pixbuf_get_property (GObject *object, g_value_set_boolean (value, priv->follow_state); break; case PROP_ICON_NAME: - g_value_set_string (value, _gtk_icon_helper_get_icon_name (priv->icon_helper)); + g_value_set_string (value, gtk_image_definition_get_icon_name (priv->image_def)); break; case PROP_GICON: - g_value_set_object (value, _gtk_icon_helper_peek_gicon (priv->icon_helper)); + g_value_set_object (value, gtk_image_definition_get_gicon (priv->image_def)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -320,14 +319,10 @@ gtk_cell_renderer_pixbuf_get_property (GObject *object, } static void -notify_old_storage_type (GtkCellRendererPixbuf *cellpixbuf, - GtkImageType new_storage_type, - GtkImageType old_storage_type) +notify_storage_type (GtkCellRendererPixbuf *cellpixbuf, + GtkImageType storage_type) { - if (new_storage_type == old_storage_type) - return; - - switch (old_storage_type) + switch (storage_type) { case GTK_IMAGE_SURFACE: g_object_notify (G_OBJECT (cellpixbuf), "surface"); @@ -344,13 +339,36 @@ notify_old_storage_type (GtkCellRendererPixbuf *cellpixbuf, case GTK_IMAGE_GICON: g_object_notify (G_OBJECT (cellpixbuf), "gicon"); break; - case GTK_IMAGE_EMPTY: default: + case GTK_IMAGE_ANIMATION: + g_assert_not_reached (); + case GTK_IMAGE_EMPTY: break; } } static void +take_image_definition (GtkCellRendererPixbuf *cellpixbuf, + GtkImageDefinition *def) +{ + GtkCellRendererPixbufPrivate *priv; + GtkImageType old_storage_type, new_storage_type; + + if (def == NULL) + def = gtk_image_definition_new_empty (); + + priv = cellpixbuf->priv; + old_storage_type = gtk_image_definition_get_storage_type (priv->image_def); + new_storage_type = gtk_image_definition_get_storage_type (def); + + if (new_storage_type != old_storage_type) + notify_storage_type (cellpixbuf, old_storage_type); + + gtk_image_definition_unref (priv->image_def); + priv->image_def = def; +} + +static void gtk_cell_renderer_pixbuf_set_property (GObject *object, guint param_id, const GValue *value, @@ -358,13 +376,11 @@ gtk_cell_renderer_pixbuf_set_property (GObject *object, { GtkCellRendererPixbuf *cellpixbuf = GTK_CELL_RENDERER_PIXBUF (object); GtkCellRendererPixbufPrivate *priv = cellpixbuf->priv; - GtkImageType old_storage_type = _gtk_icon_helper_get_storage_type (priv->icon_helper); switch (param_id) { case PROP_PIXBUF: - notify_old_storage_type (cellpixbuf, GTK_IMAGE_PIXBUF, old_storage_type); - _gtk_icon_helper_set_pixbuf (priv->icon_helper, g_value_get_object (value)); + take_image_definition (cellpixbuf, gtk_image_definition_new_pixbuf (g_value_get_object (value), 1)); break; case PROP_PIXBUF_EXPANDER_OPEN: if (priv->pixbuf_expander_open) @@ -377,31 +393,26 @@ gtk_cell_renderer_pixbuf_set_property (GObject *object, priv->pixbuf_expander_closed = (GdkPixbuf*) g_value_dup_object (value); break; case PROP_SURFACE: - notify_old_storage_type (cellpixbuf, GTK_IMAGE_SURFACE, old_storage_type); - _gtk_icon_helper_set_surface (priv->icon_helper, g_value_get_boxed (value)); + take_image_definition (cellpixbuf, gtk_image_definition_new_surface (g_value_get_boxed (value))); break; case PROP_STOCK_ID: - notify_old_storage_type (cellpixbuf, GTK_IMAGE_STOCK, old_storage_type); - _gtk_icon_helper_set_stock_id (priv->icon_helper, g_value_get_string (value), priv->icon_size); + take_image_definition (cellpixbuf, gtk_image_definition_new_stock (g_value_get_string (value))); break; case PROP_STOCK_SIZE: priv->icon_size = g_value_get_uint (value); - _gtk_icon_helper_set_icon_size (priv->icon_helper, priv->icon_size); break; case PROP_STOCK_DETAIL: g_free (priv->stock_detail); priv->stock_detail = g_value_dup_string (value); break; case PROP_ICON_NAME: - notify_old_storage_type (cellpixbuf, GTK_IMAGE_ICON_NAME, old_storage_type); - _gtk_icon_helper_set_icon_name (priv->icon_helper, g_value_get_string (value), priv->icon_size); + take_image_definition (cellpixbuf, gtk_image_definition_new_icon_name (g_value_get_string (value))); break; case PROP_FOLLOW_STATE: priv->follow_state = g_value_get_boolean (value); break; case PROP_GICON: - notify_old_storage_type (cellpixbuf, GTK_IMAGE_GICON, old_storage_type); - _gtk_icon_helper_set_gicon (priv->icon_helper, g_value_get_object (value), priv->icon_size); + take_image_definition (cellpixbuf, gtk_image_definition_new_gicon (g_value_get_object (value))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -428,6 +439,20 @@ gtk_cell_renderer_pixbuf_new (void) return g_object_new (GTK_TYPE_CELL_RENDERER_PIXBUF, NULL); } +static GtkIconHelper * +create_icon_helper (GtkCellRendererPixbuf *cellpixbuf) +{ + GtkCellRendererPixbufPrivate *priv = cellpixbuf->priv; + GtkIconHelper *helper; + + helper = _gtk_icon_helper_new (); + _gtk_icon_helper_set_force_scale_pixbuf (helper, TRUE); + _gtk_icon_helper_set_definition (helper, priv->image_def); + _gtk_icon_helper_set_icon_size (helper, priv->icon_size); + + return helper; +} + static void gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell, GtkWidget *widget, @@ -445,16 +470,19 @@ gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell, gint calc_height; gint xpad, ypad; GtkStyleContext *context; + GtkIconHelper *icon_helper; context = gtk_widget_get_style_context (widget); gtk_style_context_save (context); gtk_style_context_add_class (context, GTK_STYLE_CLASS_IMAGE); + icon_helper = create_icon_helper (cellpixbuf); - if (!_gtk_icon_helper_get_is_empty (priv->icon_helper)) - _gtk_icon_helper_get_size (priv->icon_helper, + if (!_gtk_icon_helper_get_is_empty (icon_helper)) + _gtk_icon_helper_get_size (icon_helper, gtk_widget_get_style_context (widget), &pixbuf_width, &pixbuf_height); + g_object_unref (icon_helper); gtk_style_context_restore (context); if (priv->pixbuf_expander_open) @@ -562,7 +590,7 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell, } if (icon_helper == NULL) - icon_helper = g_object_ref (priv->icon_helper); + icon_helper = create_icon_helper (cellpixbuf); _gtk_icon_helper_set_window (icon_helper, gtk_widget_get_window (widget)); |