X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcolorchooserwidget.c;h=8e6cf2c82e78506d8cdf72e1aa032b3c4d91b01e;hb=190dcfe050814e979c364bf74ae83530aba4c686;hp=dc48c18ee22de50188521896ca582c5e516ff4c4;hpb=7f44feab194c512e81ae263d09e65869d54c0fc4;p=~andy%2Fgtk diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c index dc48c18ee..8e6cf2c82 100644 --- a/gtk/gtkcolorchooserwidget.c +++ b/gtk/gtkcolorchooserwidget.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -31,7 +29,8 @@ #include "gtkprivate.h" #include "gtkintl.h" #include "gtksizegroup.h" -#include "gtkalignment.h" + +#include /** * SECTION:gtkcolorchooserwidget @@ -101,8 +100,8 @@ select_swatch (GtkColorChooserWidget *cc, return; if (cc->priv->current != NULL) - gtk_color_swatch_set_selected (cc->priv->current, FALSE); - gtk_color_swatch_set_selected (swatch, TRUE); + gtk_widget_unset_state_flags (GTK_WIDGET (cc->priv->current), GTK_STATE_FLAG_SELECTED); + gtk_widget_set_state_flags (GTK_WIDGET (swatch), GTK_STATE_FLAG_SELECTED, FALSE); cc->priv->current = swatch; gtk_color_swatch_get_rgba (swatch, &color); @@ -133,14 +132,20 @@ swatch_customize (GtkColorSwatch *swatch, gtk_widget_hide (cc->priv->palette); gtk_widget_show (cc->priv->editor); + g_object_notify (G_OBJECT (cc), "show-editor"); } static void swatch_selected (GtkColorSwatch *swatch, - GParamSpec *pspec, + GtkStateFlags previous, GtkColorChooserWidget *cc) { - select_swatch (cc, swatch); + GtkStateFlags flags; + + flags = gtk_widget_get_state_flags (GTK_WIDGET (swatch)); + if ((flags & GTK_STATE_FLAG_SELECTED) != (previous & GTK_STATE_FLAG_SELECTED) && + (flags & GTK_STATE_FLAG_SELECTED) != 0) + select_swatch (cc, swatch); } static void @@ -149,7 +154,7 @@ connect_swatch_signals (GtkWidget *p, { g_signal_connect (p, "activate", G_CALLBACK (swatch_activate), data); g_signal_connect (p, "customize", G_CALLBACK (swatch_customize), data); - g_signal_connect (p, "notify::selected", G_CALLBACK (swatch_selected), data); + g_signal_connect (p, "state-flags-changed", G_CALLBACK (swatch_selected), data); } static void @@ -163,6 +168,7 @@ button_activate (GtkColorSwatch *swatch, gtk_widget_hide (cc->priv->palette); gtk_widget_show (cc->priv->editor); + g_object_notify (G_OBJECT (cc), "show-editor"); } static void @@ -259,19 +265,73 @@ gtk_color_chooser_widget_set_show_editor (GtkColorChooserWidget *cc, /* UI construction {{{1 */ +static guint +scale_round (gdouble value, gdouble scale) +{ + value = floor (value * scale + 0.5); + value = MAX (value, 0); + value = MIN (value, scale); + return (guint)value; +} + +static gchar * +accessible_color_name (GdkRGBA *color) +{ + if (color->alpha < 1.0) + return g_strdup_printf (_("Red %d%%, Green %d%%, Blue %d%%, Alpha %d%%"), + scale_round (color->red, 100), + scale_round (color->green, 100), + scale_round (color->blue, 100), + scale_round (color->alpha, 100)); + else + return g_strdup_printf (_("Red %d%%, Green %d%%, Blue %d%%"), + scale_round (color->red, 100), + scale_round (color->green, 100), + scale_round (color->blue, 100)); +} + +static void +remove_palette (GtkColorChooserWidget *cc) +{ + GList *children, *l; + GtkWidget *widget; + + if (cc->priv->current != NULL && + gtk_widget_get_parent (GTK_WIDGET (cc->priv->current)) != cc->priv->custom) + cc->priv->current = NULL; + + children = gtk_container_get_children (GTK_CONTAINER (cc->priv->palette)); + for (l = children; l; l = l->next) + { + widget = l->data; + if (widget == cc->priv->custom_label || widget == cc->priv->custom) + continue; + gtk_container_remove (GTK_CONTAINER (cc->priv->palette), widget); + } + g_list_free (children); +} + static void -add_palette (GtkColorChooserWidget *cc, - gboolean horizontal, - gint colors_per_line, - gint n_colors, - GdkRGBA *colors) +add_palette (GtkColorChooserWidget *cc, + GtkOrientation orientation, + gint colors_per_line, + gint n_colors, + GdkRGBA *colors, + const gchar **names) { GtkWidget *grid; GtkWidget *p; + AtkObject *atk_obj; gint line, pos; gint i; gint left, right; + if (colors == NULL) + { + remove_palette (cc); + return; + } + grid = gtk_grid_new (); gtk_widget_set_margin_bottom (grid, 12); gtk_grid_set_row_spacing (GTK_GRID (grid), 2); @@ -290,13 +350,29 @@ add_palette (GtkColorChooserWidget *cc, for (i = 0; i < n_colors; i++) { p = gtk_color_swatch_new (); + atk_obj = gtk_widget_get_accessible (p); + if (names) + { + atk_object_set_description (atk_obj, + g_dpgettext2 (GETTEXT_PACKAGE, "Color name", names[i])); + } + else + { + gchar *text, *name; + + name = accessible_color_name (&colors[i]); + text = g_strdup_printf (_("Color: %s"), name); + atk_object_set_description (atk_obj, text); + g_free (text); + g_free (name); + } gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (p), &colors[i]); connect_swatch_signals (p, cc); line = i / colors_per_line; pos = i % colors_per_line; - if (horizontal) + if (orientation == GTK_ORIENTATION_HORIZONTAL) { if (pos == left) gtk_style_context_add_class (gtk_widget_get_style_context (p), GTK_STYLE_CLASS_LEFT); @@ -322,22 +398,10 @@ add_palette (GtkColorChooserWidget *cc, static void remove_default_palette (GtkColorChooserWidget *cc) { - GList *children, *l; - GtkWidget *widget; - if (!cc->priv->has_default_palette) return; - children = gtk_container_get_children (GTK_CONTAINER (cc->priv->palette)); - for (l = children; l; l = l->next) - { - widget = l->data; - if (widget == cc->priv->custom_label || widget == cc->priv->custom) - continue; - gtk_container_remove (GTK_CONTAINER (cc->priv->palette), widget); - } - g_list_free (children); - + remove_palette (cc); cc->priv->has_default_palette = FALSE; } @@ -355,16 +419,56 @@ add_default_palette (GtkColorChooserWidget *cc) { "#888a85", "#555753", "#2e3436" }, /* Aluminum 1 */ { "#eeeeec", "#d3d7cf", "#babdb6" } /* Aluminum 2 */ }; + const gchar *color_names[] = { + NC_("Color name", "Light Scarlet Red"), + NC_("Color name", "Scarlet Red"), + NC_("Color name", "Dark Scarlet Red"), + NC_("Color name", "Light Orange"), + NC_("Color name", "Orange"), + NC_("Color name", "Dark Orange"), + NC_("Color name", "Light Butter"), + NC_("Color name", "Butter"), + NC_("Color name", "Dark Butter"), + NC_("Color name", "Light Chameleon"), + NC_("Color name", "Chameleon"), + NC_("Color name", "Dark Chameleon"), + NC_("Color name", "Light Sky Blue"), + NC_("Color name", "Sky Blue"), + NC_("Color name", "Dark Sky Blue"), + NC_("Color name", "Light Plum"), + NC_("Color name", "Plum"), + NC_("Color name", "Dark Plum"), + NC_("Color name", "Light Chocolate"), + NC_("Color name", "Chocolate"), + NC_("Color name", "Dark Chocolate"), + NC_("Color name", "Light Aluminum 1"), + NC_("Color name", "Aluminum 1"), + NC_("Color name", "Dark Aluminum 1"), + NC_("Color name", "Light Aluminum 2"), + NC_("Color name", "Aluminum 2"), + NC_("Color name", "Dark Aluminum 2") + }; const gchar *default_grays[9] = { - "#000000", - "#2e3436", - "#555753", - "#888a85", - "#babdb6", - "#d3d7cf", - "#eeeeec", - "#f3f3f3", - "#ffffff" + "#000000", /* black */ + "#2e3436", /* very dark gray */ + "#555753", /* darker gray */ + "#888a85", /* dark gray */ + "#babdb6", /* medium gray */ + "#d3d7cf", /* light gray */ + "#eeeeec", /* lighter gray */ + "#f3f3f3", /* very light gray */ + "#ffffff" /* white */ + }; + const gchar *gray_names[] = { + NC_("Color name", "Black"), + NC_("Color name", "Very Dark Gray"), + NC_("Color name", "Darker Gray"), + NC_("Color name", "Dark Gray"), + NC_("Color name", "Medium Gray"), + NC_("Color name", "Light Gray"), + NC_("Color name", "Lighter Gray"), + NC_("Color name", "Very Light Gray"), + NC_("Color name", "White") }; GdkRGBA colors[9*3]; gint i, j; @@ -373,12 +477,12 @@ add_default_palette (GtkColorChooserWidget *cc) for (j = 0; j < 3; j++) gdk_rgba_parse (&colors[i*3 + j], default_colors[i][j]); - add_palette (cc, FALSE, 3, 9*3, colors); + add_palette (cc, GTK_ORIENTATION_VERTICAL, 3, 9*3, colors, color_names); for (i = 0; i < 9; i++) gdk_rgba_parse (&colors[i], default_grays[i]); - add_palette (cc, TRUE, 9, 9, colors); + add_palette (cc, GTK_ORIENTATION_HORIZONTAL, 9, 9, colors, gray_names); cc->priv->has_default_palette = TRUE; } @@ -388,7 +492,6 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) { GtkWidget *box; GtkWidget *p; - GtkWidget *alignment; GtkWidget *button; GtkWidget *label; gint i; @@ -396,6 +499,8 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) GVariant *variant; GVariantIter iter; gboolean selected; + AtkObject *atk_obj; + gchar *text, *name; cc->priv = G_TYPE_INSTANCE_GET_PRIVATE (cc, GTK_TYPE_COLOR_CHOOSER_WIDGET, GtkColorChooserWidgetPrivate); @@ -417,12 +522,15 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) gtk_box_pack_end (GTK_BOX (cc->priv->palette), label, FALSE, TRUE, 0); cc->priv->button = button = gtk_color_swatch_new (); + gtk_widget_set_name (button, "add-color-button"); + atk_obj = gtk_widget_get_accessible (button); + atk_object_set_role (atk_obj, ATK_ROLE_PUSH_BUTTON); + atk_object_set_description (atk_obj, _("Create custom color")); connect_button_signals (button, cc); gtk_color_swatch_set_icon (GTK_COLOR_SWATCH (button), "list-add-symbolic"); gtk_container_add (GTK_CONTAINER (box), button); - cc->priv->settings = g_settings_new_with_path ("org.gtk.Settings.ColorChooser", - "/org/gtk/settings/color-chooser/"); + cc->priv->settings = g_settings_new ("org.gtk.Settings.ColorChooser"); variant = g_settings_get_value (cc->priv->settings, "custom-colors"); g_variant_iter_init (&iter, variant); i = 0; @@ -433,6 +541,12 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) p = gtk_color_swatch_new (); gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (p), &color); gtk_color_swatch_set_can_drop (GTK_COLOR_SWATCH (p), TRUE); + atk_obj = gtk_widget_get_accessible (p); + name = accessible_color_name (&color); + text = g_strdup_printf (_("Custom color %d: %s"), i, name); + atk_object_set_description (atk_obj, text); + g_free (text); + g_free (name); connect_custom_signals (p, cc); gtk_container_add (GTK_CONTAINER (box), p); @@ -442,9 +556,12 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) g_variant_unref (variant); cc->priv->editor = gtk_color_editor_new (); - alignment = gtk_alignment_new (0.5, 0.5, 0, 0); - gtk_container_add (GTK_CONTAINER (cc), alignment); - gtk_container_add (GTK_CONTAINER (alignment), cc->priv->editor); + gtk_widget_set_halign (cc->priv->editor, GTK_ALIGN_CENTER); + gtk_widget_set_hexpand (cc->priv->editor, TRUE); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_container_add (GTK_CONTAINER (cc), box); + gtk_container_add (GTK_CONTAINER (box), cc->priv->editor); g_settings_get (cc->priv->settings, "selected-color", "(bdddd)", &selected, @@ -461,7 +578,7 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) cc->priv->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); gtk_size_group_add_widget (cc->priv->size_group, cc->priv->palette); - gtk_size_group_add_widget (cc->priv->size_group, alignment); + gtk_size_group_add_widget (cc->priv->size_group, box); } /* GObject implementation {{{1 */ @@ -597,7 +714,7 @@ add_custom_color (GtkColorChooserWidget *cc, GList *children; children = gtk_container_get_children (GTK_CONTAINER (cc->priv->custom)); - if (g_list_length (children) == 8) + if (g_list_length (children) >= 8) { last = g_list_last (children)->data; gtk_widget_destroy (last); @@ -647,6 +764,7 @@ gtk_color_chooser_widget_set_rgba (GtkColorChooser *chooser, { select_swatch (cc, swatch); g_list_free (children); + g_list_free (palettes); return; } } @@ -659,7 +777,7 @@ gtk_color_chooser_widget_set_rgba (GtkColorChooser *chooser, static void gtk_color_chooser_widget_add_palette (GtkColorChooser *chooser, - gboolean horizontal, + GtkOrientation orientation, gint colors_per_line, gint n_colors, GdkRGBA *colors) @@ -667,7 +785,7 @@ gtk_color_chooser_widget_add_palette (GtkColorChooser *chooser, GtkColorChooserWidget *cc = GTK_COLOR_CHOOSER_WIDGET (chooser); remove_default_palette (cc); - add_palette (cc, horizontal, colors_per_line, n_colors, colors); + add_palette (cc, orientation, colors_per_line, n_colors, colors, NULL); } static void