2 * This file is a part of hildon
4 * Copyright (C) 2005, 2006 Nokia Corporation, all rights reserved.
6 * Author: Kuisma Salonen <kuisma.salonen@nokia.com>
7 * Contact: Michael Dominic Kostrzewa <michael.kostrzewa@nokia.com>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; version 2.1 of
14 * This library is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
34 #include <gdk/gdkkeysyms.h>
36 #include <gconf/gconf-client.h>
37 #include "hildon-color-chooser-dialog.h"
38 #include "hildon-color-chooser.h"
39 #include "hildon-defines.h"
40 #include "hildon-banner.h"
41 #include "hildon-color-chooser-dialog-private.h"
43 #define _(String) dgettext(PACKAGE, String)
45 static HildonColorChooserDialogClass* parent_class = NULL;
47 /* darkened EGA palette to be used as predefined colors if style doesn't
48 define anything else (darker colors are darkened 0x8000 -> 0x6666) */
49 static GdkColor hardcoded_colors[16] = {{0, 0x0000, 0x0000, 0x0000},
50 {0, 0x6666, 0x6666, 0x6666},
51 {0, 0x6666, 0x0000, 0x0000},
52 {0, 0x0000, 0x6666, 0x0000},
53 {0, 0x0000, 0x0000, 0x6666},
54 {0, 0x6666, 0x6666, 0x0000},
55 {0, 0x6666, 0x0000, 0x6666},
56 {0, 0x0000, 0x6666, 0x6666},
57 {0, 0xffff, 0xffff, 0xffff},
58 {0, 0xc000, 0xc000, 0xc000},
59 {0, 0xffff, 0x0000, 0x0000},
60 {0, 0x0000, 0xffff, 0x0000},
61 {0, 0x0000, 0x0000, 0xffff},
62 {0, 0xffff, 0xffff, 0x0000},
63 {0, 0xffff, 0x0000, 0xffff},
64 {0, 0x0000, 0xffff, 0xffff}};
67 hildon_color_chooser_dialog_init (HildonColorChooserDialog *object);
70 hildon_color_chooser_dialog_class_init (HildonColorChooserDialogClass *klass);
73 hildon_color_chooser_dialog_size_request (GtkWidget *widget,
77 hildon_color_chooser_dialog_size_allocate (GtkWidget *widget,
78 GtkAllocation *alloc);
81 hildon_color_chooser_dialog_realize (GtkWidget *widget);
84 hildon_color_chooser_dialog_unrealize (GtkWidget *widget);
87 hildon_color_chooser_dialog_style_set (GtkWidget *widget,
88 GtkStyle *previous_style);
91 hildon_color_chooser_dialog_show (GtkWidget *widget);
94 hildon_color_chooser_dialog_show_all (GtkWidget *widget);
97 hildon_color_chooser_dialog_key_press_event (GtkWidget *widget,
101 hildon_color_chooser_dialog_key_release_event (GtkWidget *widget,
105 hildon_color_chooser_dialog_destroy (GtkObject *object);
108 hildon_color_chooser_dialog_area_expose (GtkWidget *widget,
109 GdkEventExpose *event,
113 hildon_color_chooser_dialog_area_button_press (GtkWidget *widget,
114 GdkEventButton *event,
118 hildon_color_chooser_dialog_color_changed (HildonColorChooser *chooser,
122 hildon_color_chooser_dialog_insensitive_press (GtkWidget *widget,
126 hildon_color_chooser_dialog_refresh_style_info (HildonColorChooserDialog *dialog);
129 hildon_color_chooser_dialog_set_color_num (HildonColorChooserDialog *dialog,
133 hildon_color_chooser_dialog_ascii_hex_to_color (gchar *s,
137 hildon_color_chooser_dialog_color_to_ascii_hex (gchar *s,
141 hildon_color_chooser_dialog_get_type (void)
143 static GType dialog_type = 0;
146 static const GTypeInfo dialog_info =
148 sizeof (HildonColorChooserDialogClass),
151 (GClassInitFunc) hildon_color_chooser_dialog_class_init,
154 sizeof (HildonColorChooserDialog),
156 (GInstanceInitFunc) hildon_color_chooser_dialog_init,
160 dialog_type = g_type_register_static (GTK_TYPE_DIALOG,
161 "HildonColorChooserDialog", &dialog_info, 0);
168 hildon_color_chooser_dialog_init (HildonColorChooserDialog *object)
170 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (object);
172 gtk_dialog_set_has_separator (GTK_DIALOG (object), FALSE);
173 gtk_window_set_title (GTK_WINDOW (object), _("ecdg_ti_colour_selector"));
177 priv->hbox = gtk_hbox_new (FALSE, 0);
178 priv->vbox = gtk_vbox_new (FALSE, 0);
179 priv->chooser = hildon_color_chooser_new ();
181 gtk_box_pack_start (GTK_BOX (priv->hbox), priv->chooser, TRUE, TRUE, 0);
182 gtk_box_pack_end (GTK_BOX (priv->hbox), priv->vbox, FALSE, FALSE, 0);
184 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (object)->vbox), priv->hbox, TRUE, TRUE, 0);
187 priv->align_custom = gtk_alignment_new (0.5, 1.0, 0.0, 0.0);
188 priv->align_defined = gtk_alignment_new (0.5, 1.0, 0.0, 0.0);
190 priv->area_custom = gtk_drawing_area_new ();
191 priv->area_defined = gtk_drawing_area_new ();
193 gtk_container_add (GTK_CONTAINER (priv->align_custom), priv->area_custom);
194 gtk_container_add (GTK_CONTAINER (priv->align_defined), priv->area_defined);
196 priv->separator = gtk_hseparator_new ();
198 gtk_box_pack_start (GTK_BOX (priv->vbox), priv->align_defined, FALSE, FALSE, 0);
199 gtk_box_pack_start (GTK_BOX (priv->vbox), priv->separator, FALSE, FALSE, 0);
200 gtk_box_pack_start (GTK_BOX (priv->vbox), priv->align_custom, FALSE, FALSE, 0);
202 gtk_dialog_add_button (GTK_DIALOG (object), _("ecdg_bd_colour_selector_ok"), GTK_RESPONSE_OK);
203 gtk_dialog_add_button (GTK_DIALOG (object), _("ecdg_bd_colour_selector_cancel"), GTK_RESPONSE_CANCEL);
204 gtk_dialog_set_default_response (GTK_DIALOG (object), GTK_RESPONSE_OK);
206 g_signal_connect (G_OBJECT (priv->chooser),
207 "insensitive-press", G_CALLBACK (hildon_color_chooser_dialog_insensitive_press), object);
209 g_signal_connect (G_OBJECT (priv->area_custom),
210 "expose-event", G_CALLBACK (hildon_color_chooser_dialog_area_expose), object);
212 g_signal_connect (G_OBJECT (priv->area_defined),
213 "expose-event", G_CALLBACK (hildon_color_chooser_dialog_area_expose), object);
215 g_signal_connect (G_OBJECT (priv->area_custom),
216 "button-press-event", G_CALLBACK (hildon_color_chooser_dialog_area_button_press), object);
218 g_signal_connect (G_OBJECT (priv->area_defined),
219 "button-press-event", G_CALLBACK (hildon_color_chooser_dialog_area_button_press), object);
221 g_signal_connect (G_OBJECT (priv->chooser),
222 "color-changed", G_CALLBACK (hildon_color_chooser_dialog_color_changed), object);
224 gtk_widget_add_events (priv->area_custom, GDK_BUTTON_PRESS_MASK);
225 gtk_widget_add_events (priv->area_defined, GDK_BUTTON_PRESS_MASK);
228 priv->gconf_client = gconf_client_get_default ();
230 memset (&priv->style_info, 0, sizeof (HildonColorChooserStyleInfo));
232 priv->colors_custom = NULL;
233 priv->colors_defined = NULL;
234 priv->gc_array = NULL;
240 hildon_color_chooser_dialog_class_init (HildonColorChooserDialogClass *klass)
242 GtkWidgetClass *widget_klass = GTK_WIDGET_CLASS (klass);
243 GtkObjectClass *object_klass = GTK_OBJECT_CLASS (klass);
247 widget_klass->size_request = hildon_color_chooser_dialog_size_request;
248 widget_klass->size_allocate = hildon_color_chooser_dialog_size_allocate;
249 widget_klass->realize = hildon_color_chooser_dialog_realize;
250 widget_klass->unrealize = hildon_color_chooser_dialog_unrealize;
251 widget_klass->style_set = hildon_color_chooser_dialog_style_set;
252 widget_klass->show = hildon_color_chooser_dialog_show;
253 widget_klass->show_all = hildon_color_chooser_dialog_show_all;
254 widget_klass->key_press_event = hildon_color_chooser_dialog_key_press_event;
255 widget_klass->key_release_event = hildon_color_chooser_dialog_key_release_event;
258 object_klass->destroy = hildon_color_chooser_dialog_destroy;
260 parent_class = g_type_class_peek_parent (klass);
262 gtk_widget_class_install_style_property (widget_klass,
263 g_param_spec_boxed ("container_sizes",
265 "Container specific sizes",
269 gtk_widget_class_install_style_property (widget_klass,
270 g_param_spec_boxed ("radio_sizes",
272 "Color radio specific sizes",
276 gtk_widget_class_install_style_property (widget_klass,
277 g_param_spec_boxed ("num_buttons",
279 "Number of color store buttons",
284 gtk_widget_class_install_style_property (widget_klass,
285 g_param_spec_boxed ("default_color", "Default color",
286 "Default color for nonpainted custom colors",
290 for (i = 0; i < 32; i++) {
292 g_snprintf (tmp, 32, "defined_color%d", i);
294 gtk_widget_class_install_style_property (widget_klass,
295 g_param_spec_boxed (tmp, "Defined color",
296 "Pre-defined colors for the dialog",
301 g_type_class_add_private (object_klass, sizeof (HildonColorChooserDialogPrivate));
305 hildon_color_chooser_dialog_size_request (GtkWidget *widget,
308 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (widget);
312 gtk_container_set_border_width (GTK_CONTAINER (priv->hbox), priv->style_info.cont_sizes.left);
314 gtk_box_set_spacing (GTK_BOX (priv->hbox), priv->style_info.cont_sizes.right);
315 gtk_box_set_spacing (GTK_BOX (priv->vbox), priv->style_info.cont_sizes.top);
316 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (widget)->vbox), priv->style_info.cont_sizes.bottom);
318 gtk_widget_set_size_request (priv->area_custom,
319 (priv->style_info.radio_sizes.left +
320 2 * priv->style_info.radio_sizes.bottom) *
321 (priv->style_info.num_buttons.top) +
322 (priv->style_info.num_buttons.top-1) *
323 priv->style_info.radio_sizes.top,
324 (priv->style_info.radio_sizes.right +
325 2 * priv->style_info.radio_sizes.bottom) *
326 (priv->style_info.num_buttons.bottom) +
327 (priv->style_info.num_buttons.bottom-1) *
328 priv->style_info.radio_sizes.top);
330 gtk_widget_set_size_request (priv->area_defined,
331 (priv->style_info.radio_sizes.left +
332 2 * priv->style_info.radio_sizes.bottom) *
333 (priv->style_info.num_buttons.left) +
334 (priv->style_info.num_buttons.left-1) *
335 priv->style_info.radio_sizes.top,
336 (priv->style_info.radio_sizes.right +
337 2 * priv->style_info.radio_sizes.bottom) *
338 (priv->style_info.num_buttons.right) +
339 (priv->style_info.num_buttons.right-1) *
340 priv->style_info.radio_sizes.top);
342 GTK_WIDGET_CLASS (parent_class)->size_request (widget, req);
346 hildon_color_chooser_dialog_size_allocate (GtkWidget *widget,
347 GtkAllocation *alloc)
349 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (widget);
356 GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, alloc);
358 if (GTK_WIDGET_REALIZED (widget)) {
359 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right);
360 tmp2 = (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
362 for (i = 0; i < tmp; i++) {
363 rect.x = ((i % priv->style_info.num_buttons.left) *
364 (priv->style_info.radio_sizes.left +
365 priv->style_info.radio_sizes.top +
366 2 * priv->style_info.radio_sizes.bottom)) +
367 priv->style_info.radio_sizes.bottom;
369 rect.y = ((i / priv->style_info.num_buttons.left) *
370 (priv->style_info.radio_sizes.right +
371 priv->style_info.radio_sizes.top +
372 2 * priv->style_info.radio_sizes.bottom)) +
373 priv->style_info.radio_sizes.bottom;
375 rect.width = priv->style_info.radio_sizes.left;
376 rect.height = priv->style_info.radio_sizes.right;
378 gdk_gc_set_clip_rectangle (priv->gc_array[i], &rect);
381 for (i = 0; i < tmp2; i++) {
382 rect.x = ((i % priv->style_info.num_buttons.top) *
383 (priv->style_info.radio_sizes.left +
384 priv->style_info.radio_sizes.top +
385 2 * priv->style_info.radio_sizes.bottom)) +
386 priv->style_info.radio_sizes.bottom;
388 rect.y = ((i / priv->style_info.num_buttons.top) *
389 (priv->style_info.radio_sizes.right +
390 priv->style_info.radio_sizes.top +
391 2 * priv->style_info.radio_sizes.bottom)) + priv->style_info.radio_sizes.bottom;
393 rect.width = priv->style_info.radio_sizes.left;
394 rect.height = priv->style_info.radio_sizes.right;
396 gdk_gc_set_clip_rectangle (priv->gc_array[i + tmp], &rect);
402 hildon_color_chooser_dialog_realize (GtkWidget *widget)
404 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (widget);
411 GTK_WIDGET_CLASS(parent_class)->realize (widget);
413 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right) +
414 (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
416 for (i = 0; i < tmp; i++) {
417 priv->gc_array[i] = gdk_gc_new (widget->window);
420 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right);
421 tmp2 = (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
423 for (i = 0; i < tmp; i++) {
424 gdk_gc_set_rgb_fg_color (priv->gc_array[i], &priv->colors_defined[i]);
426 rect.x = ((i % priv->style_info.num_buttons.left) *
427 (priv->style_info.radio_sizes.left +
428 priv->style_info.radio_sizes.top +
429 2 * priv->style_info.radio_sizes.bottom)) +
430 priv->style_info.radio_sizes.bottom;
432 rect.y = ((i / priv->style_info.num_buttons.left) *
433 (priv->style_info.radio_sizes.right +
434 priv->style_info.radio_sizes.top +
435 2 * priv->style_info.radio_sizes.bottom)) +
436 priv->style_info.radio_sizes.bottom;
438 rect.width = priv->style_info.radio_sizes.left;
439 rect.height = priv->style_info.radio_sizes.right;
441 gdk_gc_set_clip_rectangle (priv->gc_array[i], &rect);
444 for (i = 0; i < tmp2; i++) {
445 gdk_gc_set_rgb_fg_color (priv->gc_array[i + tmp], &priv->colors_custom[i]);
447 rect.x = ((i % priv->style_info.num_buttons.top) *
448 (priv->style_info.radio_sizes.left +
449 priv->style_info.radio_sizes.top +
450 2 * priv->style_info.radio_sizes.bottom)) +
451 priv->style_info.radio_sizes.bottom;
453 rect.y = ((i / priv->style_info.num_buttons.top) *
454 (priv->style_info.radio_sizes.right +
455 priv->style_info.radio_sizes.top +
456 2 * priv->style_info.radio_sizes.bottom)) +
457 priv->style_info.radio_sizes.bottom;
459 rect.width = priv->style_info.radio_sizes.left;
460 rect.height = priv->style_info.radio_sizes.right;
462 gdk_gc_set_clip_rectangle (priv->gc_array[i + tmp], &rect);
467 hildon_color_chooser_dialog_unrealize (GtkWidget *widget)
469 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (widget);
473 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right) +
474 (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
476 for (i = 0; i < tmp; i++) {
477 g_object_unref (priv->gc_array[i]);
480 GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
484 hildon_color_chooser_dialog_style_set (GtkWidget *widget,
485 GtkStyle *previous_style)
487 HildonColorChooserDialog *dialog = HILDON_COLOR_CHOOSER_DIALOG (widget);
488 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (widget);
491 gchar tmp[32], key[128], *val;
492 int i, tmpn, setcolor = 0;
496 if (! priv->has_style)
501 gtk_widget_style_get (widget, "default_color", &tmpcolor, NULL);
504 priv->style_info.default_color = *tmpcolor;
506 priv->style_info.default_color.red = 0x0000;
507 priv->style_info.default_color.green = 0x0000;
508 priv->style_info.default_color.blue = 0x0000;
509 priv->style_info.default_color.pixel = 0x00000000;
512 hildon_color_chooser_dialog_refresh_style_info (dialog);
514 if (memcmp (&priv->style_info.num_buttons, &priv->style_info.last_num_buttons, sizeof (GtkBorder))) {
515 if (priv->colors_custom) {
516 g_free (priv->colors_custom);
517 } if (priv->colors_defined) {
518 g_free (priv->colors_defined);
519 } if (priv->gc_array) {
520 if (GTK_WIDGET_REALIZED (widget)) {
521 tmpn = (priv->style_info.last_num_buttons.left * priv->style_info.last_num_buttons.right) +
522 (priv->style_info.last_num_buttons.top * priv->style_info.last_num_buttons.bottom);
524 for (i = 0; i < tmpn; i++) {
525 g_object_unref (priv->gc_array[i]);
529 g_free (priv->gc_array);
532 priv->colors_custom = (GdkColor *)
533 g_malloc0 (sizeof (GdkColor) * (priv->style_info.num_buttons.top *
534 priv->style_info.num_buttons.bottom));
536 priv->colors_defined = (GdkColor *)
537 g_malloc0 (sizeof(GdkColor) * (priv->style_info.num_buttons.left *
538 priv->style_info.num_buttons.right));
540 tmpn = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right) +
541 (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
543 priv->gc_array = (GdkGC **) g_malloc0 (sizeof (GdkGC *) * tmpn);
545 if (priv->gconf_client) {
547 for (i = 0; i < (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom); i++) {
548 memset (key, 0, 128);
549 /* FIXME Extremally bad hardcoding */
550 g_snprintf (key, 128, "/system/osso/af/color_chooser/custom_color%d", i);
551 val = gconf_client_get_string (priv->gconf_client, key, NULL);
554 hildon_color_chooser_dialog_ascii_hex_to_color (val, &priv->colors_custom[i]);
557 priv->colors_custom[i] = priv->style_info.default_color;
561 for (i = 0; i < (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom); i++) {
562 priv->colors_custom[i] = priv->style_info.default_color;
567 tmpn = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right);
569 hildon_color_chooser_set_color (HILDON_COLOR_CHOOSER (priv->chooser),
570 (priv->selected < tmpn) ?
571 &priv->colors_defined[priv->selected] :
572 &priv->colors_custom[priv->selected - tmpn]);
574 for (i = 0; i < (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right); i++) {
576 g_snprintf (tmp, 32, "defined_color%d", i);
578 gtk_widget_style_get (widget, tmp, &tmpcolor, NULL);
581 priv->colors_defined[i] = *tmpcolor;
584 priv->colors_defined[i] = hardcoded_colors[i];
585 } else { /* fallback to prevent segfault */
586 priv->colors_defined[i].red = 0x0000;
587 priv->colors_defined[i].green = 0x0000;
588 priv->colors_defined[i].blue = 0x0000;
589 priv->colors_defined[i].pixel = 0x00000000;
594 if (GTK_WIDGET_REALIZED (widget)) {
595 for (i = 0; i < (priv->style_info.num_buttons.left *
596 priv->style_info.num_buttons.right); i++) {
597 gdk_gc_set_rgb_fg_color (priv->gc_array[i], &priv->colors_defined[i]);
602 hildon_color_chooser_dialog_set_color (HILDON_COLOR_CHOOSER_DIALOG (dialog),
603 &priv->pending_color);
605 gtk_widget_queue_resize (widget);
607 GTK_WIDGET_CLASS (parent_class)->style_set (widget, previous_style);
611 hildon_color_chooser_dialog_show (GtkWidget *widget)
613 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (widget);
617 gtk_widget_show (priv->hbox);
618 gtk_widget_show (priv->vbox);
620 gtk_widget_show (priv->chooser);
622 gtk_widget_show (priv->align_custom);
623 gtk_widget_show (priv->align_defined);
625 gtk_widget_show (priv->separator);
627 gtk_widget_show (priv->area_custom);
628 gtk_widget_show (priv->area_defined);
630 GTK_WIDGET_CLASS (parent_class)->show (widget);
633 /* FIXME WTF this function is even needed here? */
635 hildon_color_chooser_dialog_show_all (GtkWidget *widget)
637 hildon_color_chooser_dialog_show (widget);
641 hildon_color_chooser_dialog_key_press_event (GtkWidget *widget,
644 HildonColorChooserDialog *dialog = HILDON_COLOR_CHOOSER_DIALOG (widget);
645 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (widget);
650 if (event->keyval == HILDON_HARDKEY_UP || event->keyval == HILDON_HARDKEY_DOWN ||
651 event->keyval == HILDON_HARDKEY_LEFT || event->keyval == HILDON_HARDKEY_RIGHT) {
652 tmp = (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
653 tot = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right) + tmp;
655 switch (event->keyval) {
657 case HILDON_HARDKEY_UP:
658 if(priv->selected >= priv->style_info.num_buttons.top) {
659 if(priv->selected - priv->style_info.num_buttons.left >= tmp) {
660 sel = priv->selected - priv->style_info.num_buttons.left;
662 sel = priv->selected - priv->style_info.num_buttons.top;
665 hildon_color_chooser_dialog_set_color_num (dialog, sel);
669 case HILDON_HARDKEY_DOWN:
670 if(priv->selected < tot - priv->style_info.num_buttons.left) {
671 if(priv->selected < tmp) {
672 sel = priv->selected + priv->style_info.num_buttons.top;
674 sel = priv->selected + priv->style_info.num_buttons.left;
677 hildon_color_chooser_dialog_set_color_num (dialog, sel);
681 case HILDON_HARDKEY_LEFT:
682 if ((priv->selected < tmp ?
683 (priv->selected % priv->style_info.num_buttons.top) :
684 ((priv->selected - tmp) % priv->style_info.num_buttons.left)) > 0) {
685 sel = priv->selected - 1;
687 hildon_color_chooser_dialog_set_color_num (dialog, sel);
691 case HILDON_HARDKEY_RIGHT:
692 if ((priv->selected < tmp) ?
693 (priv->selected % priv->style_info.num_buttons.top < priv->style_info.num_buttons.top - 1) :
694 ((priv->selected - tmp) % priv->style_info.num_buttons.left < priv->style_info.num_buttons.left - 1)) {
695 sel = priv->selected + 1;
697 hildon_color_chooser_dialog_set_color_num (dialog, sel);
708 return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
712 hildon_color_chooser_dialog_key_release_event (GtkWidget *widget,
715 if (event->keyval == HILDON_HARDKEY_UP ||
716 event->keyval == HILDON_HARDKEY_DOWN ||
717 event->keyval == HILDON_HARDKEY_LEFT ||
718 event->keyval == HILDON_HARDKEY_RIGHT)
723 return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
727 hildon_color_chooser_dialog_destroy (GtkObject *object)
729 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (object);
731 gchar key[128], color[13];
736 if (priv->gconf_client) {
737 memset (color, 0, 13);
739 tmp = (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
741 for (i = 0; i < tmp; i++) {
742 memset (key, 0, 128);
743 /* FIXME Extremally bad hardcoding */
744 g_snprintf (key, 128, "/system/osso/af/color_chooser/custom_color%d", i);
745 hildon_color_chooser_dialog_color_to_ascii_hex (color, &priv->colors_custom[i]);
746 gconf_client_set_string (priv->gconf_client, key, color, NULL);
749 g_object_unref (priv->gconf_client);
750 priv->gconf_client = NULL;
753 if (priv->gc_array) {
754 g_free (priv->gc_array);
755 priv->gc_array = NULL;
756 } if (priv->colors_defined) {
757 g_free (priv->colors_defined);
758 priv->colors_defined = NULL;
759 } if (priv->colors_custom) {
760 g_free (priv->colors_custom);
761 priv->colors_custom = NULL;
764 GTK_OBJECT_CLASS (parent_class)->destroy (object);
768 hildon_color_chooser_dialog_set_color (HildonColorChooserDialog *dialog,
771 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (dialog);
773 int i, found = -1, tmp, tmp2;
777 if (! priv->has_style) {
778 priv->pending_color = *color;
782 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right);
783 tmp2 = (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
785 for (i = 0; i < tmp; i++) {
786 if (priv->colors_defined[i].red == color->red &&
787 priv->colors_defined[i].green == color->green &&
788 priv->colors_defined[i].blue == color->blue) {
795 for (i = 0; i < tmp2; i++) {
796 if (priv->colors_custom[i].red == color->red &&
797 priv->colors_custom[i].green == color->green &&
798 priv->colors_custom[i].blue == color->blue) {
806 priv->colors_custom[tmp2-1] = *color;
807 if (GTK_WIDGET_REALIZED (GTK_WIDGET (dialog))) {
808 gdk_gc_set_rgb_fg_color (priv->gc_array[tmp2-1], color);
810 hildon_color_chooser_dialog_set_color_num (dialog, tmp2 - 1);
812 hildon_color_chooser_dialog_set_color_num (dialog, found);
817 hildon_color_chooser_dialog_area_expose (GtkWidget *widget,
818 GdkEventExpose *event,
821 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (data);
823 int i, num_selected, tot_w, tot_h, spacing, brd, x, y;
829 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right);
831 if (widget == priv->area_custom) {
832 num_selected = priv->selected - tmp;
833 start_gc = priv->gc_array + tmp;
834 tmp = (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
835 w = priv->style_info.num_buttons.top;
836 h = priv->style_info.num_buttons.bottom;
837 } else { /* widget == dialog->area_defined */
838 num_selected = priv->selected;
839 start_gc = priv->gc_array;
840 w = priv->style_info.num_buttons.left;
841 h = priv->style_info.num_buttons.right;
844 spacing = priv->style_info.radio_sizes.top;
845 brd = priv->style_info.radio_sizes.bottom;
846 tot_w = priv->style_info.radio_sizes.left + 2 * brd;
847 tot_h = priv->style_info.radio_sizes.right + 2 * brd;
849 for (i = 0; i < tmp; i++) {
850 x = ((i % w) * (tot_w + spacing));
851 y = ((i / w) * (tot_h + spacing));
853 gdk_draw_rectangle (widget->window,
854 widget->style->black_gc,
856 (i == num_selected) ? x : x + 2,
857 (i == num_selected) ? y : y + 2,
858 (i == num_selected) ? tot_w : tot_w - 4,
859 (i == num_selected) ? tot_h : tot_h - 4);
861 gdk_draw_rectangle(widget->window,
862 widget->style->white_gc,
869 gdk_draw_rectangle(widget->window,
882 hildon_color_chooser_dialog_area_button_press (GtkWidget *widget,
883 GdkEventButton *event,
886 HildonColorChooserDialog *dialog = HILDON_COLOR_CHOOSER_DIALOG (data);
887 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (data);
889 int i, hskip, vskip, brd, selection = -1;
890 int x, y, tmp, tmp2, w;
897 brd = priv->style_info.radio_sizes.bottom;
898 hskip = priv->style_info.radio_sizes.left +
899 priv->style_info.radio_sizes.top + 2 * brd;
900 vskip = priv->style_info.radio_sizes.right +
901 priv->style_info.radio_sizes.top + 2 * brd;
903 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right);
904 tmp2 = (priv->style_info.num_buttons.top * priv->style_info.num_buttons.bottom);
906 if (widget == priv->area_defined) {
907 w = priv->style_info.num_buttons.left;
909 for (i = 0; i < tmp; i++) {
910 if (x >= hskip * (i % w) + brd && x < hskip * (i % w) + brd + priv->style_info.radio_sizes.left &&
911 y >= vskip * (i / w) + brd && y < hskip * (i / w) + brd + priv->style_info.radio_sizes.right) {
917 w = priv->style_info.num_buttons.top;
918 for (i = 0; i < tmp2; i++) {
919 if (x >= hskip * (i % w) + brd && x < hskip * (i % w) + brd + priv->style_info.radio_sizes.left &&
920 y >= vskip * (i / w) + brd && y < hskip * (i / w) + brd + priv->style_info.radio_sizes.right) {
927 if (selection != -1) {
928 hildon_color_chooser_dialog_set_color_num (dialog, selection);
935 hildon_color_chooser_dialog_color_changed (HildonColorChooser *chooser,
938 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (data);
939 char key[128], color_str[13];
941 GdkColor *color = g_new (GdkColor, 1);
945 hildon_color_chooser_get_color (chooser, color);
947 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right);
949 if (priv->selected >= tmp) {
950 priv->colors_custom[priv->selected - tmp] = *color;
952 gdk_gc_set_rgb_fg_color (priv->gc_array[priv->selected], &priv->colors_custom[priv->selected - tmp]);
953 gtk_widget_queue_draw (priv->area_custom);
955 if (priv->gconf_client) {
956 memset (key, 0, 128);
957 memset (color_str, 0, 13);
958 /* FIXME Ugly hardcoded stuff! */
959 g_snprintf (key, 128, "/system/osso/af/color_chooser/custom_color%d", priv->selected - tmp);
960 hildon_color_chooser_dialog_color_to_ascii_hex (color_str, &priv->colors_custom[priv->selected - tmp]);
961 gconf_client_set_string (priv->gconf_client, key, color_str, NULL);
967 hildon_color_chooser_dialog_insensitive_press (GtkWidget *widget,
970 hildon_banner_show_information (widget, NULL, _("ecdg_ib_colour_selector_predefined"));
973 /* function has size defaults */
975 hildon_color_chooser_dialog_refresh_style_info (HildonColorChooserDialog *dialog)
977 GtkBorder *tmp1, *tmp2, *tmp3;
978 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (dialog);
982 gtk_widget_style_get (GTK_WIDGET (dialog), "container_sizes", &tmp1,
983 "radio_sizes", &tmp2, "num_buttons", &tmp3, NULL);
985 priv->style_info.last_num_buttons = priv->style_info.num_buttons;
988 priv->style_info.cont_sizes = *tmp1;
991 priv->style_info.cont_sizes.left = 0;
992 priv->style_info.cont_sizes.right = 8;
993 priv->style_info.cont_sizes.top = 4;
994 priv->style_info.cont_sizes.bottom = 0;
998 priv->style_info.radio_sizes = *tmp2;
1001 priv->style_info.radio_sizes.left = 16;
1002 priv->style_info.radio_sizes.right = 16;
1003 priv->style_info.radio_sizes.top = 4;
1004 priv->style_info.radio_sizes.bottom = 2;
1008 priv->style_info.num_buttons = *tmp3;
1011 priv->style_info.num_buttons.left = 8;
1012 priv->style_info.num_buttons.right = 2;
1013 priv->style_info.num_buttons.top = 8;
1014 priv->style_info.num_buttons.bottom = 2;
1019 hildon_color_chooser_dialog_set_color_num (HildonColorChooserDialog *dialog,
1022 HildonColorChooserDialogPrivate *priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (dialog);
1028 tmp = (priv->style_info.num_buttons.left * priv->style_info.num_buttons.right);
1031 gtk_widget_set_sensitive (priv->chooser, FALSE);
1033 gtk_widget_set_sensitive (priv->chooser, TRUE);
1036 priv->selected = num;
1038 gtk_widget_queue_draw (priv->area_custom);
1039 gtk_widget_queue_draw (priv->area_defined);
1041 priv->color = (num < tmp) ? priv->colors_defined[num] : priv->colors_custom[num - tmp];
1043 hildon_color_chooser_set_color (HILDON_COLOR_CHOOSER (priv->chooser),
1044 (num < tmp) ? &priv->colors_defined[num] : &priv->colors_custom[num - tmp]);
1048 hildon_color_chooser_dialog_ascii_hex_to_color (gchar *s,
1053 for (i = 0; i < 12; i++) {
1054 if (s[i] >= '0' && s[i] <= '9') {
1055 vals[i] = s[i] - 0x30;
1056 } else if (s[i] >= 'a' && s[i] <= 'f') {
1057 vals[i] = s[i] - 0x57;
1063 color->red = (vals[0] << 12) | (vals[1] << 8) | (vals[2 ] << 4) | (vals[3 ]);
1064 color->green = (vals[4] << 12) | (vals[5] << 8) | (vals[6 ] << 4) | (vals[7 ]);
1065 color->blue = (vals[8] << 12) | (vals[9] << 8) | (vals[10] << 4) | (vals[11]);
1069 hildon_color_chooser_dialog_color_to_ascii_hex (gchar *s,
1072 g_snprintf (s, 13, "%x%x%x%x%x%x%x%x%x%x%x%x",
1073 (color->red >> 12) & 0xf, (color->red >> 8) & 0xf,
1074 (color->red >> 4) & 0xf, (color->red ) & 0xf,
1075 (color->green >> 12) & 0xf, (color->green >> 8) & 0xf,
1076 (color->green >> 4) & 0xf, (color->green ) & 0xf,
1077 (color->blue >> 12) & 0xf, (color->blue >> 8) & 0xf,
1078 (color->blue >> 4) & 0xf, (color->blue ) & 0xf);
1082 * hildon_color_chooser_dialog_new:
1084 * Creates a new color chooser dialog.
1086 * Returns: a new color chooser dialog.
1089 hildon_color_chooser_dialog_new (void)
1091 return g_object_new (HILDON_TYPE_COLOR_CHOOSER_DIALOG, NULL);
1095 * hildon_color_chooser_dialog_get_color:
1096 * @dialog: a #HildonColorChooserDialog
1097 * @color: a color to fill with new value
1101 hildon_color_chooser_dialog_get_color (HildonColorChooserDialog *dialog,
1104 /* FIXME Should return pending color? */
1105 HildonColorChooserDialogPrivate *priv;
1107 g_return_if_fail (HILDON_IS_COLOR_CHOOSER_DIALOG (dialog));
1108 priv = HILDON_COLOR_CHOOSER_DIALOG_GET_PRIVATE (dialog);
1111 hildon_color_chooser_get_color (HILDON_COLOR_CHOOSER (priv->chooser), color);