Add API to set palettes

I'm not really convinced by this; the API is a little complicated.
May need more thought.
This commit is contained in:
Matthias Clasen
2012-02-04 01:45:55 -05:00
parent d7cff0797e
commit 8f201d62d9
6 changed files with 250 additions and 90 deletions

View File

@ -990,6 +990,20 @@ gtk_color_button_get_property (GObject *object,
} }
} }
static void
gtk_color_button_add_palette (GtkColorChooser *chooser,
gboolean horizontal,
gint colors_per_line,
gint n_colors,
GdkRGBA *colors)
{
GtkColorButton *button = GTK_COLOR_BUTTON (chooser);
if (button->priv->cs_dialog)
gtk_color_chooser_add_palette (GTK_COLOR_CHOOSER (button->priv->cs_dialog),
horizontal, colors_per_line, n_colors, colors);
}
typedef void (* get_rgba) (GtkColorChooser *, GdkRGBA *); typedef void (* get_rgba) (GtkColorChooser *, GdkRGBA *);
typedef void (* set_rgba) (GtkColorChooser *, const GdkRGBA *); typedef void (* set_rgba) (GtkColorChooser *, const GdkRGBA *);
@ -998,5 +1012,6 @@ gtk_color_button_iface_init (GtkColorChooserInterface *iface)
{ {
iface->get_rgba = (get_rgba)gtk_color_button_get_rgba; iface->get_rgba = (get_rgba)gtk_color_button_get_rgba;
iface->set_rgba = (set_rgba)gtk_color_button_set_rgba; iface->set_rgba = (set_rgba)gtk_color_button_set_rgba;
iface->add_palette = gtk_color_button_add_palette;
} }

View File

@ -197,3 +197,15 @@ gtk_color_chooser_set_use_alpha (GtkColorChooser *chooser,
g_object_set (chooser, "use-alpha", use_alpha, NULL); g_object_set (chooser, "use-alpha", use_alpha, NULL);
} }
void
gtk_color_chooser_add_palette (GtkColorChooser *chooser,
gboolean horizontal,
gint colors_per_line,
gint n_colors,
GdkRGBA *colors)
{
g_return_if_fail (GTK_IS_COLOR_CHOOSER (chooser));
GTK_COLOR_CHOOSER_GET_IFACE (chooser)->add_palette (chooser, horizontal, colors_per_line, n_colors, colors);
}

View File

