[gtk+/toolpalette] GtkToolPalette: Use gtk-toolbar-style and gtk-toolbar-icon-size settings.



commit eb76666f1c25d4cd38d231dca49c960c6d5e3b4d
Author: Murray Cumming <murrayc murrayc com>
Date:   Thu Jul 16 17:51:55 2009 +0200

    GtkToolPalette: Use gtk-toolbar-style and gtk-toolbar-icon-size settings.
    
    	* gtk/gtksettings.c: (settings_install_property_parser): Handle enums too.
    	* gtk/gtktoolbar.c (gtk_toolbar_class_init): Move the gtk-toolbar-style and
    	gtk-toolbar-icon-size settings into GtkSettings because we now use it in
    	GtkToolPalette too.
    
    	* gtk/gtktoolpalette.[h|c]: Add gtk_tool_palette_unset_style() and
    	gtk_tool_palette_unset_icon_size(), and use the toolbar-style and
    	icon-size from GtkSettings if these are not set via the set functions.
    
    	* demos/gtk-demo/toolpalette.c (on_combo_style_changed),
    	(do_toolpalette): Add and handle a -1 value to mean the desktop "Default"
    	toolbar style.

 demos/gtk-demo/toolpalette.c        |    8 +-
 docs/reference/ChangeLog            |    6 +
 docs/reference/gtk/gtk-sections.txt |    2 +
 gtk/gtksettings.c                   |   39 +++++-
 gtk/gtktoolbar.c                    |   14 --
 gtk/gtktoolpalette.c                |  275 +++++++++++++++++++++++++++++++++--
 gtk/gtktoolpalette.h                |    2 +
 7 files changed, 319 insertions(+), 27 deletions(-)
---
diff --git a/demos/gtk-demo/toolpalette.c b/demos/gtk-demo/toolpalette.c
index 5422f0b..befa2a0 100644
--- a/demos/gtk-demo/toolpalette.c
+++ b/demos/gtk-demo/toolpalette.c
@@ -46,7 +46,10 @@ static void on_combo_style_changed(GtkComboBox *combo_box, gpointer user_data)
   gint val = 0;
   gtk_tree_model_get (model, &iter, 1, &val, -1);
   
-  gtk_tool_palette_set_style (palette, val);
+  if (val == -1)
+    gtk_tool_palette_unset_style (palette);
+  else
+    gtk_tool_palette_set_style (palette, val);
 }
 
 GtkWidget *
@@ -112,6 +115,9 @@ do_toolpalette (GtkWidget *do_widget)
       gtk_list_store_append (combo_style_model, &iter);
       gtk_list_store_set (combo_style_model, &iter,
         0, "Icons", 1, GTK_TOOLBAR_ICONS, -1);
+      gtk_list_store_append (combo_style_model, &iter);
+      gtk_list_store_set (combo_style_model, &iter,
+        0, "Default", 1, -1 /* A custom meaning for this demo. */, -1);
       combo_style = gtk_combo_box_new_with_model (  
         GTK_TREE_MODEL (combo_style_model));
       cell_renderer = gtk_cell_renderer_text_new ();
diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog
index 3c5d41c..250d56a 100644
--- a/docs/reference/ChangeLog
+++ b/docs/reference/ChangeLog
@@ -1,3 +1,9 @@
+2009-07-16  Murray Cumming  <murrayc murrayc com>
+
+	reviewed by: <delete if not using a buddy>
+
+	* gtk/gtk-sections.txt:
+
 2009-07-14  Murray Cumming  <murrayc murrayc-x61>
 
 	reviewed by: <delete if not using a buddy>
diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt
index e2398ad..dcc5e85 100644
--- a/docs/reference/gtk/gtk-sections.txt
+++ b/docs/reference/gtk/gtk-sections.txt
@@ -4451,6 +4451,7 @@ gtk_tool_palette_get_icon_size
 gtk_tool_palette_set_icon_size
 gtk_tool_palette_get_style
 gtk_tool_palette_set_style
+gtk_tool_palette_unset_style
 gtk_tool_palette_add_drag_dest
 gtk_tool_palette_get_drag_item
 gtk_tool_palette_get_drag_target_group
@@ -4515,6 +4516,7 @@ gtk_tool_palette_get_group_position
 gtk_tool_palette_set_group_position
 gtk_tool_palette_get_icon_size
 gtk_tool_palette_set_icon_size
