From 2365e47228441d9518c9429ae019abc24cb3fd5d Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Wed, 15 Dec 2010 16:46:53 +0000 Subject: [PATCH] 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 bf85374f5..464bfa1de 100644 --- a/panels/background/background.ui +++ b/panels/background/background.ui @@ -160,7 +160,7 @@ True 12 - + True True True @@ -171,6 +171,18 @@ 0 + + + True + True + True + #000000000000 + + + False + 1 + + True @@ -185,7 +197,7 @@ False - 1 + 2 diff --git a/panels/background/bg-colors-source.c b/panels/background/bg-colors-source.c index 6bed0a54c..848e19ad2 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 73fe77490..25d830f4f 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; @@ -223,6 +224,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); }