[gtk+/wip/colorchooser-v2: 13/40] Make alpha optional



commit 65d5fb91719d17cdeee0f3d135702d45f86c1733
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Jan 31 02:05:37 2012 -0500

    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 a63566f..42e0e97 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 bd5b70e..23db338 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 dc211ec..8d2c229 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 54c59cb..c54181b 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,7 +344,10 @@ 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;
@@ -349,6 +355,36 @@ gtk_color_chooser_widget_get_property (GObject    *object,
 }
 
 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,
                                        const GValue *value,
@@ -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 b79628d..50f82a3 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,7 +289,10 @@ 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;
@@ -289,18 +300,37 @@ gtk_color_editor_get_property (GObject    *object,
 }
 
 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 682fecd..6652ce9 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);
-
-      cairo_set_source_rgb (cr, 0.66, 0.66, 0.66);
+      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);
 
-      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);
+          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);
 
-      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 5c98e04..6c7748b 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 c84d157..c07d169 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);
 



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