* 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 <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include "gtkcolorchooserprivate.h"
#include "gtkcolorchooserwidget.h"
-#include "gtkcoloreditor.h"
-#include "gtkcolorswatch.h"
+#include "gtkcoloreditorprivate.h"
+#include "gtkcolorswatchprivate.h"
#include "gtkbox.h"
#include "gtkgrid.h"
#include "gtklabel.h"
#include "gtkprivate.h"
#include "gtkintl.h"
#include "gtksizegroup.h"
-#include "gtkalignment.h"
+
+#include <math.h>
/**
* SECTION:gtkcolorchooserwidget
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);
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
{
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
gtk_widget_hide (cc->priv->palette);
gtk_widget_show (cc->priv->editor);
+ g_object_notify (G_OBJECT (cc), "show-editor");
}
static void
{
grid = p->data;
- if (!GTK_IS_GRID (grid))
+ if (!GTK_IS_CONTAINER (grid))
continue;
children = gtk_container_get_children (GTK_CONTAINER (grid));
/* 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;
+
+ 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);
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);
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;
}
{ "#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;
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;
}
{
GtkWidget *box;
GtkWidget *p;
- GtkWidget *alignment;
GtkWidget *button;
GtkWidget *label;
gint i;
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);
+ cc->priv->use_alpha = TRUE;
+
gtk_orientable_set_orientation (GTK_ORIENTABLE (cc), GTK_ORIENTATION_VERTICAL);
cc->priv->palette = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (cc), cc->priv->palette);
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;
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);
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,
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 */
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);
{
select_swatch (cc, swatch);
g_list_free (children);
+ g_list_free (palettes);
return;
}
}
static void
gtk_color_chooser_widget_add_palette (GtkColorChooser *chooser,
- gboolean horizontal,
+ GtkOrientation orientation,
gint colors_per_line,
gint n_colors,
GdkRGBA *colors)
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