+gtk_tool_palette_unset_icon_size
 gtk_tool_palette_get_orientation
 gtk_tool_palette_set_orientation
 gtk_tool_palette_get_style
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index c3c1a78..2e507e3 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -116,7 +116,9 @@ enum {
   PROP_SOUND_THEME_NAME,
   PROP_ENABLE_INPUT_FEEDBACK_SOUNDS,
   PROP_ENABLE_EVENT_SOUNDS,
-  PROP_ENABLE_TOOLTIPS
+  PROP_ENABLE_TOOLTIPS,
+  PROP_TOOLBAR_STYLE,
+  PROP_TOOLBAR_ICON_SIZE
 };
 
 
@@ -961,6 +963,40 @@ gtk_settings_class_init (GtkSettingsClass *class)
                                                                    GTK_PARAM_READWRITE),
                                              NULL);
   g_assert (result == PROP_ENABLE_TOOLTIPS);
+
+  /**
+   * GtkSettings:toolbar-style:
+   *
+   * The size of icons in default toolbars.
+   *
+   * Since: 2.18
+   */
+  result = settings_install_property_parser (class,
+                                             g_param_spec_enum ("gtk-toolbar-style",
+                                                                   P_("Toolbar style"),
+                                                                   P_("Whether default toolbars have text only, text and icons, icons only, etc."),
+                                                                   GTK_TYPE_TOOLBAR_STYLE,
+                                                                   GTK_TOOLBAR_BOTH,
+                                                                   GTK_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_TOOLBAR_STYLE);
+
+  /**
+   * GtkSettings:toolbar-icon-size:
+   *
+   * The size of icons in default toolbars.
+   *
+   * Since: 2.18
+   */
+  result = settings_install_property_parser (class,
+                                             g_param_spec_enum ("gtk-toolbar-icon-size",
+                                                                   P_("Toolbar Icon Size"),
+                                                                   P_("The size of icons in default toolbars."),
+                                                                   GTK_TYPE_ICON_SIZE,
+                                                                   GTK_ICON_SIZE_LARGE_TOOLBAR,
+                                                                   GTK_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_TOOLBAR_ICON_SIZE);
 }
 
 static void
@@ -1310,6 +1346,7 @@ settings_install_property_parser (GtkSettingsClass   *class,
     case G_TYPE_FLOAT:
     case G_TYPE_DOUBLE:
     case G_TYPE_STRING:
+    case G_TYPE_ENUM:
       break;
     case G_TYPE_BOXED:
       if (strcmp (g_param_spec_get_name (pspec), "color-hash") == 0)
diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c
index 6b1f053..70126ca 100644
--- a/gtk/gtktoolbar.c
+++ b/gtk/gtktoolbar.c
@@ -625,20 +625,6 @@ gtk_toolbar_class_init (GtkToolbarClass *klass)
                                                               GTK_TYPE_SHADOW_TYPE,
                                                               GTK_SHADOW_OUT,
                                                               GTK_PARAM_READABLE));
-  
-  gtk_settings_install_property (g_param_spec_enum ("gtk-toolbar-style",
-                                                    P_("Toolbar style"),
-                                                    P_("Whether default toolbars have text only, text and icons, icons only, etc."),
-                                                    GTK_TYPE_TOOLBAR_STYLE,
-                                                    DEFAULT_TOOLBAR_STYLE,
-                                                    GTK_PARAM_READWRITE));
-  
-  gtk_settings_install_property (g_param_spec_enum ("gtk-toolbar-icon-size",
-                                                    P_("Toolbar icon size"),
-                                                    P_("Size of icons in default toolbars"),
-                                                    GTK_TYPE_ICON_SIZE,
-                                                    DEFAULT_ICON_SIZE,
-                                                    GTK_PARAM_READWRITE));  
 
   binding_set = gtk_binding_set_by_class (klass);
   
diff --git a/gtk/gtktoolpalette.c b/gtk/gtktoolpalette.c
index 363ee3e..b6a06bb 100644
--- a/gtk/gtktoolpalette.c
+++ b/gtk/gtktoolpalette.c
@@ -109,6 +109,7 @@ enum
 {
   PROP_NONE,
   PROP_ICON_SIZE,
+  PROP_ICON_SIZE_SET,
   PROP_ORIENTATION,
   PROP_TOOLBAR_STYLE,
 };
@@ -139,12 +140,17 @@ struct _GtkToolPalettePrivate
   GtkAdjustment        *vadjustment;
 
   GtkIconSize           icon_size;
+  gboolean              icon_size_set;
   GtkOrientation        orientation;
   GtkToolbarStyle       style;
+  gboolean              style_set;
 
   GtkWidget            *expanding_child;
 
   GtkSizeGroup         *text_size_group;
