[gimp] libgimpwidgets: properly implement GimpCellRendererToggle's icon-name property



commit 3372ca82daa3968be9a4b45ae779be0a3750c1e8
Author: Michael Natterer <mitch gimp org>
Date:   Thu May 8 12:38:50 2014 +0200

    libgimpwidgets: properly implement GimpCellRendererToggle's icon-name property
    
    and change the parameter of new() from stock_id to icon_name.

 libgimpwidgets/gimpcellrenderertoggle.c |  127 ++++++++++++++++++++-----------
 libgimpwidgets/gimpcellrenderertoggle.h |    2 +-
 2 files changed, 85 insertions(+), 44 deletions(-)
---
diff --git a/libgimpwidgets/gimpcellrenderertoggle.c b/libgimpwidgets/gimpcellrenderertoggle.c
index 74ae2ed..2670149 100644
--- a/libgimpwidgets/gimpcellrenderertoggle.c
+++ b/libgimpwidgets/gimpcellrenderertoggle.c
@@ -57,6 +57,19 @@ enum
 };
 
 
+typedef struct _GimpCellRendererTogglePrivate GimpCellRendererTogglePrivate;
+
+struct _GimpCellRendererTogglePrivate
+{
+  gchar *icon_name;
+};
+
+#define GET_PRIVATE(obj) \
+        G_TYPE_INSTANCE_GET_PRIVATE (obj, \
+                                     GIMP_TYPE_CELL_RENDERER_TOGGLE, \
+                                     GimpCellRendererTogglePrivate)
+
+
 static void gimp_cell_renderer_toggle_finalize     (GObject         *object);
 static void gimp_cell_renderer_toggle_get_property (GObject         *object,
                                                     guint            param_id,
@@ -124,28 +137,29 @@ gimp_cell_renderer_toggle_class_init (GimpCellRendererToggleClass *klass)
   cell_class->render         = gimp_cell_renderer_toggle_render;
   cell_class->activate       = gimp_cell_renderer_toggle_activate;
 
-  g_object_class_install_property (object_class,
-                                   PROP_ICON_NAME,
+  g_object_class_install_property (object_class, PROP_ICON_NAME,
                                    g_param_spec_string ("icon-name",
                                                         NULL, NULL,
                                                         NULL,
                                                         GIMP_PARAM_READWRITE |
                                                         G_PARAM_CONSTRUCT));
-  g_object_class_install_property (object_class,
-                                   PROP_STOCK_ID,
+
+  g_object_class_install_property (object_class, PROP_STOCK_ID,
                                    g_param_spec_string ("stock-id",
                                                         NULL, NULL,
                                                         NULL,
                                                         GIMP_PARAM_READWRITE |
                                                         G_PARAM_CONSTRUCT));
-  g_object_class_install_property (object_class,
-                                   PROP_STOCK_SIZE,
+
+  g_object_class_install_property (object_class, PROP_STOCK_SIZE,
                                    g_param_spec_int ("stock-size",
                                                      NULL, NULL,
                                                      0, G_MAXINT,
                                                      DEFAULT_ICON_SIZE,
                                                      GIMP_PARAM_READWRITE |
                                                      G_PARAM_CONSTRUCT));
+
+  g_type_class_add_private (object_class, sizeof (GimpCellRendererTogglePrivate));
 }
 
 static void
@@ -156,7 +170,14 @@ gimp_cell_renderer_toggle_init (GimpCellRendererToggle *toggle)
 static void
 gimp_cell_renderer_toggle_finalize (GObject *object)
 {
-  GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
+  GimpCellRendererToggle        *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
+  GimpCellRendererTogglePrivate *priv   = GET_PRIVATE (object);
+
+  if (priv->icon_name)
+    {
+      g_free (priv->icon_name);
+      priv->icon_name = NULL;
+    }
 
   if (toggle->stock_id)
     {
@@ -179,17 +200,19 @@ gimp_cell_renderer_toggle_get_property (GObject    *object,
                                         GValue     *value,
                                         GParamSpec *pspec)
 {
-  GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
+  GimpCellRendererToggle        *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
+  GimpCellRendererTogglePrivate *priv   = GET_PRIVATE (object);
 
   switch (param_id)
     {
     case PROP_ICON_NAME:
-      /* FIXME icon name */
-      g_value_set_string (value, toggle->stock_id);
+      g_value_set_string (value, priv->icon_name);
       break;
+
     case PROP_STOCK_ID:
       g_value_set_string (value, toggle->stock_id);
       break;
+
     case PROP_STOCK_SIZE:
       g_value_set_int (value, toggle->stock_size);
       break;
@@ -206,21 +229,23 @@ gimp_cell_renderer_toggle_set_property (GObject      *object,
                                         const GValue *value,
                                         GParamSpec   *pspec)
 {
-  GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
+  GimpCellRendererToggle        *toggle = GIMP_CELL_RENDERER_TOGGLE (object);
+  GimpCellRendererTogglePrivate *priv   = GET_PRIVATE (object);
 
   switch (param_id)
     {
     case PROP_ICON_NAME:
-      /* FIXME icon name */
-      if (toggle->stock_id)
-        g_free (toggle->stock_id);
-      toggle->stock_id = g_value_dup_string (value);
+      if (priv->icon_name)
+        g_free (priv->icon_name);
+      priv->icon_name = g_value_dup_string (value);
       break;
+
     case PROP_STOCK_ID:
       if (toggle->stock_id)
         g_free (toggle->stock_id);
       toggle->stock_id = g_value_dup_string (value);
       break;
+
     case PROP_STOCK_SIZE:
       toggle->stock_size = g_value_get_int (value);
       break;
@@ -246,18 +271,19 @@ gimp_cell_renderer_toggle_get_size (GtkCellRenderer *cell,
                                     gint            *width,
                                     gint            *height)
 {
-  GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
-  GtkStyle               *style  = gtk_widget_get_style (widget);
-  gint                    calc_width;
-  gint                    calc_height;
-  gint                    pixbuf_width;
-  gint                    pixbuf_height;
-  gfloat                  xalign;
-  gfloat                  yalign;
-  gint                    xpad;
-  gint                    ypad;
-
-  if (! toggle->stock_id)
+  GimpCellRendererToggle        *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
+  GimpCellRendererTogglePrivate *priv   = GET_PRIVATE (cell);
+  GtkStyle                      *style  = gtk_widget_get_style (widget);
+  gint                           calc_width;
+  gint                           calc_height;
+  gint                           pixbuf_width;
+  gint                           pixbuf_height;
+  gfloat                         xalign;
+  gfloat                         yalign;
+  gint                           xpad;
+  gint                           ypad;
+
+  if (! priv->icon_name && ! toggle->stock_id)
     {
       GTK_CELL_RENDERER_CLASS (parent_class)->get_size (cell,
                                                         widget,
@@ -314,16 +340,17 @@ gimp_cell_renderer_toggle_render (GtkCellRenderer      *cell,
                                   GdkRectangle         *expose_area,
                                   GtkCellRendererState  flags)
 {
-  GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
-  GtkStyle               *style  = gtk_widget_get_style (widget);
-  GdkRectangle            toggle_rect;
-  GdkRectangle            draw_rect;
-  GtkStateType            state;
-  gboolean                active;
-  gint                    xpad;
-  gint                    ypad;
-
-  if (! toggle->stock_id)
+  GimpCellRendererToggle        *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
+  GimpCellRendererTogglePrivate *priv   = GET_PRIVATE (cell);
+  GtkStyle                      *style  = gtk_widget_get_style (widget);
+  GdkRectangle                   toggle_rect;
+  GdkRectangle                   draw_rect;
+  GtkStateType                   state;
+  gboolean                       active;
+  gint                           xpad;
+  gint                           ypad;
+
+  if (! priv->icon_name && ! toggle->stock_id)
     {
       GTK_CELL_RENDERER_CLASS (parent_class)->render (cell, window, widget,
                                                       background_area,
@@ -449,12 +476,26 @@ static void
 gimp_cell_renderer_toggle_create_pixbuf (GimpCellRendererToggle *toggle,
                                          GtkWidget              *widget)
 {
+  GimpCellRendererTogglePrivate *priv = GET_PRIVATE (toggle);
+
   if (toggle->pixbuf)
     g_object_unref (toggle->pixbuf);
 
-  if (FALSE)
+  if (priv->icon_name)
     {
-      /* FIXME icon name */
+      gint width, height;
+
+      if (! gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (widget),
+                                               toggle->stock_size,
+                                               &width, &height))
+        {
+          width  = 20;
+          height = 20;
+        }
+
+      toggle->pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+                                                 priv->icon_name,
+                                                 MIN (width, height), 0, NULL);
     }
   else
     {
@@ -467,10 +508,10 @@ gimp_cell_renderer_toggle_create_pixbuf (GimpCellRendererToggle *toggle,
 
 /**
  * gimp_cell_renderer_toggle_new:
- * @stock_id: the stock_id of the icon to use for the active state
+ * @icon_name: the icon name of the icon to use for the active state
  *
  * Creates a custom version of the #GtkCellRendererToggle. Instead of
- * showing the standard toggle button, it shows a stock icon if the
+ * showing the standard toggle button, it shows a named icon if the
  * cell is active and no icon otherwise. This cell renderer is for
  * example used in the Layers treeview to indicate and control the
  * layer's visibility by showing %GIMP_STOCK_VISIBLE.
@@ -480,10 +521,10 @@ gimp_cell_renderer_toggle_create_pixbuf (GimpCellRendererToggle *toggle,
  * Since: GIMP 2.2
  **/
 GtkCellRenderer *
-gimp_cell_renderer_toggle_new (const gchar *stock_id)
+gimp_cell_renderer_toggle_new (const gchar *icon_name)
 {
   return g_object_new (GIMP_TYPE_CELL_RENDERER_TOGGLE,
-                       "stock-id", stock_id,
+                       "icon-name", icon_name,
                        NULL);
 }
 
diff --git a/libgimpwidgets/gimpcellrenderertoggle.h b/libgimpwidgets/gimpcellrenderertoggle.h
index 333be20..16dd185 100644
--- a/libgimpwidgets/gimpcellrenderertoggle.h
+++ b/libgimpwidgets/gimpcellrenderertoggle.h
@@ -66,7 +66,7 @@ struct _GimpCellRendererToggleClass
 
 GType             gimp_cell_renderer_toggle_get_type (void) G_GNUC_CONST;
 
-GtkCellRenderer * gimp_cell_renderer_toggle_new      (const gchar *stock_id);
+GtkCellRenderer * gimp_cell_renderer_toggle_new      (const gchar *icon_name);
 
 void    gimp_cell_renderer_toggle_clicked (GimpCellRendererToggle *cell,
                                            const gchar            *path,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]