]> Pileus Git - ~andy/gtk/commitdiff
Make saving custom colors work as intended
authorMatthias Clasen <mclasen@redhat.com>
Tue, 31 Jan 2012 05:31:41 +0000 (00:31 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 14 Feb 2012 21:36:50 +0000 (16:36 -0500)
The custom colors are now pushed over to the right as new ones
are added, and everything beyond the 9th row gets dropped.
Customized colors are added to the custom colors array.

gtk/gtkcolorchooserdialog.c
gtk/gtkcolorchooserwidget.c

index 76355409e7557f8413eac8ed5ce1cb199d8b699b..dc211ec96f7e62285c13aa367da7a4acab4349cc 100644 (file)
@@ -121,6 +121,19 @@ gtk_color_chooser_dialog_init (GtkColorChooserDialog *cc)
   gtk_widget_pop_composite_child ();
 }
 
+static void
+gtk_color_chooser_dialog_response (GtkDialog *dialog,
+                                   gint       response_id)
+{
+  if (response_id == GTK_RESPONSE_OK)
+    {
+      GdkRGBA color;
+
+      gtk_color_chooser_get_color (GTK_COLOR_CHOOSER (dialog), &color);
+      gtk_color_chooser_set_color (GTK_COLOR_CHOOSER (dialog), &color);
+    }
+}
+
 static void
 gtk_color_chooser_dialog_get_property (GObject    *object,
                                        guint       prop_id,
@@ -168,10 +181,13 @@ static void
 gtk_color_chooser_dialog_class_init (GtkColorChooserDialogClass *class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (class);
+  GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (class);
 
   object_class->get_property = gtk_color_chooser_dialog_get_property;
   object_class->set_property = gtk_color_chooser_dialog_set_property;
 
+  dialog_class->response = gtk_color_chooser_dialog_response;
+
   g_object_class_override_property (object_class, PROP_COLOR, "color");
 
   g_type_class_add_private (class, sizeof (GtkColorChooserDialogPrivate));
index a4ad5e75edde7c59e4994240d9b08b7ea6375830..54c59cb37810738f134194db511ad24993c82fb1 100644 (file)
@@ -40,6 +40,7 @@ struct _GtkColorChooserWidgetPrivate
   GtkWidget *grays;
   GtkWidget *custom;
 
+  GtkWidget *button;
   GtkColorSwatch *current;
 
   GSettings *settings;
@@ -76,7 +77,7 @@ select_swatch (GtkColorChooserWidget *cc,
   g_object_notify (G_OBJECT (cc), "color");
 }
 
-static void save_custom (GtkColorChooserWidget *cc);
+static void save_custom_colors (GtkColorChooserWidget *cc);
 
 static void
 button_activate (GtkColorSwatch        *swatch,
@@ -144,31 +145,32 @@ static void
 connect_custom_signals (GtkWidget *p, gpointer data)
 {
   connect_swatch_signals (p, data);
-  g_signal_connect_swapped (p, "notify::color", G_CALLBACK (save_custom), data);
+  g_signal_connect_swapped (p, "notify::color",
+                            G_CALLBACK (save_custom_colors), data);
 }
 
 static void
-save_custom (GtkColorChooserWidget *cc)
+save_custom_colors (GtkColorChooserWidget *cc)
 {
   GVariantBuilder builder;
   GVariant *variant;
   GdkRGBA color;
-  GList *children, *l;
+  GtkWidget *child;
+  gint i;
 
   g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(dddd)"));
 
-  children = gtk_container_get_children (GTK_CONTAINER (cc->priv->custom));
-  for (l = children; l; l = l->next)
+  i = 1;
+  while ((child = gtk_grid_get_child_at (GTK_GRID (cc->priv->custom), i, 0)) != NULL)
     {
-      if (gtk_color_swatch_get_color (GTK_COLOR_SWATCH (l->data), &color))
+      i++;
+      if (gtk_color_swatch_get_color (GTK_COLOR_SWATCH (child), &color))
         {
           g_variant_builder_add (&builder, "(dddd)",
                                  color.red, color.green, color.blue, color.alpha);
-        }
+       }
     }
 
-  g_list_free (children);
-
   variant = g_variant_builder_end (&builder);
   g_settings_set_value (cc->priv->settings, "custom-colors", variant);
 }
@@ -273,7 +275,7 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc)
   gtk_grid_set_column_spacing (GTK_GRID (grid), 4);
   gtk_container_add (GTK_CONTAINER (cc->priv->palette), grid);
 
-  button = gtk_color_swatch_new ();
+  cc->priv->button = button = gtk_color_swatch_new ();
   gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (button), 10, 10, 10, 10);
   connect_button_signals (button, cc);
   gtk_color_swatch_set_icon (GTK_COLOR_SWATCH (button), "list-add-symbolic");
@@ -409,6 +411,37 @@ gtk_color_chooser_widget_get_color (GtkColorChooser *chooser,
     }
 }
 
+static void
+add_custom_color (GtkColorChooserWidget *cc,
+                  const GdkRGBA         *color)
+{
+  GtkWidget *last;
+  GtkWidget *p;
+
+  last = gtk_grid_get_child_at (GTK_GRID (cc->priv->custom), 9, 0);
+  if (last)
+    gtk_container_remove (GTK_CONTAINER (cc->priv->custom), last);
+
+  gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (cc->priv->button), 10, 1, 1, 10);
+
+  p = gtk_color_swatch_new ();
+  gtk_color_swatch_set_color (GTK_COLOR_SWATCH (p), color);
+  gtk_color_swatch_set_can_drop (GTK_COLOR_SWATCH (p), TRUE);
+  connect_custom_signals (p, cc);
+
+  if (gtk_grid_get_child_at (GTK_GRID (cc->priv->custom), 1, 0) != NULL)
+    gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 1, 1, 1);
+  else
+    gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 10, 10, 1);
+
+  gtk_grid_insert_next_to (GTK_GRID (cc->priv->custom), cc->priv->button, GTK_POS_RIGHT);
+  gtk_grid_attach (GTK_GRID (cc->priv->custom), p, 1, 0, 1, 1);
+  gtk_widget_show (p);
+
+  select_swatch (cc, GTK_COLOR_SWATCH (p));
+  save_custom_colors (cc);
+}
+
 static void
 gtk_color_chooser_widget_set_color (GtkColorChooser *chooser,
                                     const GdkRGBA   *color)
@@ -441,7 +474,7 @@ gtk_color_chooser_widget_set_color (GtkColorChooser *chooser,
       g_list_free (children);
     }
 
-  /* FIXME: add new custom color */
+  add_custom_color (cc, color);
 }
 
 static void