From afe8bd6db9ae11ce1ff1cb2dd5aafb4560094b8b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 9 Jul 2014 20:50:47 -0400 Subject: [PATCH] GtkColorButton: Use a color swatch This saves some code and lets us reuse the color swatch styling. Among other things, this fixes a lack of discernible border when the selected color is very similar to the background. https://bugzilla.gnome.org/show_bug.cgi?id=680885 --- gtk/gtkcolorbutton.c | 99 +++++++++----------------------------------- 1 file changed, 19 insertions(+), 80 deletions(-) diff --git a/gtk/gtkcolorbutton.c b/gtk/gtkcolorbutton.c index 47ec009baf..d0c0ec5c48 100644 --- a/gtk/gtkcolorbutton.c +++ b/gtk/gtkcolorbutton.c @@ -35,8 +35,8 @@ #include "gtkcolorchooser.h" #include "gtkcolorchooserprivate.h" #include "gtkcolorchooserdialog.h" +#include "gtkcolorswatchprivate.h" #include "gtkdnd.h" -#include "gtkdrawingarea.h" #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtkintl.h" @@ -54,14 +54,9 @@ */ -/* Size of checks and gray levels for alpha compositing checkerboard */ -#define CHECK_SIZE 4 -#define CHECK_DARK (1.0 / 3.0) -#define CHECK_LIGHT (2.0 / 3.0) - struct _GtkColorButtonPrivate { - GtkWidget *draw_area; /* Widget where we draw the color sample */ + GtkWidget *swatch; /* Widget where we draw the color sample */ GtkWidget *cs_dialog; /* Color selection dialog */ gchar *title; /* Title for the color selection window */ @@ -261,62 +256,6 @@ G_GNUC_END_IGNORE_DEPRECATIONS G_TYPE_NONE, 0); } -static gboolean -gtk_color_button_has_alpha (GtkColorButton *button) -{ - return button->priv->use_alpha && button->priv->rgba.alpha < 1; -} - -/* Handle exposure events for the color picker's drawing area */ -static gint -gtk_color_button_draw_cb (GtkWidget *widget, - cairo_t *cr, - gpointer data) -{ - GtkColorButton *button = GTK_COLOR_BUTTON (data); - cairo_pattern_t *checkered; - - if (gtk_color_button_has_alpha (button)) - { - cairo_set_source_rgb (cr, CHECK_DARK, CHECK_DARK, CHECK_DARK); - cairo_paint (cr); - - cairo_set_source_rgb (cr, CHECK_LIGHT, CHECK_LIGHT, CHECK_LIGHT); - cairo_scale (cr, CHECK_SIZE, CHECK_SIZE); - - checkered = _gtk_color_chooser_get_checkered_pattern (); - cairo_mask (cr, checkered); - cairo_pattern_destroy (checkered); - - gdk_cairo_set_source_rgba (cr, &button->priv->rgba); - } - else - { - cairo_set_source_rgb (cr, - button->priv->rgba.red, - button->priv->rgba.green, - button->priv->rgba.blue); - } - - cairo_paint (cr); - - if (!gtk_widget_is_sensitive (GTK_WIDGET (button))) - { - GtkStyleContext *context; - GdkRGBA color; - - context = gtk_widget_get_style_context (widget); - gtk_style_context_get_background_color (context, GTK_STATE_FLAG_INSENSITIVE, &color); - - gdk_cairo_set_source_rgba (cr, &color); - checkered = _gtk_color_chooser_get_checkered_pattern (); - cairo_mask (cr, checkered); - cairo_pattern_destroy (checkered); - } - - return FALSE; -} - static void gtk_color_button_state_changed (GtkWidget *widget, GtkStateType previous_state) @@ -359,7 +298,8 @@ gtk_color_button_drag_data_received (GtkWidget *widget, button->priv->rgba.blue = dropped[2] / 65535.; button->priv->rgba.alpha = dropped[3] / 65535.; - gtk_widget_queue_draw (button->priv->draw_area); + gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (button->priv->swatch), + &button->priv->rgba); g_signal_emit (button, color_button_signals[COLOR_SET], 0); @@ -377,8 +317,7 @@ set_color_icon (GdkDragContext *context, cairo_surface_t *surface; cairo_t *cr; - surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, - 48, 32); + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 48, 32); cr = cairo_create (surface); gdk_cairo_set_source_rgba (cr, rgba); @@ -429,18 +368,15 @@ gtk_color_button_init (GtkColorButton *button) /* Create the widgets */ button->priv = gtk_color_button_get_instance_private (button); - button->priv->draw_area = gtk_drawing_area_new (); + button->priv->swatch = gtk_color_swatch_new (); layout = gtk_widget_create_pango_layout (GTK_WIDGET (button), "Black"); pango_layout_get_pixel_extents (layout, NULL, &rect); g_object_unref (layout); - gtk_widget_set_size_request (button->priv->draw_area, - rect.width, rect.height); + gtk_widget_set_size_request (button->priv->swatch, rect.width, rect.height); - g_signal_connect (button->priv->draw_area, "draw", - G_CALLBACK (gtk_color_button_draw_cb), button); - gtk_container_add (GTK_CONTAINER (button), button->priv->draw_area); - gtk_widget_show (button->priv->draw_area); + gtk_container_add (GTK_CONTAINER (button), button->priv->swatch); + gtk_widget_show (button->priv->swatch); button->priv->title = g_strdup (_("Pick a Color")); /* default title */ @@ -563,11 +499,11 @@ dialog_response (GtkDialog *dialog, gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (dialog), &button->priv->rgba); + gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (button->priv->swatch), + &button->priv->rgba); gtk_widget_hide (GTK_WIDGET (dialog)); - gtk_widget_queue_draw (button->priv->draw_area); - g_object_ref (button); g_signal_emit (button, color_button_signals[COLOR_SET], 0); @@ -599,7 +535,7 @@ ensure_dialog (GtkColorButton *button) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent)); gtk_window_set_modal (GTK_WINDOW (dialog), - gtk_window_get_modal (GTK_WINDOW (parent))); + gtk_window_get_modal (GTK_WINDOW (parent))); } g_signal_connect (dialog, "response", @@ -648,7 +584,8 @@ gtk_color_button_set_color (GtkColorButton *button, button->priv->rgba.green = color->green / 65535.; button->priv->rgba.blue = color->blue / 65535.; - gtk_widget_queue_draw (button->priv->draw_area); + gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (button->priv->swatch), + &button->priv->rgba); g_object_notify (G_OBJECT (button), "color"); g_object_notify (G_OBJECT (button), "rgba"); @@ -674,7 +611,8 @@ gtk_color_button_set_alpha (GtkColorButton *button, button->priv->rgba.alpha = alpha / 65535.; - gtk_widget_queue_draw (button->priv->draw_area); + gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (button->priv->swatch), + &button->priv->rgba); g_object_notify (G_OBJECT (button), "alpha"); g_object_notify (G_OBJECT (button), "rgba"); @@ -741,7 +679,8 @@ gtk_color_button_set_rgba (GtkColorButton *button, g_return_if_fail (rgba != NULL); button->priv->rgba = *rgba; - gtk_widget_queue_draw (button->priv->draw_area); + gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (button->priv->swatch), + &button->priv->rgba); g_object_notify (G_OBJECT (button), "color"); g_object_notify (G_OBJECT (button), "alpha"); @@ -778,7 +717,7 @@ set_use_alpha (GtkColorButton *button, gboolean use_alpha) { button->priv->use_alpha = use_alpha; - gtk_widget_queue_draw (button->priv->draw_area); + gtk_color_swatch_set_use_alpha (GTK_COLOR_SWATCH (button->priv->swatch), use_alpha); g_object_notify (G_OBJECT (button), "use-alpha"); }