[gnome-control-center] background: Better handling of colours and gradients



commit 2365e47228441d9518c9429ae019abc24cb3fd5d
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Dec 15 16:46:53 2010 +0000

    background: Better handling of colours and gradients
    
    Implement gradients, make sure that selecting one particular
    gradient or solid colour doesn't overwrite the previous one.

 panels/background/background.ui         |   16 +++++-
 panels/background/bg-colors-source.c    |   54 ++++++-----------
 panels/background/cc-background-panel.c |   94 +++++++++++++++++++++++++------
 3 files changed, 109 insertions(+), 55 deletions(-)
---
diff --git a/panels/background/background.ui b/panels/background/background.ui
index bf85374..464bfa1 100644
--- a/panels/background/background.ui
+++ b/panels/background/background.ui
@@ -160,7 +160,7 @@
                 <property name="visible">True</property>
                 <property name="spacing">12</property>
                 <child>
-                  <object class="GtkColorButton" id="style-color">
+                  <object class="GtkColorButton" id="style-pcolor">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
@@ -172,6 +172,18 @@
                   </packing>
                 </child>
                 <child>
+                  <object class="GtkColorButton" id="style-scolor">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="color">#000000000000</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
                   <object class="GtkComboBox" id="style-combobox">
                     <property name="visible">True</property>
                     <property name="model">style-liststore</property>
@@ -185,7 +197,7 @@
                   </object>
                   <packing>
                     <property name="expand">False</property>
-                    <property name="position">1</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
               </object>
diff --git a/panels/background/bg-colors-source.c b/panels/background/bg-colors-source.c
index 6bed0a5..848e19a 100644
--- a/panels/background/bg-colors-source.c
+++ b/panels/background/bg-colors-source.c
@@ -37,63 +37,47 @@ bg_colors_source_class_init (BgColorsSourceClass *klass)
 {
 }
 
