From cb5b74e9c68bef5c527ec85e46ee70f68e08cc45 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 22 Oct 2010 17:56:21 +0200 Subject: [PATCH] GtkColorSelection: Add API to deal with GdkRGBA. The hook to change the global palette is still unchanged, it is quite tied to GdkColor and the color format used to store the palette in GtkSettings. --- docs/reference/gtk/gtk3-sections.txt | 4 + gtk/gtkcolorsel.c | 167 ++++++++++++++++++++++++++- gtk/gtkcolorsel.h | 9 ++ 3 files changed, 178 insertions(+), 2 deletions(-) diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index 765f7ba14f..3424936a64 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -728,6 +728,10 @@ gtk_color_selection_get_previous_alpha gtk_color_selection_set_previous_alpha gtk_color_selection_get_previous_color gtk_color_selection_set_previous_color +gtk_color_selection_get_current_rgba +gtk_color_selection_set_current_rgba +gtk_color_selection_get_previous_rgba +gtk_color_selection_set_previous_rgba gtk_color_selection_is_adjusting gtk_color_selection_palette_from_string gtk_color_selection_palette_to_string diff --git a/gtk/gtkcolorsel.c b/gtk/gtkcolorsel.c index 100f764dd9..7421e89b04 100644 --- a/gtk/gtkcolorsel.c +++ b/gtk/gtkcolorsel.c @@ -102,7 +102,8 @@ enum { PROP_HAS_PALETTE, PROP_HAS_OPACITY_CONTROL, PROP_CURRENT_COLOR, - PROP_CURRENT_ALPHA + PROP_CURRENT_ALPHA, + PROP_CURRENT_RGBA }; enum { @@ -332,7 +333,22 @@ gtk_color_selection_class_init (GtkColorSelectionClass *klass) P_("The current opacity value (0 fully transparent, 65535 fully opaque)"), 0, 65535, 65535, GTK_PARAM_READWRITE)); - + + /** + * GtkColorSelection:current-rgba + * + * The current RGBA color. + * + * Since: 3.0 + */ + g_object_class_install_property (gobject_class, + PROP_CURRENT_RGBA, + g_param_spec_boxed ("current-rgba", + P_("Current RGBA"), + P_("The current RGBA color"), + GDK_TYPE_RGBA, + GTK_PARAM_READWRITE)); + color_selection_signals[COLOR_CHANGED] = g_signal_new (I_("color-changed"), G_OBJECT_CLASS_TYPE (gobject_class), @@ -560,6 +576,9 @@ gtk_color_selection_set_property (GObject *object, case PROP_CURRENT_ALPHA: gtk_color_selection_set_current_alpha (colorsel, g_value_get_uint (value)); break; + case PROP_CURRENT_RGBA: + gtk_color_selection_set_current_rgba (colorsel, g_value_get_boxed (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -591,6 +610,14 @@ gtk_color_selection_get_property (GObject *object, case PROP_CURRENT_ALPHA: g_value_set_uint (value, gtk_color_selection_get_current_alpha (colorsel)); break; + case PROP_CURRENT_RGBA: + { + GdkRGBA rgba; + + gtk_color_selection_get_current_rgba (colorsel, &rgba); + g_value_set_boxed (value, &rgba); + } + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2633,6 +2660,142 @@ gtk_color_selection_get_previous_alpha (GtkColorSelection *colorsel) return priv->has_opacity ? UNSCALE (priv->old_color[COLORSEL_OPACITY]) : 65535; } +/** + * gtk_color_selection_set_current_rgba: + * @colorsel: a #GtkColorSelection. + * @rgba: A #GdkRGBA to set the current color with + * + * Sets the current color to be @rgba. The first time this is called, it will + * also set the original color to be @rgba too. + * + * Since: 3.0 + **/ +void +gtk_color_selection_set_current_rgba (GtkColorSelection *colorsel, + const GdkRGBA *rgba) +{ + GtkColorSelectionPrivate *priv; + gint i; + + g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); + g_return_if_fail (rgba != NULL); + + priv = colorsel->private_data; + priv->changing = TRUE; + + priv->color[COLORSEL_RED] = CLAMP (rgba->red, 0, 1); + priv->color[COLORSEL_GREEN] = CLAMP (rgba->green, 0, 1); + priv->color[COLORSEL_BLUE] = CLAMP (rgba->blue, 0, 1); + priv->color[COLORSEL_OPACITY] = CLAMP (rgba->alpha, 0, 1); + + gtk_rgb_to_hsv (priv->color[COLORSEL_RED], + priv->color[COLORSEL_GREEN], + priv->color[COLORSEL_BLUE], + &priv->color[COLORSEL_HUE], + &priv->color[COLORSEL_SATURATION], + &priv->color[COLORSEL_VALUE]); + + if (priv->default_set == FALSE) + { + for (i = 0; i < COLORSEL_NUM_CHANNELS; i++) + priv->old_color[i] = priv->color[i]; + } + + priv->default_set = TRUE; + update_color (colorsel); +} + +/** + * gtk_color_selection_get_current_rgba: + * @colorsel: a #GtkColorSelection. + * @rgba: (out): a #GdkRGBA to fill in with the current color. + * + * Sets @rgba to be the current color in the GtkColorSelection widget. + * + * Since: 3.0 + **/ +void +gtk_color_selection_get_current_rgba (GtkColorSelection *colorsel, + GdkRGBA *rgba) +{ + GtkColorSelectionPrivate *priv; + + g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); + g_return_if_fail (rgba != NULL); + + priv = colorsel->private_data; + rgba->red = priv->color[COLORSEL_RED]; + rgba->green = priv->color[COLORSEL_GREEN]; + rgba->blue = priv->color[COLORSEL_BLUE]; + rgba->alpha = (priv->has_opacity) ? priv->color[COLORSEL_OPACITY] : 1; +} + +/** + * gtk_color_selection_set_previous_rgba: + * @colorsel: a #GtkColorSelection. + * @rgba: a #GdkRGBA to set the previous color with + * + * Sets the 'previous' color to be @rgba. This function should be called with + * some hesitations, as it might seem confusing to have that color change. + * Calling gtk_color_selection_set_current_rgba() will also set this color the first + * time it is called. + * + * Since: 3.0 + **/ +void +gtk_color_selection_set_previous_rgba (GtkColorSelection *colorsel, + const GdkRGBA *rgba) +{ + GtkColorSelectionPrivate *priv; + + g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); + g_return_if_fail (rgba != NULL); + + priv = colorsel->private_data; + priv->changing = TRUE; + + priv->old_color[COLORSEL_RED] = CLAMP (rgba->red, 0, 1); + priv->old_color[COLORSEL_GREEN] = CLAMP (rgba->green, 0, 1); + priv->old_color[COLORSEL_BLUE] = CLAMP (rgba->blue, 0, 1); + priv->old_color[COLORSEL_OPACITY] = CLAMP (rgba->alpha, 0, 1); + + gtk_rgb_to_hsv (priv->old_color[COLORSEL_RED], + priv->old_color[COLORSEL_GREEN], + priv->old_color[COLORSEL_BLUE], + &priv->old_color[COLORSEL_HUE], + &priv->old_color[COLORSEL_SATURATION], + &priv->old_color[COLORSEL_VALUE]); + + color_sample_update_samples (colorsel); + priv->default_set = TRUE; + priv->changing = FALSE; +} + +/** + * gtk_color_selection_get_previous_rgba: + * @colorsel: a #GtkColorSelection. + * @rgba: a #GdkRGBA to fill in with the original color value. + * + * Fills @rgba in with the original color value. + * + * Since: 3.0 + **/ +void +gtk_color_selection_get_previous_rgba (GtkColorSelection *colorsel, + GdkRGBA *rgba) +{ + GtkColorSelectionPrivate *priv; + + g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); + g_return_if_fail (rgba != NULL); + + priv = colorsel->private_data; + rgba->red = priv->old_color[COLORSEL_RED]; + rgba->green = priv->old_color[COLORSEL_GREEN]; + rgba->blue = priv->old_color[COLORSEL_BLUE]; + rgba->alpha = (priv->has_opacity) ? priv->old_color[COLORSEL_OPACITY] : 1; +} + /** * gtk_color_selection_set_palette_color: * @colorsel: a #GtkColorSelection. diff --git a/gtk/gtkcolorsel.h b/gtk/gtkcolorsel.h index 4aee1bc1e6..43e5fd6276 100644 --- a/gtk/gtkcolorsel.h +++ b/gtk/gtkcolorsel.h @@ -104,6 +104,15 @@ void gtk_color_selection_get_previous_color (GtkColorSelection *colorsel, GdkColor *color); guint16 gtk_color_selection_get_previous_alpha (GtkColorSelection *colorsel); +void gtk_color_selection_set_current_rgba (GtkColorSelection *colorsel, + const GdkRGBA *rgba); +void gtk_color_selection_get_current_rgba (GtkColorSelection *colorsel, + GdkRGBA *rgba); +void gtk_color_selection_set_previous_rgba (GtkColorSelection *colorsel, + const GdkRGBA *rgba); +void gtk_color_selection_get_previous_rgba (GtkColorSelection *colorsel, + GdkRGBA *rgba); + gboolean gtk_color_selection_is_adjusting (GtkColorSelection *colorsel); gboolean gtk_color_selection_palette_from_string (const gchar *str,