+  
+  GtkSettings       *settings;
+  gulong             settings_connection;
 
   guint                 sparse_groups : 1;
   guint                 drag_source : 2;
@@ -182,8 +188,10 @@ gtk_tool_palette_init (GtkToolPalette *palette)
   palette->priv->groups = g_new0 (GtkToolItemGroupInfo, palette->priv->groups_size);
 
   palette->priv->icon_size = DEFAULT_ICON_SIZE;
+  palette->priv->icon_size_set = FALSE;
   palette->priv->orientation = DEFAULT_ORIENTATION;
   palette->priv->style = DEFAULT_TOOLBAR_STYLE;
+  palette->priv->style_set = FALSE;
 
   palette->priv->text_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
 }
@@ -219,6 +227,14 @@ gtk_tool_palette_set_property (GObject      *object,
             gtk_tool_palette_reconfigured (palette);
           }
         break;
+        
+      case PROP_ICON_SIZE_SET:
+        if ((guint) g_value_get_enum (value) != palette->priv->icon_size)
+          {
+            palette->priv->icon_size_set = g_value_get_enum (value);
+            gtk_tool_palette_reconfigured (palette);
+          }
+        break;
 
       case PROP_ORIENTATION:
         if ((guint) g_value_get_enum (value) != palette->priv->orientation)
