2 * This file is part of hildon-libs
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
33 #include <gdk/gdkkeysyms.h>
37 #include <gconf/gconf-client.h>
40 #include <hildon-widgets/hildon-color-chooser-dialog.h>
41 #include <hildon-widgets/hildon-color-chooser.h>
43 #include <hildon-widgets/hildon-plugin-widget.h>
45 #include <hildon-widgets/hildon-defines.h>
47 #include <hildon-widgets/hildon-banner.h>
50 #define _(String) dgettext("hildon-libs", String)
53 const char *parent_name = "HildonColorChooserDialog";
54 const char *plugin_name = "HSV color chooser dialog";
56 GType export_type(void);
59 static HildonPluginWidgetInfo *chooser_plugin = NULL;
61 static HildonColorChooserDialogClass *parent_klass = NULL;
64 /* darkened EGA palette to be used as predefined colors if style doesn't
65 define anything else (darker colors are darkened 0x8000 -> 0x6666) */
66 static GdkColor hardcoded_colors[16] = {{0, 0x0000, 0x0000, 0x0000},
67 {0, 0x6666, 0x6666, 0x6666},
68 {0, 0x6666, 0x0000, 0x0000},
69 {0, 0x0000, 0x6666, 0x0000},
70 {0, 0x0000, 0x0000, 0x6666},
71 {0, 0x6666, 0x6666, 0x0000},
72 {0, 0x6666, 0x0000, 0x6666},
73 {0, 0x0000, 0x6666, 0x6666},
74 {0, 0xffff, 0xffff, 0xffff},
75 {0, 0xc000, 0xc000, 0xc000},
76 {0, 0xffff, 0x0000, 0x0000},
77 {0, 0x0000, 0xffff, 0x0000},
78 {0, 0x0000, 0x0000, 0xffff},
79 {0, 0xffff, 0xffff, 0x0000},
80 {0, 0xffff, 0x0000, 0xffff},
81 {0, 0x0000, 0xffff, 0xffff}};
85 GtkBorder radio_sizes;
87 GtkBorder num_buttons;
88 GtkBorder last_num_buttons;
90 GdkColor default_color;
91 } HildonColorChooserStyleInfo;
94 typedef struct _HildonColorChooserDialogHSV HildonColorChooserDialogHSV;
95 typedef struct _HildonColorChooserDialogHSVClass HildonColorChooserDialogHSVClass;
98 struct _HildonColorChooserDialogHSV {
99 HildonColorChooserDialog parent;
104 GtkWidget *align_custom, *align_defined;
105 GtkWidget *area_custom, *area_defined;
106 GtkWidget *separator;
110 GdkColor *colors_custom, *colors_defined;
115 HildonColorChooserStyleInfo style_info;
120 GdkColor pending_color;
128 struct _HildonColorChooserDialogHSVClass {
129 HildonColorChooserDialogClass parent_klass;
133 #define HILDON_COLOR_CHOOSER_DIALOG_HSV(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), export_type(), HildonColorChooserDialogHSV))
134 #define HILDON_COLOR_CHOOSER_DIALOG_HSV_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), export_type(), HildonColorChooserDialogHSVClass))
137 GtkType export_type(void);
140 static void hildon_color_chooser_dialog_hsv_init(HildonColorChooserDialogHSV *object);
141 static void hildon_color_chooser_dialog_hsv_class_init(HildonColorChooserDialogHSVClass *klass);
143 static void hildon_color_chooser_dialog_hsv_size_request(GtkWidget *widget, GtkRequisition *req);
144 static void hildon_color_chooser_dialog_hsv_size_allocate(GtkWidget *widget, GtkAllocation *alloc);
146 static void hildon_color_chooser_dialog_hsv_realize(GtkWidget *widget);
147 static void hildon_color_chooser_dialog_hsv_unrealize(GtkWidget *widget);
149 static void hildon_color_chooser_dialog_hsv_style_set(GtkWidget *widget, GtkStyle *previous_style);
151 static void hildon_color_chooser_dialog_hsv_show(GtkWidget *widget);
152 static void hildon_color_chooser_dialog_hsv_show_all(GtkWidget *widget);
154 static gboolean hildon_color_chooser_dialog_hsv_key_press_event(GtkWidget *widget, GdkEventKey *event);
155 static gboolean hildon_color_chooser_dialog_hsv_key_release_event(GtkWidget *widget, GdkEventKey *event);
158 static void hildon_color_chooser_dialog_hsv_destroy(GtkObject *object);
161 static void hildon_color_chooser_dialog_hsv_set_color(HildonColorChooserDialog *dialog, GdkColor *color);
164 static gboolean hildon_color_chooser_dialog_hsv_area_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data);
166 static gboolean hildon_color_chooser_dialog_hsv_area_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data);
169 static void hildon_color_chooser_dialog_hsv_chooser_color_changed(HildonColorChooser *chooser, GdkColor *color, gpointer data);
171 static void hildon_color_chooser_dialog_hsv_chooser_insensitive_press(GtkWidget *widget, gpointer data);
174 static void hildon_color_chooser_dialog_hsv_refresh_style_info(HildonColorChooserDialogHSV *dialog);
176 static void hildon_color_chooser_dialog_hsv_set_color_num(HildonColorChooserDialogHSV *dialog, gint num);
178 static void hildon_color_chooser_dialog_hsv_ascii_hex_to_color(gchar *s, GdkColor *color);
179 static void hildon_color_chooser_dialog_hsv_color_to_ascii_hex(gchar *s, GdkColor *color);
184 static GType dialog_type = 0;
187 static const GTypeInfo dialog_info =
189 sizeof (HildonColorChooserDialogHSVClass),
192 (GClassInitFunc) hildon_color_chooser_dialog_hsv_class_init,
195 sizeof (HildonColorChooserDialogHSV),
197 (GInstanceInitFunc) hildon_color_chooser_dialog_hsv_init,
201 dialog_type = g_type_register_static (HILDON_TYPE_COLOR_CHOOSER_DIALOG, "HildonColorChooserDialogHSV", &dialog_info, 0);
208 static void hildon_color_chooser_dialog_hsv_init(HildonColorChooserDialogHSV *object)
210 if(!chooser_plugin) {
211 chooser_plugin = hildon_plugin_info_initialize(HILDON_TYPE_COLOR_CHOOSER, "hsv");
215 gtk_dialog_set_has_separator(GTK_DIALOG(object), FALSE);
217 gtk_window_set_title(GTK_WINDOW(object), _("ecdg_ti_colour_selector"));
220 object->chooser = hildon_plugin_info_construct_widget(chooser_plugin);
222 object->hbox = gtk_hbox_new(FALSE, 0);
223 object->vbox = gtk_vbox_new(FALSE, 0);
225 gtk_box_pack_start(GTK_BOX(object->hbox), object->chooser, TRUE, TRUE, 0);
226 gtk_box_pack_end(GTK_BOX(object->hbox), object->vbox, FALSE, FALSE, 0);
229 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(object)->vbox), object->hbox, TRUE, TRUE, 0);
232 object->align_custom = gtk_alignment_new(0.5, 1.0, 0.0, 0.0);
233 object->align_defined = gtk_alignment_new(0.5, 1.0, 0.0, 0.0);
235 object->area_custom = gtk_drawing_area_new();
236 object->area_defined = gtk_drawing_area_new();
239 gtk_container_add(GTK_CONTAINER(object->align_custom), object->area_custom);
240 gtk_container_add(GTK_CONTAINER(object->align_defined), object->area_defined);
243 object->separator = gtk_hseparator_new();
246 gtk_box_pack_start(GTK_BOX(object->vbox), object->align_defined, FALSE, FALSE, 0);
247 gtk_box_pack_start(GTK_BOX(object->vbox), object->separator, FALSE, FALSE, 0);
248 gtk_box_pack_start(GTK_BOX(object->vbox), object->align_custom, FALSE, FALSE, 0);
251 gtk_dialog_add_button(GTK_DIALOG(object), _("ecdg_bd_colour_selector_ok"), GTK_RESPONSE_OK);
252 gtk_dialog_add_button(GTK_DIALOG(object), _("ecdg_bd_colour_selector_cancel"), GTK_RESPONSE_CANCEL);
253 gtk_dialog_set_default_response (GTK_DIALOG (object), GTK_RESPONSE_OK);
256 g_signal_connect(G_OBJECT(object->chooser), "insensitive-press", G_CALLBACK(hildon_color_chooser_dialog_hsv_chooser_insensitive_press), object);
259 g_signal_connect(G_OBJECT(object->area_custom), "expose-event", G_CALLBACK(hildon_color_chooser_dialog_hsv_area_expose), object);
260 g_signal_connect(G_OBJECT(object->area_defined), "expose-event", G_CALLBACK(hildon_color_chooser_dialog_hsv_area_expose), object);
262 g_signal_connect(G_OBJECT(object->area_custom), "button-press-event", G_CALLBACK(hildon_color_chooser_dialog_hsv_area_button_press), object);
263 g_signal_connect(G_OBJECT(object->area_defined), "button-press-event", G_CALLBACK(hildon_color_chooser_dialog_hsv_area_button_press), object);
265 gtk_widget_add_events(object->area_custom, GDK_BUTTON_PRESS_MASK);
266 gtk_widget_add_events(object->area_defined, GDK_BUTTON_PRESS_MASK);
269 object->selected = 0;
272 g_signal_connect(G_OBJECT(object->chooser), "color-changed", G_CALLBACK(hildon_color_chooser_dialog_hsv_chooser_color_changed), object);
275 object->gconf_data.client = gconf_client_get_default();
278 memset(&object->style_info, 0, sizeof(HildonColorChooserStyleInfo));
281 object->colors_custom = NULL;
282 object->colors_defined = NULL;
284 object->gc_array = NULL;
287 object->has_style = 0;
290 static void hildon_color_chooser_dialog_hsv_class_init(HildonColorChooserDialogHSVClass *klass)
292 GtkWidgetClass *widget_klass = GTK_WIDGET_CLASS(klass);
293 GtkObjectClass *object_klass = GTK_OBJECT_CLASS(klass);
294 HildonColorChooserDialogClass *dialog_klass = HILDON_COLOR_CHOOSER_DIALOG_CLASS(klass);
299 widget_klass->size_request = hildon_color_chooser_dialog_hsv_size_request;
300 widget_klass->size_allocate = hildon_color_chooser_dialog_hsv_size_allocate;
302 widget_klass->realize = hildon_color_chooser_dialog_hsv_realize;
303 widget_klass->unrealize = hildon_color_chooser_dialog_hsv_unrealize;
305 widget_klass->style_set = hildon_color_chooser_dialog_hsv_style_set;
307 widget_klass->show = hildon_color_chooser_dialog_hsv_show;
308 widget_klass->show_all = hildon_color_chooser_dialog_hsv_show_all;
310 widget_klass->key_press_event = hildon_color_chooser_dialog_hsv_key_press_event;
311 widget_klass->key_release_event = hildon_color_chooser_dialog_hsv_key_release_event;
314 object_klass->destroy = hildon_color_chooser_dialog_hsv_destroy;
317 dialog_klass->set_color = hildon_color_chooser_dialog_hsv_set_color;
320 parent_klass = g_type_class_peek_parent(klass);
323 gtk_widget_class_install_style_property(widget_klass,
324 g_param_spec_boxed("container_sizes",
326 "Container specific sizes",
330 gtk_widget_class_install_style_property(widget_klass,
331 g_param_spec_boxed("radio_sizes",
333 "Color radio specific sizes",
337 gtk_widget_class_install_style_property(widget_klass,
338 g_param_spec_boxed("num_buttons",
340 "Number of color store buttons",
345 gtk_widget_class_install_style_property(widget_klass,
346 g_param_spec_boxed("default_color", "Default color",
347 "Default color for nonpainted custom colors",
352 for(i = 0; i < 32; i++) {
354 g_snprintf(tmp, 32, "defined_color%d", i);
356 gtk_widget_class_install_style_property(widget_klass,
357 g_param_spec_boxed(tmp, "Defined color",
358 "Pre-defined colors for the dialog",
365 static void hildon_color_chooser_dialog_hsv_size_request(GtkWidget *widget, GtkRequisition *req)
367 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(widget);
370 gtk_container_set_border_width(GTK_CONTAINER(dialog->hbox), dialog->style_info.cont_sizes.left);
372 gtk_box_set_spacing(GTK_BOX(dialog->hbox), dialog->style_info.cont_sizes.right);
373 gtk_box_set_spacing(GTK_BOX(dialog->vbox), dialog->style_info.cont_sizes.top);
374 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(widget)->vbox), dialog->style_info.cont_sizes.bottom);
377 gtk_widget_set_size_request(dialog->area_custom,
378 (dialog->style_info.radio_sizes.left + 2*dialog->style_info.radio_sizes.bottom)*(dialog->style_info.num_buttons.top) +
379 (dialog->style_info.num_buttons.top-1)*dialog->style_info.radio_sizes.top,
380 (dialog->style_info.radio_sizes.right + 2*dialog->style_info.radio_sizes.bottom)*(dialog->style_info.num_buttons.bottom) +
381 (dialog->style_info.num_buttons.bottom-1)*dialog->style_info.radio_sizes.top);
382 gtk_widget_set_size_request(dialog->area_defined,
383 (dialog->style_info.radio_sizes.left + 2*dialog->style_info.radio_sizes.bottom)*(dialog->style_info.num_buttons.left) +
384 (dialog->style_info.num_buttons.left-1)*dialog->style_info.radio_sizes.top,
385 (dialog->style_info.radio_sizes.right + 2*dialog->style_info.radio_sizes.bottom)*(dialog->style_info.num_buttons.right) +
386 (dialog->style_info.num_buttons.right-1)*dialog->style_info.radio_sizes.top);
389 GTK_WIDGET_CLASS(parent_klass)->size_request(widget, req);
392 static void hildon_color_chooser_dialog_hsv_size_allocate(GtkWidget *widget, GtkAllocation *alloc)
394 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(widget);
399 GTK_WIDGET_CLASS(parent_klass)->size_allocate(widget, alloc);
402 if(GTK_WIDGET_REALIZED(widget)) {
403 tmp = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right);
404 tmp2 = (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
406 for(i = 0; i < tmp; i++) {
407 rect.x = ((i % dialog->style_info.num_buttons.left) * (dialog->style_info.radio_sizes.left + dialog->style_info.radio_sizes.top +
408 2*dialog->style_info.radio_sizes.bottom)) + dialog->style_info.radio_sizes.bottom;
409 rect.y = ((i / dialog->style_info.num_buttons.left) * (dialog->style_info.radio_sizes.right + dialog->style_info.radio_sizes.top +
410 2*dialog->style_info.radio_sizes.bottom)) + dialog->style_info.radio_sizes.bottom;
411 rect.width = dialog->style_info.radio_sizes.left;
412 rect.height = dialog->style_info.radio_sizes.right;
414 gdk_gc_set_clip_rectangle(dialog->gc_array[i], &rect);
417 for(i = 0; i < tmp2; i++) {
418 rect.x = ((i % dialog->style_info.num_buttons.top) * (dialog->style_info.radio_sizes.left + dialog->style_info.radio_sizes.top +
419 2*dialog->style_info.radio_sizes.bottom)) + dialog->style_info.radio_sizes.bottom;
420 rect.y = ((i / dialog->style_info.num_buttons.top) * (dialog->style_info.radio_sizes.right + dialog->style_info.radio_sizes.top +
421 2*dialog->style_info.radio_sizes.bottom)) + dialog->style_info.radio_sizes.bottom;
422 rect.width = dialog->style_info.radio_sizes.left;
423 rect.height = dialog->style_info.radio_sizes.right;
425 gdk_gc_set_clip_rectangle(dialog->gc_array[i + tmp], &rect);
431 static void hildon_color_chooser_dialog_hsv_realize(GtkWidget *widget)
433 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(widget);
438 GTK_WIDGET_CLASS(parent_klass)->realize(widget);
441 tmp = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right) +
442 (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
444 for(i = 0; i < tmp; i++) {
445 dialog->gc_array[i] = gdk_gc_new(widget->window);
450 tmp = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right);
451 tmp2 = (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
453 for(i = 0; i < tmp; i++) {
454 gdk_gc_set_rgb_fg_color(dialog->gc_array[i], &dialog->colors_defined[i]);
456 rect.x = ((i % dialog->style_info.num_buttons.left) * (dialog->style_info.radio_sizes.left + dialog->style_info.radio_sizes.top +
457 2*dialog->style_info.radio_sizes.bottom)) + dialog->style_info.radio_sizes.bottom;
458 rect.y = ((i / dialog->style_info.num_buttons.left) * (dialog->style_info.radio_sizes.right + dialog->style_info.radio_sizes.top +
459 2*dialog->style_info.radio_sizes.bottom)) + dialog->style_info.radio_sizes.bottom;
460 rect.width = dialog->style_info.radio_sizes.left;
461 rect.height = dialog->style_info.radio_sizes.right;
463 gdk_gc_set_clip_rectangle(dialog->gc_array[i], &rect);
466 for(i = 0; i < tmp2; i++) {
467 gdk_gc_set_rgb_fg_color(dialog->gc_array[i + tmp], &dialog->colors_custom[i]);
469 rect.x = ((i % dialog->style_info.num_buttons.top) * (dialog->style_info.radio_sizes.left + dialog->style_info.radio_sizes.top +
470 2*dialog->style_info.radio_sizes.bottom)) + dialog->style_info.radio_sizes.bottom;
471 rect.y = ((i / dialog->style_info.num_buttons.top) * (dialog->style_info.radio_sizes.right + dialog->style_info.radio_sizes.top +
472 2*dialog->style_info.radio_sizes.bottom)) + dialog->style_info.radio_sizes.bottom;
473 rect.width = dialog->style_info.radio_sizes.left;
474 rect.height = dialog->style_info.radio_sizes.right;
476 gdk_gc_set_clip_rectangle(dialog->gc_array[i + tmp], &rect);
480 static void hildon_color_chooser_dialog_hsv_unrealize(GtkWidget *widget)
482 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(widget);
486 tmp = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right) +
487 (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
489 for(i = 0; i < tmp; i++) {
490 g_object_unref(dialog->gc_array[i]);
494 GTK_WIDGET_CLASS(parent_klass)->unrealize(widget);
498 static void hildon_color_chooser_dialog_hsv_style_set(GtkWidget *widget, GtkStyle *previous_style)
500 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(widget);
502 gchar tmp[32], key[128], *val;
503 int i, tmpn, setcolor = 0;
506 if(!dialog->has_style)
509 dialog->has_style = 1;
512 gtk_widget_style_get(widget, "default_color", &tmpcolor, NULL);
514 dialog->style_info.default_color = *tmpcolor;
516 dialog->style_info.default_color.red = 0x0000;
517 dialog->style_info.default_color.green = 0x0000;
518 dialog->style_info.default_color.blue = 0x0000;
519 dialog->style_info.default_color.pixel = 0x00000000;
523 hildon_color_chooser_dialog_hsv_refresh_style_info(dialog);
526 if(memcmp(&dialog->style_info.num_buttons, &dialog->style_info.last_num_buttons, sizeof(GtkBorder))) {
527 if(dialog->colors_custom) {
528 g_free(dialog->colors_custom);
529 } if(dialog->colors_defined) {
530 g_free(dialog->colors_defined);
531 } if(dialog->gc_array) {
532 if(GTK_WIDGET_REALIZED(widget)) {
533 tmpn = (dialog->style_info.last_num_buttons.left * dialog->style_info.last_num_buttons.right) +
534 (dialog->style_info.last_num_buttons.top * dialog->style_info.last_num_buttons.bottom);
536 for(i = 0; i < tmpn; i++) {
537 g_object_unref(dialog->gc_array[i]);
541 g_free(dialog->gc_array);
544 dialog->colors_custom = (GdkColor *)g_malloc0(sizeof(GdkColor) * (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom));
545 dialog->colors_defined = (GdkColor *)g_malloc0(sizeof(GdkColor) * (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right));
548 tmpn = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right) +
549 (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
550 dialog->gc_array = (GdkGC **)g_malloc0(sizeof(GdkGC *) * tmpn);
553 if(dialog->gconf_data.client) {
554 for(i = 0; i < (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom); i++) {
556 g_snprintf(key, 128, "/system/osso/af/color_chooser/custom_color%d", i);
557 val = gconf_client_get_string(dialog->gconf_data.client, key, NULL);
559 hildon_color_chooser_dialog_hsv_ascii_hex_to_color(val, &dialog->colors_custom[i]);
562 dialog->colors_custom[i] = dialog->style_info.default_color;
566 for(i = 0; i < (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom); i++) {
567 dialog->colors_custom[i] = dialog->style_info.default_color;
573 tmpn = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right);
575 hildon_color_chooser_set_color(HILDON_COLOR_CHOOSER(dialog->chooser),
576 (dialog->selected < tmpn) ? &dialog->colors_defined[dialog->selected] : &dialog->colors_custom[dialog->selected - tmpn]);
579 for(i = 0; i < (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right); i++) {
581 g_snprintf(tmp, 32, "defined_color%d", i);
583 gtk_widget_style_get(widget, tmp, &tmpcolor, NULL);
586 dialog->colors_defined[i] = *tmpcolor;
589 dialog->colors_defined[i] = hardcoded_colors[i];
590 } else { /* fallback to prevent segfault */
591 dialog->colors_defined[i].red = 0x0000;
592 dialog->colors_defined[i].green = 0x0000;
593 dialog->colors_defined[i].blue = 0x0000;
594 dialog->colors_defined[i].pixel = 0x00000000;
600 if(GTK_WIDGET_REALIZED(widget)) {
601 for(i = 0; i < (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right); i++) {
602 gdk_gc_set_rgb_fg_color(dialog->gc_array[i], &dialog->colors_defined[i]);
608 hildon_color_chooser_dialog_hsv_set_color(HILDON_COLOR_CHOOSER_DIALOG(dialog), &dialog->pending_color);
611 gtk_widget_queue_resize(widget);
614 GTK_WIDGET_CLASS(parent_klass)->style_set(widget, previous_style);
618 static void hildon_color_chooser_dialog_hsv_show(GtkWidget *widget)
620 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(widget);
623 gtk_widget_show(dialog->hbox);
624 gtk_widget_show(dialog->vbox);
626 gtk_widget_show(dialog->chooser);
628 gtk_widget_show(dialog->align_custom);
629 gtk_widget_show(dialog->align_defined);
631 gtk_widget_show(dialog->separator);
633 gtk_widget_show(dialog->area_custom);
634 gtk_widget_show(dialog->area_defined);
637 GTK_WIDGET_CLASS(parent_klass)->show(widget);
640 static void hildon_color_chooser_dialog_hsv_show_all(GtkWidget *widget)
642 hildon_color_chooser_dialog_hsv_show(widget);
646 static gboolean hildon_color_chooser_dialog_hsv_key_press_event(GtkWidget *widget, GdkEventKey *event)
648 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(widget);
652 if(event->keyval == HILDON_HARDKEY_UP || event->keyval == HILDON_HARDKEY_DOWN ||
653 event->keyval == HILDON_HARDKEY_LEFT || event->keyval == HILDON_HARDKEY_RIGHT) {
654 tmp = (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
655 tot = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right) + tmp;
657 switch(event->keyval) {
658 case HILDON_HARDKEY_UP:
659 if(dialog->selected >= dialog->style_info.num_buttons.top) {
660 if(dialog->selected - dialog->style_info.num_buttons.left >= tmp) {
661 sel = dialog->selected - dialog->style_info.num_buttons.left;
663 sel = dialog->selected - dialog->style_info.num_buttons.top;
666 hildon_color_chooser_dialog_hsv_set_color_num(dialog, sel);
669 case HILDON_HARDKEY_DOWN:
670 if(dialog->selected < tot - dialog->style_info.num_buttons.left) {
671 if(dialog->selected < tmp) {
672 sel = dialog->selected + dialog->style_info.num_buttons.top;
674 sel = dialog->selected + dialog->style_info.num_buttons.left;
677 hildon_color_chooser_dialog_hsv_set_color_num(dialog, sel);
680 case HILDON_HARDKEY_LEFT:
681 if((dialog->selected < tmp ? (dialog->selected % dialog->style_info.num_buttons.top) : ((dialog->selected - tmp) % dialog->style_info.num_buttons.left)) > 0) {
682 sel = dialog->selected - 1;
684 hildon_color_chooser_dialog_hsv_set_color_num(dialog, sel);
687 case HILDON_HARDKEY_RIGHT:
688 if((dialog->selected < tmp) ? (dialog->selected % dialog->style_info.num_buttons.top < dialog->style_info.num_buttons.top - 1) :
689 ((dialog->selected - tmp) % dialog->style_info.num_buttons.left < dialog->style_info.num_buttons.left - 1)) {
690 sel = dialog->selected + 1;
692 hildon_color_chooser_dialog_hsv_set_color_num(dialog, sel);
702 return GTK_WIDGET_CLASS(parent_klass)->key_press_event(widget, event);
705 static gboolean hildon_color_chooser_dialog_hsv_key_release_event(GtkWidget *widget, GdkEventKey *event)
707 if(event->keyval == HILDON_HARDKEY_UP || event->keyval == HILDON_HARDKEY_DOWN ||
708 event->keyval == HILDON_HARDKEY_LEFT || event->keyval == HILDON_HARDKEY_RIGHT) {
712 return GTK_WIDGET_CLASS(parent_klass)->key_press_event(widget, event);
716 static void hildon_color_chooser_dialog_hsv_destroy(GtkObject *object)
718 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(object);
719 gchar key[128], color[13];
723 if(dialog->gconf_data.client) {
724 memset(color, 0, 13);
726 tmp = (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
728 for(i = 0; i < tmp; i++) {
730 g_snprintf(key, 128, "/system/osso/af/color_chooser/custom_color%d", i);
731 hildon_color_chooser_dialog_hsv_color_to_ascii_hex(color, &dialog->colors_custom[i]);
732 gconf_client_set_string(dialog->gconf_data.client, key, color, NULL);
735 g_object_unref(dialog->gconf_data.client);
736 dialog->gconf_data.client = NULL;
740 if(dialog->gc_array) {
741 g_free(dialog->gc_array);
742 dialog->gc_array = NULL;
743 } if(dialog->colors_defined) {
744 g_free(dialog->colors_defined);
745 dialog->colors_defined = NULL;
746 } if(dialog->colors_custom) {
747 g_free(dialog->colors_custom);
748 dialog->colors_custom = NULL;
752 GTK_OBJECT_CLASS(parent_klass)->destroy(object);
756 static void hildon_color_chooser_dialog_hsv_set_color(HildonColorChooserDialog *dialog, GdkColor *color)
758 HildonColorChooserDialogHSV *dialog_hsv = HILDON_COLOR_CHOOSER_DIALOG_HSV(dialog);
759 int i, found = -1, tmp, tmp2;
762 if(!dialog_hsv->has_style) {
763 dialog_hsv->pending_color = *color;
768 tmp = (dialog_hsv->style_info.num_buttons.left * dialog_hsv->style_info.num_buttons.right);
769 tmp2 = (dialog_hsv->style_info.num_buttons.top * dialog_hsv->style_info.num_buttons.bottom);
771 for(i = 0; i < tmp; i++) {
772 if(dialog_hsv->colors_defined[i].red == color->red &&
773 dialog_hsv->colors_defined[i].green == color->green &&
774 dialog_hsv->colors_defined[i].blue == color->blue) {
781 for(i = 0; i < tmp2; i++) {
782 if(dialog_hsv->colors_custom[i].red == color->red &&
783 dialog_hsv->colors_custom[i].green == color->green &&
784 dialog_hsv->colors_custom[i].blue == color->blue) {
793 dialog_hsv->colors_custom[tmp2-1] = *color;
794 if(GTK_WIDGET_REALIZED(GTK_WIDGET(dialog))) {
795 gdk_gc_set_rgb_fg_color(dialog_hsv->gc_array[tmp2-1], color);
797 hildon_color_chooser_dialog_hsv_set_color_num(dialog_hsv, tmp2-1);
799 hildon_color_chooser_dialog_hsv_set_color_num(dialog_hsv, found);
804 static gboolean hildon_color_chooser_dialog_hsv_area_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data)
806 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(data);
807 int i, num_selected, tot_w, tot_h, spacing, brd, x, y;
812 tmp = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right);
814 if(widget == dialog->area_custom) {
815 num_selected = dialog->selected - tmp;
816 start_gc = dialog->gc_array + tmp;
817 tmp = (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
818 w = dialog->style_info.num_buttons.top; h = dialog->style_info.num_buttons.bottom;
819 } else { /* widget == dialog->area_defined */
820 num_selected = dialog->selected;
821 start_gc = dialog->gc_array;
822 w = dialog->style_info.num_buttons.left; h = dialog->style_info.num_buttons.right;
825 spacing = dialog->style_info.radio_sizes.top;
826 brd = dialog->style_info.radio_sizes.bottom;
827 tot_w = dialog->style_info.radio_sizes.left + 2*brd;
828 tot_h = dialog->style_info.radio_sizes.right + 2*brd;
831 for(i = 0; i < tmp; i++) {
832 x = ((i % w) * (tot_w + spacing));
833 y = ((i / w) * (tot_h + spacing));
835 gdk_draw_rectangle(widget->window,
836 widget->style->black_gc,
838 (i == num_selected) ? x : x + 2,
839 (i == num_selected) ? y : y + 2,
840 (i == num_selected) ? tot_w : tot_w - 4,
841 (i == num_selected) ? tot_h : tot_h - 4);
843 gdk_draw_rectangle(widget->window,
844 widget->style->white_gc,
851 gdk_draw_rectangle(widget->window,
859 // gtk_paint_box(gtk_widget_get_style(GTK_WIDGET(dialog)), widget->window, (i == num_selected) ? GTK_STATE_SELECTED : GTK_STATE_NORMAL,
860 // (i == num_selected) ? GTK_SHADOW_IN : GTK_SHADOW_OUT, &event->area, GTK_WIDGET(dialog), "color-radio", x, y, tot_w, tot_h);
863 //gdk_draw_rectangle(widget->window, start_gc[i], TRUE, event->area.x, event->area.y, event->area.width, event->area.height);
871 static gboolean hildon_color_chooser_dialog_hsv_area_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data)
873 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(data);
874 int i, hskip, vskip, brd, selection = -1;
875 int x, y, tmp, tmp2, w;
882 brd = dialog->style_info.radio_sizes.bottom;
883 hskip = dialog->style_info.radio_sizes.left + dialog->style_info.radio_sizes.top + 2*brd;
884 vskip = dialog->style_info.radio_sizes.right + dialog->style_info.radio_sizes.top + 2*brd;
887 tmp = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right);
888 tmp2 = (dialog->style_info.num_buttons.top * dialog->style_info.num_buttons.bottom);
891 if(widget == dialog->area_defined) {
892 w = dialog->style_info.num_buttons.left;
894 for(i = 0; i < tmp; i++) {
895 if(x >= hskip*(i % w) + brd && x < hskip*(i % w) + brd + dialog->style_info.radio_sizes.left &&
896 y >= vskip*(i / w) + brd && y < hskip*(i / w) + brd + dialog->style_info.radio_sizes.right) {
902 w = dialog->style_info.num_buttons.top;
903 for(i = 0; i < tmp2; i++) {
904 if(x >= hskip*(i % w) + brd && x < hskip*(i % w) + brd + dialog->style_info.radio_sizes.left &&
905 y >= vskip*(i / w) + brd && y < hskip*(i / w) + brd + dialog->style_info.radio_sizes.right) {
913 if(selection != -1) {
914 hildon_color_chooser_dialog_hsv_set_color_num(dialog, selection);
922 static void hildon_color_chooser_dialog_hsv_chooser_color_changed(HildonColorChooser *chooser, GdkColor *color, gpointer data)
924 HildonColorChooserDialogHSV *dialog = HILDON_COLOR_CHOOSER_DIALOG_HSV(data);
925 HildonColorChooserDialog *dia = HILDON_COLOR_CHOOSER_DIALOG(data);
926 char key[128], color_str[13];
933 tmp = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right);
936 if(dialog->selected >= tmp) {
937 dialog->colors_custom[dialog->selected - tmp] = *color;
939 gdk_gc_set_rgb_fg_color(dialog->gc_array[dialog->selected], &dialog->colors_custom[dialog->selected - tmp]);
941 gtk_widget_queue_draw(dialog->area_custom);
944 if(dialog->gconf_data.client) {
946 memset(color_str, 0, 13);
947 g_snprintf(key, 128, "/system/osso/af/color_chooser/custom_color%d", dialog->selected - tmp);
948 hildon_color_chooser_dialog_hsv_color_to_ascii_hex(color_str, &dialog->colors_custom[dialog->selected - tmp]);
949 gconf_client_set_string(dialog->gconf_data.client, key, color_str, NULL);
955 static void hildon_color_chooser_dialog_hsv_chooser_insensitive_press(GtkWidget *widget, gpointer data)
957 hildon_banner_show_information(widget, NULL, _("ecdg_ib_colour_selector_predefined"));
960 /* function has size defaults */
961 static void hildon_color_chooser_dialog_hsv_refresh_style_info(HildonColorChooserDialogHSV *dialog)
963 GtkBorder *tmp1, *tmp2, *tmp3;
966 gtk_widget_style_get(GTK_WIDGET(dialog), "container_sizes", &tmp1,
967 "radio_sizes", &tmp2, "num_buttons", &tmp3, NULL);
970 dialog->style_info.last_num_buttons = dialog->style_info.num_buttons;
974 dialog->style_info.cont_sizes = *tmp1;
977 dialog->style_info.cont_sizes.left = 0;
978 dialog->style_info.cont_sizes.right = 8;
979 dialog->style_info.cont_sizes.top = 4;
980 dialog->style_info.cont_sizes.bottom = 0;
984 dialog->style_info.radio_sizes = *tmp2;
987 dialog->style_info.radio_sizes.left = 16;
988 dialog->style_info.radio_sizes.right = 16;
989 dialog->style_info.radio_sizes.top = 4;
990 dialog->style_info.radio_sizes.bottom = 2;
994 dialog->style_info.num_buttons = *tmp3;
997 dialog->style_info.num_buttons.left = 8;
998 dialog->style_info.num_buttons.right = 2;
999 dialog->style_info.num_buttons.top = 8;
1000 dialog->style_info.num_buttons.bottom = 2;
1005 static void hildon_color_chooser_dialog_hsv_set_color_num(HildonColorChooserDialogHSV *dialog, gint num)
1007 HildonColorChooserDialog *dia = HILDON_COLOR_CHOOSER_DIALOG(dialog);
1011 tmp = (dialog->style_info.num_buttons.left * dialog->style_info.num_buttons.right);
1015 gtk_widget_set_sensitive(dialog->chooser, FALSE);
1017 gtk_widget_set_sensitive(dialog->chooser, TRUE);
1021 dialog->selected = num;
1023 gtk_widget_queue_draw(dialog->area_custom);
1024 gtk_widget_queue_draw(dialog->area_defined);
1026 dia->color = (num < tmp) ? dialog->colors_defined[num] : dialog->colors_custom[num - tmp];
1028 hildon_color_chooser_set_color(HILDON_COLOR_CHOOSER(dialog->chooser), (num < tmp) ? &dialog->colors_defined[num] : &dialog->colors_custom[num - tmp]);
1032 static void hildon_color_chooser_dialog_hsv_ascii_hex_to_color(gchar *s, GdkColor *color)
1037 for(i = 0; i < 12; i++) {
1038 if(s[i] >= '0' && s[i] <= '9') {
1039 vals[i] = s[i] - 0x30;
1040 } else if(s[i] >= 'a' && s[i] <= 'f') {
1041 vals[i] = s[i] - 0x57;
1048 color->red = (vals[0] << 12) | (vals[1] << 8) | (vals[2 ] << 4) | (vals[3 ] );
1049 color->green = (vals[4] << 12) | (vals[5] << 8) | (vals[6 ] << 4) | (vals[7 ] );
1050 color->blue = (vals[8] << 12) | (vals[9] << 8) | (vals[10] << 4) | (vals[11] );
1053 static void hildon_color_chooser_dialog_hsv_color_to_ascii_hex(gchar *s, GdkColor *color)
1055 g_snprintf(s, 13, "%x%x%x%x%x%x%x%x%x%x%x%x",
1056 (color->red >> 12) & 0xf, (color->red >> 8) & 0xf,
1057 (color->red >> 4) & 0xf, (color->red ) & 0xf,
1058 (color->green >> 12) & 0xf, (color->green >> 8) & 0xf,
1059 (color->green >> 4) & 0xf, (color->green ) & 0xf,
1060 (color->blue >> 12) & 0xf, (color->blue >> 8) & 0xf,
1061 (color->blue >> 4) & 0xf, (color->blue ) & 0xf);