From 81785783599e1ade86e2643a339641759b0c4648 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 31 Jan 2012 02:05:37 -0500 Subject: [PATCH] Make alpha optional --- gtk/gtkcolorchooser.c | 28 +++++++++++++++++++ gtk/gtkcolorchooser.h | 13 +++++---- gtk/gtkcolorchooserdialog.c | 12 +++++++- gtk/gtkcolorchooserwidget.c | 52 +++++++++++++++++++++++++++++++++-- gtk/gtkcoloreditor.c | 55 +++++++++++++++++++++++++++++-------- gtk/gtkcolorswatch.c | 43 +++++++++++++++++++++-------- gtk/gtkcolorswatch.h | 2 ++ tests/testcolorchooser.c | 5 ++++ 8 files changed, 178 insertions(+), 32 deletions(-) diff --git a/gtk/gtkcolorchooser.c b/gtk/gtkcolorchooser.c index a63566f84b..42e0e974ef 100644 --- a/gtk/gtkcolorchooser.c +++ b/gtk/gtkcolorchooser.c @@ -46,6 +46,12 @@ gtk_color_chooser_default_init (GtkColorChooserInterface *iface) GDK_TYPE_RGBA, GTK_PARAM_READWRITE)); + g_object_interface_install_property (iface, + g_param_spec_boolean ("show-alpha", + P_("Show alpha"), + P_("Whether alpha should be shown"), + TRUE, + GTK_PARAM_READWRITE)); /** * GtkColorChooser::color-activated: * @self: the object which received the signal @@ -108,3 +114,25 @@ _gtk_color_chooser_color_activated (GtkColorChooser *chooser, g_signal_emit (chooser, signals[COLOR_ACTIVATED], 0, color); } + +gboolean +gtk_color_chooser_get_show_alpha (GtkColorChooser *chooser) +{ + gboolean show_alpha; + + g_return_val_if_fail (GTK_IS_COLOR_CHOOSER (chooser), TRUE); + + g_object_get (chooser, "show-alpha", &show_alpha, NULL); + + return show_alpha; +} + +void +gtk_color_chooser_set_show_alpha (GtkColorChooser *chooser, + gboolean show_alpha) +{ + + g_return_if_fail (GTK_IS_COLOR_CHOOSER (chooser)); + + g_object_set (chooser, "show-alpha", show_alpha, NULL); +} diff --git a/gtk/gtkcolorchooser.h b/gtk/gtkcolorchooser.h index bd5b70e5a3..23db3380f1 100644 --- a/gtk/gtkcolorchooser.h +++ b/gtk/gtkcolorchooser.h @@ -55,12 +55,15 @@ struct _GtkColorChooserInterface gpointer padding[12]; }; -GType gtk_color_chooser_get_type (void) G_GNUC_CONST; +GType gtk_color_chooser_get_type (void) G_GNUC_CONST; -void gtk_color_chooser_get_color (GtkColorChooser *chooser, - GdkRGBA *color); -void gtk_color_chooser_set_color (GtkColorChooser *chooser, - const GdkRGBA *color); +void gtk_color_chooser_get_color (GtkColorChooser *chooser, + GdkRGBA *color); +void gtk_color_chooser_set_color (GtkColorChooser *chooser, + const GdkRGBA *color); +gboolean gtk_color_chooser_get_show_alpha (GtkColorChooser *chooser); +void gtk_color_chooser_set_show_alpha (GtkColorChooser *chooser, + gboolean show_alpha); G_END_DECLS diff --git a/gtk/gtkcolorchooserdialog.c b/gtk/gtkcolorchooserdialog.c index dc211ec96f..8d2c2296a3 100644 --- a/gtk/gtkcolorchooserdialog.c +++ b/gtk/gtkcolorchooserdialog.c @@ -40,7 +40,8 @@ struct _GtkColorChooserDialogPrivate enum { PROP_ZERO, - PROP_COLOR + PROP_COLOR, + PROP_SHOW_ALPHA }; static void gtk_color_chooser_dialog_iface_init (GtkColorChooserInterface *iface); @@ -140,6 +141,7 @@ gtk_color_chooser_dialog_get_property (GObject *object, GValue *value, GParamSpec *pspec) { + GtkColorChooserDialog *cd = GTK_COLOR_CHOOSER_DIALOG (object); GtkColorChooser *cc = GTK_COLOR_CHOOSER (object); switch (prop_id) @@ -152,6 +154,9 @@ gtk_color_chooser_dialog_get_property (GObject *object, g_value_set_boxed (value, &color); } break; + case PROP_SHOW_ALPHA: + g_value_set_boolean (value, gtk_color_chooser_get_show_alpha (GTK_COLOR_CHOOSER (cd->priv->color_chooser))); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -164,6 +169,7 @@ gtk_color_chooser_dialog_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { + GtkColorChooserDialog *cd = GTK_COLOR_CHOOSER_DIALOG (object); GtkColorChooser *cc = GTK_COLOR_CHOOSER (object); switch (prop_id) @@ -171,6 +177,9 @@ gtk_color_chooser_dialog_set_property (GObject *object, case PROP_COLOR: gtk_color_chooser_set_color (cc, g_value_get_boxed (value)); break; + case PROP_SHOW_ALPHA: + gtk_color_chooser_set_show_alpha (GTK_COLOR_CHOOSER (cd->priv->color_chooser), g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -189,6 +198,7 @@ gtk_color_chooser_dialog_class_init (GtkColorChooserDialogClass *class) dialog_class->response = gtk_color_chooser_dialog_response; g_object_class_override_property (object_class, PROP_COLOR, "color"); + g_object_class_override_property (object_class, PROP_SHOW_ALPHA, "show-alpha"); g_type_class_add_private (class, sizeof (GtkColorChooserDialogPrivate)); } diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c index 54c59cb378..c54181b4ef 100644 --- a/gtk/gtkcolorchooserwidget.c +++ b/gtk/gtkcolorchooserwidget.c @@ -42,6 +42,7 @@ struct _GtkColorChooserWidgetPrivate GtkWidget *button; GtkColorSwatch *current; + gboolean show_alpha; GSettings *settings; }; @@ -49,7 +50,8 @@ struct _GtkColorChooserWidgetPrivate enum { PROP_ZERO, - PROP_COLOR + PROP_COLOR, + PROP_SHOW_ALPHA }; static void gtk_color_chooser_widget_iface_init (GtkColorChooserInterface *iface); @@ -330,6 +332,7 @@ gtk_color_chooser_widget_get_property (GObject *object, GValue *value, GParamSpec *pspec) { + GtkColorChooserWidget *cw = GTK_COLOR_CHOOSER_WIDGET (object); GtkColorChooser *cc = GTK_COLOR_CHOOSER (object); switch (prop_id) @@ -341,13 +344,46 @@ gtk_color_chooser_widget_get_property (GObject *object, gtk_color_chooser_get_color (cc, &color); g_value_set_boxed (value, &color); } - break; + break; + case PROP_SHOW_ALPHA: + g_value_set_boolean (value, cw->priv->show_alpha); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } +static void +gtk_color_chooser_widget_set_show_alpha (GtkColorChooserWidget *cc, + gboolean show_alpha) +{ + GtkWidget *grids[3]; + gint i; + GList *children, *l; + GtkWidget *swatch; + + cc->priv->show_alpha = show_alpha; + gtk_color_chooser_set_show_alpha (GTK_COLOR_CHOOSER (cc->priv->editor), show_alpha); + + grids[0] = cc->priv->colors; + grids[1] = cc->priv->grays; + grids[2] = cc->priv->custom; + + for (i = 0; i < 3; i++) + { + children = gtk_container_get_children (GTK_CONTAINER (grids[i])); + for (l = children; l; l = l->next) + { + swatch = l->data; + gtk_color_swatch_set_show_alpha (GTK_COLOR_SWATCH (swatch), show_alpha); + } + g_list_free (children); + } + + gtk_widget_queue_draw (GTK_WIDGET (cc)); +} + static void gtk_color_chooser_widget_set_property (GObject *object, guint prop_id, @@ -361,7 +397,11 @@ gtk_color_chooser_widget_set_property (GObject *object, case PROP_COLOR: gtk_color_chooser_set_color (GTK_COLOR_CHOOSER (cc), g_value_get_boxed (value)); - break; + break; + case PROP_SHOW_ALPHA: + gtk_color_chooser_widget_set_show_alpha (cc, + g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -388,6 +428,7 @@ gtk_color_chooser_widget_class_init (GtkColorChooserWidgetClass *class) object_class->finalize = gtk_color_chooser_widget_finalize; g_object_class_override_property (object_class, PROP_COLOR, "color"); + g_object_class_override_property (object_class, PROP_SHOW_ALPHA, "show-alpha"); g_type_class_add_private (object_class, sizeof (GtkColorChooserWidgetPrivate)); } @@ -409,6 +450,9 @@ gtk_color_chooser_widget_get_color (GtkColorChooser *chooser, color->blue = 1.0; color->alpha = 1.0; } + + if (!cc->priv->show_alpha) + color->alpha = 1.0; } static void @@ -464,6 +508,8 @@ gtk_color_chooser_widget_set_color (GtkColorChooser *chooser, { swatch = l->data; gtk_color_swatch_get_color (swatch, &c); + if (!cc->priv->show_alpha) + c.alpha = color->alpha; if (gdk_rgba_equal (color, &c)) { select_swatch (cc, swatch); diff --git a/gtk/gtkcoloreditor.c b/gtk/gtkcoloreditor.c index b79628d6ed..50f82a3575 100644 --- a/gtk/gtkcoloreditor.c +++ b/gtk/gtkcoloreditor.c @@ -51,13 +51,15 @@ struct _GtkColorEditorPrivate GtkAdjustment *a_adj; GdkRGBA color; gdouble h, s, v; - gboolean text_changed; + guint text_changed : 1; + guint show_alpha : 1; }; enum { PROP_ZERO, - PROP_COLOR + PROP_COLOR, + PROP_SHOW_ALPHA }; static void gtk_color_editor_iface_init (GtkColorChooserInterface *iface); @@ -188,21 +190,24 @@ get_checkered_pattern (void) } static gboolean -swatch_draw (GtkWidget *swatch, +swatch_draw (GtkWidget *widget, cairo_t *cr, GtkColorEditor *editor) { cairo_pattern_t *checkered; - cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); - cairo_paint (cr); + if (editor->priv->show_alpha) + { + cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); + cairo_paint (cr); - cairo_set_source_rgb (cr, 0.66, 0.66, 0.66); - cairo_scale (cr, 8, 8); + cairo_set_source_rgb (cr, 0.66, 0.66, 0.66); + cairo_scale (cr, 8, 8); - checkered = get_checkered_pattern (); - cairo_mask (cr, checkered); - cairo_pattern_destroy (checkered); + checkered = get_checkered_pattern (); + cairo_mask (cr, checkered); + cairo_pattern_destroy (checkered); + } gdk_cairo_set_source_rgba (cr, &editor->priv->color); cairo_paint (cr); @@ -219,6 +224,8 @@ gtk_color_editor_init (GtkColorEditor *editor) editor->priv = G_TYPE_INSTANCE_GET_PRIVATE (editor, GTK_TYPE_COLOR_EDITOR, GtkColorEditorPrivate); + editor->priv->show_alpha = TRUE; + gtk_widget_push_composite_child (); editor->priv->grid = grid = gtk_grid_new (); @@ -271,6 +278,7 @@ gtk_color_editor_get_property (GObject *object, GValue *value, GParamSpec *pspec) { + GtkColorEditor *ce = GTK_COLOR_EDITOR (object); GtkColorChooser *cc = GTK_COLOR_CHOOSER (object); switch (prop_id) @@ -281,26 +289,48 @@ gtk_color_editor_get_property (GObject *object, gtk_color_chooser_get_color (cc, &color); g_value_set_boxed (value, &color); } - break; + break; + case PROP_SHOW_ALPHA: + g_value_set_boolean (value, gtk_widget_get_visible (ce->priv->a_slider)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } +static void +gtk_color_editor_set_show_alpha (GtkColorEditor *editor, + gboolean show_alpha) +{ + if (editor->priv->show_alpha != show_alpha) + { + editor->priv->show_alpha = show_alpha; + + if (show_alpha) + gtk_widget_show (editor->priv->a_slider); + else + gtk_widget_hide (editor->priv->a_slider); + } +} + static void gtk_color_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { + GtkColorEditor *ce = GTK_COLOR_EDITOR (object); GtkColorChooser *cc = GTK_COLOR_CHOOSER (object); switch (prop_id) { case PROP_COLOR: gtk_color_chooser_set_color (cc, g_value_get_boxed (value)); - break; + break; + case PROP_SHOW_ALPHA: + gtk_color_editor_set_show_alpha (ce, g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -316,6 +346,7 @@ gtk_color_editor_class_init (GtkColorEditorClass *class) object_class->set_property = gtk_color_editor_set_property; g_object_class_override_property (object_class, PROP_COLOR, "color"); + g_object_class_override_property (object_class, PROP_SHOW_ALPHA, "show-alpha"); g_type_class_add_private (class, sizeof (GtkColorEditorPrivate)); } diff --git a/gtk/gtkcolorswatch.c b/gtk/gtkcolorswatch.c index 682fecd70c..6652ce9193 100644 --- a/gtk/gtkcolorswatch.c +++ b/gtk/gtkcolorswatch.c @@ -41,6 +41,7 @@ struct _GtkColorSwatchPrivate guint has_color : 1; guint can_drop : 1; guint contains_pointer : 1; + guint show_alpha : 1; }; enum @@ -74,6 +75,7 @@ gtk_color_swatch_init (GtkColorSwatch *swatch) | GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + swatch->priv->show_alpha = TRUE; } static void @@ -137,24 +139,34 @@ swatch_draw (GtkWidget *widget, _gtk_rounded_box_path (&box, cr); + cairo_clip_preserve (cr); + if (swatch->priv->has_color) { cairo_pattern_t *pattern; cairo_matrix_t matrix; - cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); - cairo_fill_preserve (cr); + if (swatch->priv->show_alpha) + { + cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0.66, 0.66, 0.66); - cairo_set_source_rgb (cr, 0.66, 0.66, 0.66); + pattern = get_checkered_pattern (); + cairo_matrix_init_scale (&matrix, 0.125, 0.125); + cairo_pattern_set_matrix (pattern, &matrix); + cairo_mask (cr, pattern); + cairo_pattern_destroy (pattern); - pattern = get_checkered_pattern (); - cairo_matrix_init_scale (&matrix, 0.125, 0.125); - cairo_pattern_set_matrix (pattern, &matrix); - cairo_clip_preserve (cr); - cairo_mask (cr, pattern); - cairo_pattern_destroy (pattern); - - gdk_cairo_set_source_rgba (cr, &swatch->priv->color); + gdk_cairo_set_source_rgba (cr, &swatch->priv->color); + } + else + { + cairo_set_source_rgb (cr, + swatch->priv->color.red, + swatch->priv->color.green, + swatch->priv->color.blue); + } cairo_fill_preserve (cr); } @@ -693,4 +705,13 @@ gtk_color_swatch_set_can_drop (GtkColorSwatch *swatch, swatch->priv->can_drop = can_drop; } +void +gtk_color_swatch_set_show_alpha (GtkColorSwatch *swatch, + gboolean show_alpha) +{ + swatch->priv->show_alpha = show_alpha; + gtk_widget_queue_draw (GTK_WIDGET (swatch)); +} + + /* vim:set foldmethod=marker: */ diff --git a/gtk/gtkcolorswatch.h b/gtk/gtkcolorswatch.h index 5c98e04482..6c7748b01e 100644 --- a/gtk/gtkcolorswatch.h +++ b/gtk/gtkcolorswatch.h @@ -81,6 +81,8 @@ void gtk_color_swatch_set_can_drop (GtkColorSwatch *swatch, gboolean can_drop); void gtk_color_swatch_set_icon (GtkColorSwatch *swatch, const gchar *icon); +void gtk_color_swatch_set_show_alpha (GtkColorSwatch *swatch, + gboolean show_alpha); G_END_DECLS diff --git a/tests/testcolorchooser.c b/tests/testcolorchooser.c index c84d15730c..c07d169931 100644 --- a/tests/testcolorchooser.c +++ b/tests/testcolorchooser.c @@ -38,6 +38,11 @@ main (int argc, char *argv[]) gtk_init (NULL, NULL); dialog = gtk_color_chooser_dialog_new ("Select a color", NULL); + if (argc > 1 && strcmp (argv[1], "--no-alpha") == 0) + { + g_print ("turning alpha off\n"); + gtk_color_chooser_set_show_alpha (GTK_COLOR_CHOOSER (dialog), FALSE); + } g_signal_connect (dialog, "notify::color", G_CALLBACK (color_changed), NULL); g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), NULL);