@@ -255,6 +271,10 @@ gtk_tool_palette_get_property (GObject    *object,
       case PROP_ICON_SIZE:
         g_value_set_enum (value, gtk_tool_palette_get_icon_size (palette));
         break;
+        
+      case PROP_ICON_SIZE_SET:
+        g_value_set_boolean (value, palette->priv->icon_size_set);
+        break;
 
       case PROP_ORIENTATION:
         g_value_set_enum (value, palette->priv->orientation);
@@ -842,6 +862,81 @@ gtk_tool_palette_get_child_property (GtkContainer *container,
 }
 
 static void
+style_change_notify (GtkToolPalette *palette)
+{
+  GtkToolPalettePrivate* priv = palette->priv;
+  
+  if (!priv->style_set)
+    {
+      /* pretend it was set, then unset, thus reverting to new default */
+      priv->style_set = TRUE;
+      gtk_tool_palette_unset_style (palette);
+    }
+}
+
+static void
+icon_size_change_notify (GtkToolPalette *palette)
+{
+  GtkToolPalettePrivate* priv = palette->priv;
+  
+  if (!priv->icon_size_set)
+    {
+      /* pretend it was set, then unset, thus reverting to new default */
+      priv->icon_size_set = TRUE;
+      gtk_tool_palette_unset_icon_size (palette);
+    }
+}
+
+static void
+gtk_tool_palette_settings_change_notify (GtkSettings      *settings,
+                                         const GParamSpec *pspec,
+                                         GtkToolPalette   *palette)
+{
+  if (! strcmp (pspec->name, "gtk-toolbar-style"))
+    style_change_notify (palette);
+  else if (! strcmp (pspec->name, "gtk-toolbar-icon-size"))
+    icon_size_change_notify (palette);
+}
+
+static void
+gtk_tool_palette_screen_changed (GtkWidget *widget,
+                                 GdkScreen *previous_screen)
+{
+  GtkToolPalette *palette = GTK_TOOL_PALETTE (widget);
+  GtkToolPalettePrivate* priv = palette->priv;
+  GtkSettings *old_settings = priv->settings;
+  GtkSettings *settings;
+  
+  if (gtk_widget_has_screen (GTK_WIDGET (palette)))
+    settings = gtk_widget_get_settings (GTK_WIDGET (palette));
+  else
+    settings = NULL;
+  
+  if (settings == old_settings)
+    return;
+  
+  if (old_settings)
+  {
+    g_signal_handler_disconnect (old_settings, priv->settings_connection);
+    g_object_unref (old_settings);
+  }
+
+  if (settings)
+  {
+    priv->settings_connection =
+      g_signal_connect (settings, "notify",
+                        G_CALLBACK (gtk_tool_palette_settings_change_notify),
+                        palette);
+    priv->settings = g_object_ref (settings);
+  }
+  else
+    priv->settings = NULL;
+
+  gtk_tool_palette_reconfigured (palette);
+}
+
+
+static void
 gtk_tool_palette_class_init (GtkToolPaletteClass *cls)
 {
   GObjectClass      *oclass   = G_OBJECT_CLASS (cls);
@@ -866,6 +961,11 @@ gtk_tool_palette_class_init (GtkToolPaletteClass *cls)
   cclass->get_child_property  = gtk_tool_palette_get_child_property;
 
   cls->set_scroll_adjustments = gtk_tool_palette_set_scroll_adjustments;
+  
+  /* Handle screen-changed so we can update our GtkSettings.
+   */
+  wclass->screen_changed      = gtk_tool_palette_screen_changed;
+    
   /**
    * GtkToolPalette::set-scroll-adjustments:
    * @widget: the GtkToolPalette that received the signal
@@ -887,18 +987,48 @@ gtk_tool_palette_class_init (GtkToolPaletteClass *cls)
                   GTK_TYPE_ADJUSTMENT,
                   GTK_TYPE_ADJUSTMENT);
 
-  g_object_class_install_property (oclass, PROP_ICON_SIZE,
+  g_object_class_override_property (oclass, PROP_ORIENTATION,
+                                    "orientation");
+                                                      
+ /**
+   * GtkToolPalette:icon-size:
+   *
+   * The size of the icons in a tool palette is normally determined by
+   * the toolbar-icon-size setting. When this property is set, it 
+   * overrides the setting. 
+   * 
+   * This should only be used for special-purpose toolbars, normal
+   * application toolbars should respect the user preferences for the
+   * size of icons.
+   *
+   * Since: 2.18
+   */
+  g_object_class_install_property (oclass,
+                                   PROP_ICON_SIZE,
                                    g_param_spec_enum ("icon-size",
-                                                      P_("Icon Size"),
-                                                      P_("The size of palette icons"),
+                                                      P_("Icon size"),
+                                                      P_("Size of icons in this tool palette"),
                                                       GTK_TYPE_ICON_SIZE,
                                                       DEFAULT_ICON_SIZE,
                                                       G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
                                                       G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
 
-  g_object_class_override_property (oclass, PROP_ORIENTATION,
-                                    "orientation");
-
+  /**
+   * GtkToolbar:icon-size-set:
+   *
+   * Is %TRUE if the icon-size property has been set.
+   *
+   * Since: 2.10
+   */
+  g_object_class_install_property (oclass,
+                                   PROP_ICON_SIZE_SET,
+                                   g_param_spec_boolean ("icon-size-set",
+                                                      P_("Icon size set"),
+                                                      P_("Whether the icon-size property has been set"),
+                                                      FALSE,
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
+                                                      G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+                                                      
   g_object_class_install_property (oclass, PROP_TOOLBAR_STYLE,
                                    g_param_spec_enum ("toolbar-style",
                                                       P_("Toolbar Style"),
@@ -907,6 +1037,7 @@ gtk_tool_palette_class_init (GtkToolPaletteClass *cls)
                                                       DEFAULT_TOOLBAR_STYLE,
                                                       G_PARAM_READWRITE | G_PARAM_STATIC_NAME |
                                                       G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+							 
 
   gtk_container_class_install_child_property (cclass, CHILD_PROP_EXCLUSIVE,
                                               g_param_spec_boolean ("exclusive",
@@ -958,15 +1089,103 @@ void
 gtk_tool_palette_set_icon_size (GtkToolPalette *palette,
                                 GtkIconSize     icon_size)
 {
+  GtkToolPalettePrivate *priv;
+  
   g_return_if_fail (GTK_IS_TOOL_PALETTE (palette));
+  g_return_if_fail (icon_size != GTK_ICON_SIZE_INVALID);
+
+  priv = palette->priv;
+    
+  if (!priv->icon_size_set)
+    {
+      priv->icon_size_set = TRUE;  
+      g_object_notify (G_OBJECT (palette), "icon-size-set");
+    }
+
+  if (priv->icon_size == icon_size)
+    return;
+  
+  priv->icon_size = icon_size;
+  g_object_notify (G_OBJECT (palette), "icon-size");
+  
+  gtk_tool_palette_reconfigured (palette);
+  
+  gtk_widget_queue_resize (GTK_WIDGET (palette));
+}
 
-  if (icon_size != palette->priv->icon_size)
-    g_object_set (palette, "icon-size", icon_size, NULL);
+static GtkSettings *
+toolpalette_get_settings (GtkToolPalette *palette)
+{
+  GtkToolPalettePrivate *priv = palette->priv;
+  return priv->settings;
 }
 
 /**
- * gtk_tool_palette_set_style:
+ * gtk_tool_palette_unset_icon_size:
  * @palette: an #GtkToolPalette.
+ *
+ * Unsets the tool palette icon size set with gtk_tool_palette_set_icon_size(), so that
+ * user preferences will be used to determine the icon size.
+ *
+ * Since: 2.18
+ */
+void
+gtk_tool_palette_unset_icon_size (GtkToolPalette *palette)
+{
+  GtkToolPalettePrivate* priv = palette->priv;
+  GtkIconSize size;
+  
+  g_return_if_fail (GTK_IS_TOOL_PALETTE (palette));
+  
+  if (palette->priv->icon_size_set)
+    {
+      GtkSettings *settings = toolpalette_get_settings (palette);
+      
+      if (settings)
+        {
+          g_object_get (settings,
+            "gtk-toolbar-icon-size", &size,
+            NULL);
+        }
+      else
+        size = DEFAULT_ICON_SIZE;
+      
+      if (size != palette->priv->icon_size)
+      {
+        gtk_tool_palette_set_icon_size (palette, size);
+        g_object_notify (G_OBJECT (palette), "icon-size");	  
+	    }
+      
+      priv->icon_size_set = FALSE;
+      g_object_notify (G_OBJECT (palette), "icon-size-set");      
+    }
+}
+
+/* Set the "toolbar-style" property and do appropriate things.
+ * GtkToolbar does this by emiting a signal instead of just calling a function, 
+ * but I don't see how that is useful. murrayc.
+ */
+static void
+gtk_tool_palette_change_style (GtkToolPalette     *palette,
+				GtkToolbarStyle style)
+{
+  GtkToolPalettePrivate* priv = palette->priv;
+  
+  if (priv->style != style)
+    {
+      priv->style = style;
+      
+      gtk_tool_palette_reconfigured (palette);
+      
+      gtk_widget_queue_resize (GTK_WIDGET (palette));
+      g_object_notify (G_OBJECT (palette), "toolbar-style");
+    }
+}
+
+
+/**
+ * gtk_tool_palette_set_style:
+ * @palette: a #GtkToolPalette.
  * @style: the #GtkToolbarStyle that items in the tool palette shall have.
  *
  * Sets the style (text, icons or both) of items in the tool palette.
@@ -979,8 +1198,42 @@ gtk_tool_palette_set_style (GtkToolPalette  *palette,
 {
   g_return_if_fail (GTK_IS_TOOL_PALETTE (palette));
 
-  if (style != palette->priv->style)
-    g_object_set (palette, "toolbar-style", style, NULL);
+  palette->pr->style_set = TRUE; 
+  gtk_tool_palette_change_style (palette, style);
+}
+
+
+/**
+ * gtk_tool_palette_unset_style:
+ * @palette: a #GtkToolPalette.
+ * 
+ * Unsets a toolbar style set with gtk_tool_palette_set_style(), so that
+ * user preferences will be used to determine the toolbar style.
+ **/
+void
+gtk_tool_palette_unset_style (GtkToolPalette *palette)
+{
+  GtkToolPalettePrivate* priv = palette->priv;
+  GtkToolbarStyle style;
+  
+  g_return_if_fail (GTK_IS_TOOL_PALETTE (palette));
+  
+  if (priv->style_set)
+    {
+      GtkSettings *settings = toolpalette_get_settings (palette);
+      
+      if (settings)
+	      g_object_get (settings,
+		      "gtk-toolbar-style", &style,
+		      NULL);
+      else
+        style = DEFAULT_TOOLBAR_STYLE;
+      
+      if (style != priv->style)
+        gtk_tool_palette_change_style (palette, style);
+      
+      priv->style_set = FALSE;
+    }
 }
 
 /**
diff --git a/gtk/gtktoolpalette.h b/gtk/gtktoolpalette.h
index 937a11d..a7b3250 100644
--- a/gtk/gtktoolpalette.h
+++ b/gtk/gtktoolpalette.h
@@ -103,8 +103,10 @@ gboolean                       gtk_tool_palette_get_expand            (GtkToolPa
 
 void                           gtk_tool_palette_set_icon_size         (GtkToolPalette            *palette,
                                                                        GtkIconSize                icon_size);
+void                           gtk_tool_palette_unset_icon_size       (GtkToolPalette            *palette);
 void                           gtk_tool_palette_set_style             (GtkToolPalette            *palette,
                                                                        GtkToolbarStyle            style);
+void                           gtk_tool_palette_unset_style           (GtkToolPalette            *palette);
 
 GtkIconSize                    gtk_tool_palette_get_icon_size         (GtkToolPalette            *palette);
 GtkToolbarStyle                gtk_tool_palette_get_style             (GtkToolPalette            *palette);



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