@ -42,10 +42,16 @@ struct _GtkColorChooserInterface
GTypeInterface base_interface; GTypeInterface base_interface;
/* Methods */ /* Methods */
void (* get_rgba) (GtkColorChooser *chooser, void (* get_rgba) (GtkColorChooser *chooser,
GdkRGBA *color); GdkRGBA *color);
void (* set_rgba) (GtkColorChooser *chooser, void (* set_rgba) (GtkColorChooser *chooser,
const GdkRGBA *color); const GdkRGBA *color);
void (* add_palette) (GtkColorChooser *chooser,
gboolean horizontal,
gint colors_per_line,
gint n_colors,
GdkRGBA *colors);
/* Signals */ /* Signals */
void (* color_activated) (GtkColorChooser *chooser, void (* color_activated) (GtkColorChooser *chooser,
@ -65,6 +71,12 @@ gboolean gtk_color_chooser_get_use_alpha (GtkColorChooser *chooser);
void gtk_color_chooser_set_use_alpha (GtkColorChooser *chooser, void gtk_color_chooser_set_use_alpha (GtkColorChooser *chooser,
gboolean use_alpha); gboolean use_alpha);
void gtk_color_chooser_add_palette (GtkColorChooser *chooser,
gboolean horizontal,
gint colors_per_line,
gint n_colors,
GdkRGBA *colors);
G_END_DECLS G_END_DECLS
#endif /* __GTK_COLOR_CHOOSER_H__ */ #endif /* __GTK_COLOR_CHOOSER_H__ */

View File

@ -253,11 +253,25 @@ gtk_color_chooser_dialog_set_rgba (GtkColorChooser *chooser,
gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (cc->priv->chooser), color); gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (cc->priv->chooser), color);
} }
static void
gtk_color_chooser_dialog_add_palette (GtkColorChooser *chooser,
gboolean horizontal,
gint colors_per_line,
gint n_colors,
GdkRGBA *colors)
{
GtkColorChooserDialog *cc = GTK_COLOR_CHOOSER_DIALOG (chooser);
gtk_color_chooser_add_palette (GTK_COLOR_CHOOSER (cc->priv->chooser),
horizontal, colors_per_line, n_colors, colors);
}
static void static void
gtk_color_chooser_dialog_iface_init (GtkColorChooserInterface *iface) gtk_color_chooser_dialog_iface_init (GtkColorChooserInterface *iface)
{ {
iface->get_rgba = gtk_color_chooser_dialog_get_rgba; iface->get_rgba = gtk_color_chooser_dialog_get_rgba;
iface->set_rgba = gtk_color_chooser_dialog_set_rgba; iface->set_rgba = gtk_color_chooser_dialog_set_rgba;
iface->add_palette = gtk_color_chooser_dialog_add_palette;
} }
/** /**

View File

@ -65,14 +65,14 @@ struct _GtkColorChooserWidgetPrivate
GtkWidget *editor; GtkWidget *editor;
GtkSizeGroup *size_group; GtkSizeGroup *size_group;
GtkWidget *colors; GtkWidget *custom_label;
GtkWidget *grays;
GtkWidget *custom; GtkWidget *custom;
GtkWidget *button; GtkWidget *button;
GtkColorSwatch *current; GtkColorSwatch *current;
gboolean use_alpha; gboolean use_alpha;
gboolean has_default_palette;
GSettings *settings; GSettings *settings;
}; };
@ -209,21 +209,23 @@ static void
gtk_color_chooser_widget_set_use_alpha (GtkColorChooserWidget *cc, gtk_color_chooser_widget_set_use_alpha (GtkColorChooserWidget *cc,
gboolean use_alpha) gboolean use_alpha)
{ {
GtkWidget *grids[3];
gint i;
GList *children, *l; GList *children, *l;
GList *palettes, *p;
GtkWidget *swatch; GtkWidget *swatch;
GtkWidget *grid;
cc->priv->use_alpha = use_alpha; cc->priv->use_alpha = use_alpha;
gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (cc->priv->editor), use_alpha); gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (cc->priv->editor), use_alpha);
grids[0] = cc->priv->colors; palettes = gtk_container_get_children (GTK_CONTAINER (cc->priv->palette));
grids[1] = cc->priv->grays; for (p = palettes; p; p = p->next)
grids[2] = cc->priv->custom;
for (i = 0; i < 3; i++)
{ {
children = gtk_container_get_children (GTK_CONTAINER (grids[i])); grid = p->data;
if (!GTK_IS_GRID (grid))
continue;
children = gtk_container_get_children (GTK_CONTAINER (grid));
for (l = children; l; l = l->next) for (l = children; l; l = l->next)
{ {
swatch = l->data; swatch = l->data;
@ -231,6 +233,7 @@ gtk_color_chooser_widget_set_use_alpha (GtkColorChooserWidget *cc,
} }
g_list_free (children); g_list_free (children);
} }
g_list_free (palettes);
gtk_widget_queue_draw (GTK_WIDGET (cc)); gtk_widget_queue_draw (GTK_WIDGET (cc));
} }
@ -255,20 +258,94 @@ gtk_color_chooser_widget_set_show_editor (GtkColorChooserWidget *cc,
/* UI construction {{{1 */ /* UI construction {{{1 */
static void static void
gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) add_palette (GtkColorChooserWidget *cc,
gboolean horizontal,
gint colors_per_line,
gint n_colors,
GdkRGBA *colors)
{ {
GtkWidget *grid; GtkWidget *grid;
GtkWidget *p; GtkWidget *p;
GtkWidget *alignment; gint line, pos;
GtkWidget *button; gint i;
GtkWidget *label; gint left, right;
gint i, j;
gint left; grid = gtk_grid_new ();
GdkRGBA color; gtk_widget_set_margin_bottom (grid, 12);
GVariant *variant; gtk_grid_set_row_spacing (GTK_GRID (grid), 2);
GVariantIter iter; gtk_grid_set_column_spacing (GTK_GRID (grid), 4);
gboolean selected; gtk_container_add (GTK_CONTAINER (cc->priv->palette), grid);
const gchar *default_palette[9][3] = {
left = 0;
right = colors_per_line - 1;
if (gtk_widget_get_direction (GTK_WIDGET (cc)) == GTK_TEXT_DIR_RTL)
{
i = left;
left = right;
right = i;
}
for (i = 0; i < n_colors; i++)
{
p = gtk_color_swatch_new ();
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)
{
gtk_grid_attach (GTK_GRID (grid), p, pos, line, 1, 1);
if (pos == left)
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 10, 1, 1, 10);
else if (pos == right)
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 10, 10, 1);
else
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 1, 1, 1);
}
else
{
gtk_grid_attach (GTK_GRID (grid), p, line, pos, 1, 1);
if (pos == 0)
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 10, 10, 1, 1);
else if (pos == colors_per_line - 1)
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 1, 10, 10);
else
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 1, 1, 1);
}
}
gtk_widget_show_all (grid);
}
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);
cc->priv->has_default_palette = FALSE;
}
static void
add_default_palette (GtkColorChooserWidget *cc)
{
const gchar *default_colors[9][3] = {
{ "#ef2929", "#cc0000", "#a40000" }, /* Scarlet Red */ { "#ef2929", "#cc0000", "#a40000" }, /* Scarlet Red */
{ "#fcaf3e", "#f57900", "#ce5c00" }, /* Orange */ { "#fcaf3e", "#f57900", "#ce5c00" }, /* Orange */
{ "#fce94f", "#edd400", "#c4a000" }, /* Butter */ { "#fce94f", "#edd400", "#c4a000" }, /* Butter */
@ -279,7 +356,7 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc)
{ "#888a85", "#555753", "#2e3436" }, /* Aluminum 1 */ { "#888a85", "#555753", "#2e3436" }, /* Aluminum 1 */
{ "#eeeeec", "#d3d7cf", "#babdb6" } /* Aluminum 2 */ { "#eeeeec", "#d3d7cf", "#babdb6" } /* Aluminum 2 */
}; };
const gchar *default_grayscale[9] = { const gchar *default_grays[9] = {
"#000000", "#000000",
"#2e3436", "#2e3436",
"#555753", "#555753",
@ -290,6 +367,36 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc)
"#f3f3f3", "#f3f3f3",
"#ffffff" "#ffffff"
}; };
GdkRGBA colors[9*3];
gint i, j;
for (i = 0; i < 9; i++)
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);
for (i = 0; i < 9; i++)
gdk_rgba_parse (&colors[i], default_grays[i]);
add_palette (cc, TRUE, 9, 9, colors);
cc->priv->has_default_palette = TRUE;
}
static void
gtk_color_chooser_widget_init (GtkColorChooserWidget *cc)
{
GtkWidget *grid;
GtkWidget *p;
GtkWidget *alignment;
GtkWidget *button;
GtkWidget *label;
gint i;
GdkRGBA color;
GVariant *variant;
GVariantIter iter;
gboolean selected;
cc->priv = G_TYPE_INSTANCE_GET_PRIVATE (cc, GTK_TYPE_COLOR_CHOOSER_WIDGET, GtkColorChooserWidgetPrivate); cc->priv = G_TYPE_INSTANCE_GET_PRIVATE (cc, GTK_TYPE_COLOR_CHOOSER_WIDGET, GtkColorChooserWidgetPrivate);
@ -297,66 +404,17 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc)
cc->priv->palette = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); cc->priv->palette = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (cc), cc->priv->palette); gtk_container_add (GTK_CONTAINER (cc), cc->priv->palette);
cc->priv->colors = grid = gtk_grid_new (); add_default_palette (cc);
gtk_widget_set_margin_bottom (grid, 12);
gtk_grid_set_row_spacing (GTK_GRID (grid), 2);
gtk_grid_set_column_spacing (GTK_GRID (grid), 4);
gtk_container_add (GTK_CONTAINER (cc->priv->palette), grid);
for (i = 0; i < 9; i++)
{
for (j = 0; j < 3; j++)
{
gdk_rgba_parse (&color, default_palette[i][j]);
p = gtk_color_swatch_new ();
connect_swatch_signals (p, cc);
if (j == 0)
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 10, 10, 1, 1);
else if (j == 2)
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 1, 10, 10);
else
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 1, 1, 1);
gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (p), &color);
gtk_grid_attach (GTK_GRID (grid), p, i, j, 1, 1);
}
}
cc->priv->grays = grid = gtk_grid_new ();
g_object_set (grid, "margin-bottom", 18, NULL);
gtk_grid_set_column_spacing (GTK_GRID (grid), 4);
gtk_container_add (GTK_CONTAINER (cc->priv->palette), grid);
left = (gtk_widget_get_direction (GTK_WIDGET (cc)) == GTK_TEXT_DIR_LTR) ? 0 : 8;
for (i = 0; i < 9; i++)
{
gdk_rgba_parse (&color, default_grayscale[i]);
p = gtk_color_swatch_new ();
connect_swatch_signals (p, cc);
if (i == left)
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 10, 1, 1, 10);
else if (i == (8 - left))
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 10, 10, 1);
else
gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (p), 1, 1, 1, 1);
gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (p), &color);
gtk_grid_attach (GTK_GRID (grid), p, i, 0, 1, 1);
}
/* translators: label for the custom section in the color chooser */
label = gtk_label_new (_("Custom"));
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_container_add (GTK_CONTAINER (cc->priv->palette), label);
cc->priv->custom = grid = gtk_grid_new (); cc->priv->custom = grid = gtk_grid_new ();
g_object_set (grid, "margin-top", 12, NULL); g_object_set (grid, "margin-top", 12, NULL);
gtk_grid_set_column_spacing (GTK_GRID (grid), 4); gtk_grid_set_column_spacing (GTK_GRID (grid), 4);
gtk_container_add (GTK_CONTAINER (cc->priv->palette), grid); gtk_box_pack_end (GTK_BOX (cc->priv->palette), grid, FALSE, TRUE, 0);
/* translators: label for the custom section in the color chooser */
cc->priv->custom_label = label = gtk_label_new (_("Custom"));
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_box_pack_end (GTK_BOX (cc->priv->palette), label, FALSE, TRUE, 0);
cc->priv->button = 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); gtk_color_swatch_set_corner_radii (GTK_COLOR_SWATCH (button), 10, 10, 10, 10);
@ -369,6 +427,7 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc)
variant = g_settings_get_value (cc->priv->settings, "custom-colors"); variant = g_settings_get_value (cc->priv->settings, "custom-colors");
g_variant_iter_init (&iter, variant); g_variant_iter_init (&iter, variant);
i = 0; i = 0;
p = NULL;
while (g_variant_iter_loop (&iter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha)) while (g_variant_iter_loop (&iter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha))
{ {
i++; i++;
@ -586,18 +645,19 @@ gtk_color_chooser_widget_set_rgba (GtkColorChooser *chooser,
{ {
GtkColorChooserWidget *cc = GTK_COLOR_CHOOSER_WIDGET (chooser); GtkColorChooserWidget *cc = GTK_COLOR_CHOOSER_WIDGET (chooser);
GList *children, *l; GList *children, *l;
GList *palettes, *p;
GtkColorSwatch *swatch; GtkColorSwatch *swatch;
GtkWidget *grid;
GdkRGBA c; GdkRGBA c;
GtkWidget *grids[3];
gint i;
grids[0] = cc->priv->colors; palettes = gtk_container_get_children (GTK_CONTAINER (cc->priv->palette));
grids[1] = cc->priv->grays; for (p = palettes; p; p = p->next)
grids[2] = cc->priv->custom;
for (i = 0; i < 3; i++)
{ {
children = gtk_container_get_children (GTK_CONTAINER (grids[i])); grid = p->data;
if (!GTK_IS_GRID (grid))
continue;
children = gtk_container_get_children (GTK_CONTAINER (grid));
for (l = children; l; l = l->next) for (l = children; l; l = l->next)
{ {
swatch = l->data; swatch = l->data;
@ -613,15 +673,30 @@ gtk_color_chooser_widget_set_rgba (GtkColorChooser *chooser,
} }
g_list_free (children); g_list_free (children);
} }
g_list_free (palettes);
add_custom_color (cc, color); add_custom_color (cc, color);
} }
static void
gtk_color_chooser_widget_add_palette (GtkColorChooser *chooser,
gboolean horizontal,
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);
}
static void static void
gtk_color_chooser_widget_iface_init (GtkColorChooserInterface *iface) gtk_color_chooser_widget_iface_init (GtkColorChooserInterface *iface)
{ {
iface->get_rgba = gtk_color_chooser_widget_get_rgba; iface->get_rgba = gtk_color_chooser_widget_get_rgba;
iface->set_rgba = gtk_color_chooser_widget_set_rgba; iface->set_rgba = gtk_color_chooser_widget_set_rgba;
iface->add_palette = gtk_color_chooser_widget_add_palette;
} }
/* Public API {{{1 */ /* Public API {{{1 */

View File

@ -52,6 +52,38 @@ main (int argc, char *argv[])
g_print ("starting in edit mode\n"); g_print ("starting in edit mode\n");
g_object_set (dialog, "show-editor", TRUE, NULL); g_object_set (dialog, "show-editor", TRUE, NULL);
} }
else if (g_strcmp0 (argv[i], "--palette") == 0)
{
const gchar *c[4] = { "red", "maroon", "yellow", "green" };
GdkRGBA color;
GdkRGBA colors[36];
gint i,j;
gdouble f[5] = { 0.2, 0.35, 0.5, 0.65, 0.8 };
g_print ("setting custom palette\n");
for (i = 0; i < 4; i++)
{
gdk_rgba_parse (&color, c[i]);
for (j = 0; j < 5; j++)
{
colors[i*9 + j].red = f[j]*color.red;
colors[i*9 + j].green = f[j]*color.green;
colors[i*9 + j].blue = f[j]*color.blue;
colors[i*9 + j].alpha = 1;
}
for (j = 5; j < 9; j++)
{
colors[i*9 + j].red = f[9-j]*color.red + (1-f[9-j]);
colors[i*9 + j].green = f[9-j]*color.green + (1-f[9-j]);
colors[i*9 + j].blue = f[9-j]*color.blue + (1-f[9-j]);
colors[i*9 + j].alpha = 1;
}
}
gtk_color_chooser_add_palette (GTK_COLOR_CHOOSER (dialog),
FALSE,
9, 36,
colors);
}
} }
g_signal_connect (dialog, "notify::color", G_CALLBACK (color_changed), NULL); g_signal_connect (dialog, "notify::color", G_CALLBACK (color_changed), NULL);