-static gchar *colors[] =
-{
-  "#c4a000",
-  "#ce5c00",
-  "#8f5902",
-  "#4e9a06",
-  "#204a87",
-  "#5c3566",
-  "#a40000",
-  "#babdb6",
-  "#2e3436",
-  "#000000",
-  NULL
+struct {
+	const char *name;
+	GDesktopBackgroundShading type;
+} items[] = {
+	{ N_("Horizontal Gradient"), G_DESKTOP_BACKGROUND_SHADING_HORIZONTAL },
+	{ N_("Vertical Gradient"), G_DESKTOP_BACKGROUND_SHADING_VERTICAL },
+	{ N_("Solid Color"), G_DESKTOP_BACKGROUND_SHADING_SOLID },
 };
 
-static gchar *color_names[] =
-{
-  N_("Butter"),
-  N_("Orange"),
-  N_("Chocolate"),
-  N_("Chameleon"),
-  N_("Blue"),
-  N_("Plum"),
-  N_("Red"),
-  N_("Aluminium"),
-  N_("Gray"),
-  N_("Black"),
-  NULL
-};
+#define PCOLOR "#023c88"
+#define SCOLOR "#5789ca"
 
 static void
 bg_colors_source_init (BgColorsSource *self)
 {
   GnomeDesktopThumbnailFactory *thumb_factory;
-  gchar **c, **n;
+  guint i;
   GtkListStore *store;
+  GdkColor pcolor, scolor;
 
   store = bg_source_get_liststore (BG_SOURCE (self));
 
   thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL);
 
-  for (c = colors, n = color_names; *c; c++, n++)
+  gdk_color_parse (PCOLOR, &pcolor);
+  gdk_color_parse (SCOLOR, &scolor);
+
+  for (i = 0; i < G_N_ELEMENTS (items); i++)
     {
       GnomeWPItem *item;
       GIcon *pixbuf;
-      GdkColor color;
 
       item = g_new0 (GnomeWPItem, 1);
 
       item->filename = g_strdup ("(none)");
-      item->name = g_strdup (_(*n));
+      item->name = g_strdup (_(items[i].name));
 
-      gdk_color_parse (*c, &color);
-      item->pcolor = gdk_color_copy (&color);
-      item->scolor = gdk_color_copy (&color);
+      item->pcolor = gdk_color_copy (&pcolor);
+      item->scolor = gdk_color_copy (&scolor);
 
-      item->shade_type = G_DESKTOP_BACKGROUND_SHADING_SOLID;
+      item->shade_type = items[i].type;
 
       gnome_wp_item_ensure_gnome_bg (item);
 
diff --git a/panels/background/cc-background-panel.c b/panels/background/cc-background-panel.c
index 73fe774..25d830f 100644
--- a/panels/background/cc-background-panel.c
+++ b/panels/background/cc-background-panel.c
@@ -67,6 +67,7 @@ struct _CcBackgroundPanelPrivate
 
   GnomeWPItem *current_background;
   gboolean current_source_readonly;
+  gint current_source;
 
   GCancellable *copy_cancellable;
 
@@ -224,6 +225,37 @@ cc_background_panel_class_finalize (CcBackgroundPanelClass *klass)
 }
 
 static void
+source_update_edit_box (CcBackgroundPanelPrivate *priv)
+{
+  if (priv->current_source == SOURCE_COLORS)
+    {
+      gtk_widget_hide (WID ("style-combobox"));
+      gtk_widget_show (WID ("style-pcolor"));
+
+      if (priv->current_background &&
+	  priv->current_background->shade_type == G_DESKTOP_BACKGROUND_SHADING_SOLID)
+        gtk_widget_hide (WID ("style-scolor"));
+      else
+        gtk_widget_show (WID ("style-scolor"));
+    }
+  else
+    {
+      if (!priv->current_source_readonly)
+        {
+          gtk_widget_show (WID ("style-pcolor"));
+          gtk_widget_hide (WID ("style-scolor"));
+          gtk_widget_show (WID ("style-combobox"));
+	}
+      else
+        {
+          gtk_widget_hide (WID ("style-pcolor"));
+          gtk_widget_hide (WID ("style-scolor"));
+          gtk_widget_hide (WID ("style-combobox"));
+	}
+    }
+}
+
+static void
 source_changed_cb (GtkComboBox              *combo,
                    CcBackgroundPanelPrivate *priv)
 {
@@ -340,11 +372,7 @@ update_preview (CcBackgroundPanelPrivate *priv,
       gnome_wp_item_update_size (priv->current_background, priv->thumb_factory);
     }
 
-
-  if (!priv->current_source_readonly)
-    gtk_widget_show (WID ("edit-hbox"));
-  else
-    gtk_widget_hide (WID ("edit-hbox"));
+  source_update_edit_box (priv);
 
   changes_with_time = FALSE;
 
@@ -356,8 +384,10 @@ update_preview (CcBackgroundPanelPrivate *priv,
 
       gtk_label_set_text (GTK_LABEL (WID ("size_label")), priv->current_background->size);
 
-      gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-color")),
+      gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-pcolor")),
                                   priv->current_background->pcolor);
+      gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-scolor")),
+                                  priv->current_background->scolor);
 
       select_style (GTK_COMBO_BOX (WID ("style-combobox")),
                     priv->current_background->options);
@@ -395,8 +425,9 @@ backgrounds_changed_cb (GtkIconView       *icon_view,
   model = gtk_combo_box_get_model (GTK_COMBO_BOX (WID ("sources-combobox")));
   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (WID ("sources-combobox")),
                                  &iter);
-  gtk_tree_model_get (model, &iter, COL_SOURCE_READONLY, &priv->current_source_readonly, -1);
-
+  gtk_tree_model_get (model, &iter,
+  		      COL_SOURCE_READONLY, &priv->current_source_readonly,
+  		      COL_SOURCE_TYPE, &priv->current_source, -1);
 
   model = gtk_icon_view_get_model (icon_view);
 
@@ -495,10 +526,23 @@ backgrounds_changed_cb (GtkIconView       *icon_view,
 
   g_settings_set_enum (priv->settings, WP_SHADING_KEY, item->shade_type);
 
-  pcolor = gdk_color_to_string (item->pcolor);
-  scolor = gdk_color_to_string (item->scolor);
-  g_settings_set_string (priv->settings, WP_PCOLOR_KEY, pcolor);
-  g_settings_set_string (priv->settings, WP_SCOLOR_KEY, scolor);
+  /* When changing for another colour, don't overwrite what's
+   * in GSettings, but read from it instead */
+  if (priv->current_source == SOURCE_COLORS)
+    {
+      pcolor = g_settings_get_string (priv->settings, WP_PCOLOR_KEY);
+      scolor = g_settings_get_string (priv->settings, WP_SCOLOR_KEY);
+      gdk_color_parse (pcolor, item->pcolor);
+      gdk_color_parse (scolor, item->scolor);
+    }
+  else
+    {
+      pcolor = gdk_color_to_string (item->pcolor);
+      scolor = gdk_color_to_string (item->scolor);
+      g_settings_set_string (priv->settings, WP_PCOLOR_KEY, pcolor);
+      g_settings_set_string (priv->settings, WP_SCOLOR_KEY, scolor);
+    }
+
   g_free (pcolor);
   g_free (scolor);
 
@@ -616,16 +660,26 @@ color_changed_cb (GtkColorButton    *button,
   CcBackgroundPanelPrivate *priv = panel->priv;
   GdkColor color;
   gchar *value;
+  gboolean is_pcolor = FALSE;
 
   gtk_color_button_get_color (button, &color);
+  if (WID ("style-pcolor") == GTK_WIDGET (button))
+    is_pcolor = TRUE;
 
   if (priv->current_background)
-    *priv->current_background->pcolor = color;
+    {
+      if (is_pcolor)
+        *priv->current_background->pcolor = color;
+      else
+        *priv->current_background->scolor = color;
+    }
 
   value = gdk_color_to_string (&color);
 
-  g_settings_set_string (priv->settings, WP_PCOLOR_KEY, value);
-  g_settings_set_string (priv->settings, WP_SCOLOR_KEY, value);
+  if (is_pcolor)
+    g_settings_set_string (priv->settings, WP_PCOLOR_KEY, value);
+  else
+    g_settings_set_string (priv->settings, WP_SCOLOR_KEY, value);
 
   g_free (value);
 
@@ -681,9 +735,9 @@ cc_background_panel_init (CcBackgroundPanel *self)
 
   priv->colors_source = bg_colors_source_new ();
   gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
-                                     COL_SOURCE_NAME, _("Colors"),
+                                     COL_SOURCE_NAME, _("Colors & Gradients"),
                                      COL_SOURCE_TYPE, SOURCE_COLORS,
-                                     COL_SOURCE_READONLY, TRUE,
+                                     COL_SOURCE_READONLY, FALSE,
                                      COL_SOURCE, priv->colors_source,
                                      -1);
 
@@ -732,7 +786,9 @@ cc_background_panel_init (CcBackgroundPanel *self)
   g_signal_connect (WID ("style-combobox"), "changed",
                     G_CALLBACK (style_changed_cb), self);
 
-  g_signal_connect (WID ("style-color"), "color-set",
+  g_signal_connect (WID ("style-pcolor"), "color-set",
+                    G_CALLBACK (color_changed_cb), self);
+  g_signal_connect (WID ("style-scolor"), "color-set",
                     G_CALLBACK (color_changed_cb), self);
 
   priv->copy_cancellable = g_cancellable_new ();
@@ -755,6 +811,8 @@ cc_background_panel_init (CcBackgroundPanel *self)
   gnome_wp_item_ensure_gnome_bg (priv->current_background);
   gnome_wp_item_update_size (priv->current_background, priv->thumb_factory);
 
+  /* FIXME hide the edit box as appropriate for the current background */
+
   update_preview (priv, NULL, TRUE);
 }
 



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