From 98f1dc53d67dbd5184f51966eed5f0562ffc42a8 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Thu, 4 Oct 2012 08:27:07 +0000 Subject: [PATCH] elementary: add color picker to elm_colorselector. SVN revision: 77409 --- legacy/elementary/ChangeLog | 4 + legacy/elementary/NEWS | 1 + .../data/themes/widgets/colorselector.edc | 86 ++- legacy/elementary/src/lib/elm_colorselector.c | 572 +++++++++++++++--- legacy/elementary/src/lib/elm_colorselector.h | 4 +- .../src/lib/elm_widget_colorselector.h | 17 +- 6 files changed, 584 insertions(+), 100 deletions(-) diff --git a/legacy/elementary/ChangeLog b/legacy/elementary/ChangeLog index 02d8c78eb1..c07b0ac888 100644 --- a/legacy/elementary/ChangeLog +++ b/legacy/elementary/ChangeLog @@ -560,3 +560,7 @@ * fix copy&paste error in elm_flip. * fix possible invalid memory access in elm_access. + +2012-10-04 Cedric Bail + + * Add a color picker to elm_colorselector. diff --git a/legacy/elementary/NEWS b/legacy/elementary/NEWS index 83c247630b..c461062334 100644 --- a/legacy/elementary/NEWS +++ b/legacy/elementary/NEWS @@ -9,6 +9,7 @@ Additions: * Add reorder mode set/get API in Toolbar. * Add the toolbar API which expand the transverse length. * Add a way to know which month is displayed in elm_calendar + * Add color picker to elm_colorselector. Improvements: diff --git a/legacy/elementary/data/themes/widgets/colorselector.edc b/legacy/elementary/data/themes/widgets/colorselector.edc index 2797997ee1..1954c0085b 100644 --- a/legacy/elementary/data/themes/widgets/colorselector.edc +++ b/legacy/elementary/data/themes/widgets/colorselector.edc @@ -4,6 +4,31 @@ group { data.item: "horizontal_pad" "10"; data.item: "vertical_pad" "10"; parts { + part { name: "picker"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + align: 0.0 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 0.0; + } + } + part { name: "top_padding"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: 0 20; + fixed: 0 1; + rel1.relative: 0.0 1.0; + rel1.to: "picker"; + rel2.to: "picker"; + align: 0.0 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + min: 0 0; + } + } part { name: "palette"; type: SWALLOW; scale: 1; @@ -11,18 +36,19 @@ group { align: 0.0 0.0; fixed: 0 1; rel1 { - relative: 0.0 0.0; + relative: 0.0 1.0; + to: "top_padding"; } rel2 { - relative: 1.0 0.0; + relative: 1.0 1.0; + to: "top_padding"; } } } part{ name: "bottom_padding"; - type: RECT; + type: SPACER; scale: 1; description { state: "default" 0.0; - visible: 0; min: 0 20; fixed: 0 1; rel1.relative: 0.0 1.0; @@ -49,23 +75,75 @@ group { } } programs { + program { name: "init"; + source: ""; + signal: "load"; + action: STATE_SET "disabled" 0.0; + target: "top_padding"; + } program { name: "palette"; source: "elm"; signal: "elm,state,palette"; action: STATE_SET "disabled" 0.0; target: "bottom_padding"; + target: "top_padding"; } program { name: "components"; source: "elm"; signal: "elm,state,components"; action: STATE_SET "disabled" 0.0; target: "bottom_padding"; + target: "top_padding"; } program { name: "both"; source: "elm"; signal: "elm,state,both"; action: STATE_SET "default" 0.0; target: "bottom_padding"; + after: "notop"; + } + program { name: "notop"; + action: STATE_SET "disabled" 0.0; + target: "top_padding"; + } + program { name: "picker"; + source: "elm"; + signal: "elm,state,picker"; + action: STATE_SET "disabled" 0.0; + target: "bottom_padding"; + target: "top_padding"; + } + program { name: "all"; + source: "elm"; + signal: "elm,state,all"; + action: STATE_SET "default" 0.0; + target: "bottom_padding"; + target: "top_padding"; + } + } +} + +group { name: "elm/colorselector/picker/default"; + parts { + part { name: "background"; + type: IMAGE; + description { state: "default" 0.0; + rel1.to: "elm.picker"; + rel2.to: "elm.picker"; + image.normal: "color_picker_alpha_bg.png"; + fill { + type: TILE; + origin.offset: 0 0; + size.offset: 33 33; + } + } + } + part { name: "elm.picker"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + min: 20 20; + } } } } diff --git a/legacy/elementary/src/lib/elm_colorselector.c b/legacy/elementary/src/lib/elm_colorselector.c index c46c1c2996..578dfe1e4e 100644 --- a/legacy/elementary/src/lib/elm_colorselector.c +++ b/legacy/elementary/src/lib/elm_colorselector.c @@ -87,6 +87,94 @@ _color_with_lightness(Elm_Colorselector_Smart_Data *sd) } } +static void +_color_picker_init(Elm_Colorselector_Smart_Data *sd) +{ + char buf[12]; + unsigned int *pixels; + unsigned int *copy; + int color; + int x, y, w, h; + + snprintf(buf, 12, "%i", sd->r); + elm_object_text_set(sd->entries[0], buf); + + snprintf(buf, 12, "%i", sd->g); + elm_object_text_set(sd->entries[1], buf); + + snprintf(buf, 12, "%i", sd->b); + elm_object_text_set(sd->entries[2], buf); + + snprintf(buf, 12, "%i", sd->a); + elm_object_text_set(sd->entries[3], buf); + + color = (sd->a << 24) + (sd->r << 16) + (sd->g << 8) + sd->b; + + if (sd->b == 255) + evas_object_image_alpha_set(sd->picker_display, EINA_FALSE); + else + evas_object_image_alpha_set(sd->picker_display, EINA_TRUE); + + pixels = evas_object_image_data_get(sd->picker_display, EINA_TRUE); + copy = pixels; + for (y = 0; y < 17; y++) + for (x = 0; x < 17; x++) + { + *(pixels++) = color; + } + evas_object_image_data_set(sd->picker_display, copy); + evas_object_geometry_get(sd->picker_display, NULL, NULL, &w, &h); + evas_object_image_data_update_add(sd->picker_display, 0, 0, w, h); +} + + +static void +_rgb_to_hsl(Elm_Colorselector_Smart_Data *sd) +{ + double r2, g2, b2; + double v, m, vm; + double r, g, b; + + r = sd->r; + g = sd->g; + b = sd->b; + + r /= 255.0; + g /= 255.0; + b /= 255.0; + + v = (r > g) ? r : g; + v = (v > b) ? v : b; + + m = (r < g) ? r : g; + m = (m < b) ? m : b; + + sd->h = 0.0; + sd->s = 0.0; + sd->l = 0.0; + + sd->l = (m + v) / 2.0; + + if (sd->l <= 0.0) return; + + vm = v - m; + sd->s = vm; + + if (sd->s > 0.0) sd->s /= (sd->l <= 0.5) ? (v + m) : (2.0 - v - m); + else return; + + r2 = (v - r) / vm; + g2 = (v - g) / vm; + b2 = (v - b) / vm; + + if (r == v) sd->h = (g == m ? 5.0 + b2 : 1.0 - g2); + else if (g == v) + sd->h = (b == m ? 1.0 + r2 : 3.0 - b2); + else sd->h = (r == m ? 3.0 + g2 : 5.0 - r2); + + sd->h *= 60.0; +} + static void _hsl_to_rgb(Elm_Colorselector_Smart_Data *sd) { @@ -272,6 +360,355 @@ _rectangles_redraw(Color_Bar_Data *cb_data, double x) } _hsl_to_rgb(sd); + _color_picker_init(sd); +} + +static void +_colors_set(Evas_Object *obj, + int r, + int g, + int b, + int a) +{ + double x, y; + + ELM_COLORSELECTOR_DATA_GET(obj, sd); + + sd->r = r; + sd->g = g; + sd->b = b; + sd->a = a; + + _rgb_to_hsl(sd); + + edje_object_part_drag_value_get + (sd->cb_data[0]->colorbar, "elm.arrow", &x, &y); + x = sd->h / 360.0; + edje_object_part_drag_value_set + (sd->cb_data[0]->colorbar, "elm.arrow", x, y); + _rectangles_redraw(sd->cb_data[0], x); + + edje_object_part_drag_value_get + (sd->cb_data[1]->colorbar, "elm.arrow", &x, &y); + x = 1.0 - sd->s; + edje_object_part_drag_value_set + (sd->cb_data[1]->colorbar, "elm.arrow", x, y); + _rectangles_redraw(sd->cb_data[1], x); + + edje_object_part_drag_value_get + (sd->cb_data[2]->colorbar, "elm.arrow", &x, &y); + x = sd->l; + edje_object_part_drag_value_set(sd->cb_data[2]->colorbar, "elm.arrow", x, y); + _rectangles_redraw(sd->cb_data[2], x); + + edje_object_part_drag_value_get + (sd->cb_data[3]->colorbar, "elm.arrow", &x, &y); + x = sd->a / 255.0; + edje_object_part_drag_value_set + (sd->cb_data[3]->colorbar, "elm.arrow", x, y); + + _rectangles_redraw(sd->cb_data[3], x); +} + +static void +_entry_changed_cb(void *data, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + Elm_Colorselector_Smart_Data *sd = data; + Evas_Object *parent; + const char *text; + int i; + int v; + + for (i = 0; i < 4 && sd->entries[i] != obj; i++) + ; + + parent = evas_object_data_get(obj, "parent"); + text = elm_object_text_get(obj); + v = atoi(text); + if (v > 255) v = 255; + else if (v < 0) v = 0; + + switch (i) + { + case 0: + if (v != sd->r) + _colors_set(parent, v, sd->g, sd->b, sd->a); + break; + case 1: + if (v != sd->g) + _colors_set(parent, sd->r, v, sd->b, sd->a); + break; + case 2: + if (v != sd->b) + _colors_set(parent, sd->r, sd->g, v, sd->a); + break; + case 3: + if (v != sd->a) + _colors_set(parent, sd->r, sd->g, sd->b, v); + break; + } +} + +#ifdef HAVE_ELEMENTARY_X +static Ecore_X_Window +_x11_elm_widget_xwin_get(const Evas_Object *obj) +{ + Evas_Object *top; + Ecore_X_Window xwin = 0; + + top = elm_widget_top_get(obj); + if (!top) top = elm_widget_top_get(elm_widget_parent_widget_get(obj)); + if (top) xwin = elm_win_xwindow_get(top); + if (!xwin) + { + Ecore_Evas *ee; + Evas *evas = evas_object_evas_get(obj); + if (!evas) return 0; + ee = ecore_evas_ecore_evas_get(evas); + if (!ee) return 0; + xwin = _elm_ee_xwin_get(ee); + } + return xwin; +} +#endif + +#ifdef HAVE_ELEMENTARY_X +static Eina_Bool _mouse_grab_pixels(void *data, int type __UNUSED__, void *event __UNUSED__); + +static void +_start_grab_pick_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *o = data; + + ELM_COLORSELECTOR_DATA_GET(o, sd); + + elm_object_disabled_set(obj, EINA_TRUE); + + ecore_event_handler_del(sd->grab.mouse_motion); + sd->grab.mouse_motion = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _mouse_grab_pixels, o); + + ecore_x_keyboard_grab(sd->grab.xroot); + ecore_x_pointer_grab(sd->grab.xroot); +} + +static Eina_Bool +_key_up_cb(void *data, int type __UNUSED__, void *event __UNUSED__) +{ + Evas_Object *o = data; + + /* key => cancel */ + ELM_COLORSELECTOR_DATA_GET(o, sd); + + elm_object_disabled_set(sd->button, EINA_FALSE); + ecore_x_keyboard_ungrab(); + ecore_x_pointer_ungrab(); + ecore_event_handler_del(sd->grab.mouse_motion); + sd->grab.mouse_motion = ecore_event_handler_add(ECORE_X_RAW_MOTION, _mouse_grab_pixels, o); + + return EINA_TRUE; +} + +static Eina_Bool +_mouse_up_cb(void *data, int type __UNUSED__, void *event __UNUSED__) +{ + const unsigned int *pixels; + Evas_Object *o = data; + + /* mouse up => check it */ + ELM_COLORSELECTOR_DATA_GET(o, sd); + + elm_object_disabled_set(sd->button, EINA_FALSE); + ecore_x_keyboard_ungrab(); + ecore_x_pointer_ungrab(); + ecore_event_handler_del(sd->grab.mouse_motion); + sd->grab.mouse_motion = ecore_event_handler_add(ECORE_X_RAW_MOTION, _mouse_grab_pixels, o); + + pixels = evas_object_image_data_get(sd->picker_display, EINA_FALSE); + sd->a = 0xff; + sd->r = (pixels[17 * 9 + 9] >> 16) & 0xFF; + sd->g = (pixels[17 * 9 + 9] >> 8) & 0xFF; + sd->b = pixels[17 * 9 + 9] & 0xFF; + + _color_picker_init(sd); + + return EINA_TRUE; +} + +static Eina_Bool +_mouse_grab_pixels(void *data, int type __UNUSED__, void *event __UNUSED__) +{ + Evas_Object *obj = data; + Ecore_X_Visual visual; + Ecore_X_Display *display; + Ecore_X_Screen *scr; + Ecore_X_Image *img; + Ecore_X_Window xwin; + int *src; + int bpl = 0, rows = 0, bpp = 0; + int x, y, w, h; + + ELM_COLORSELECTOR_DATA_GET(obj, sd); + + if (sd->grab.in) return EINA_TRUE; + + xwin = _x11_elm_widget_xwin_get(obj); + sd->grab.xroot = ecore_x_window_root_get(xwin); + ecore_x_pointer_xy_get(sd->grab.xroot, &x, &y); + + if (x < 8) x += 8; + if (y < 8) y += 8; + + if (sd->grab.x == x && sd->grab.y == y) return EINA_TRUE; + sd->grab.x = x; + sd->grab.y = y; + + evas_object_image_alpha_set(sd->picker_display, EINA_FALSE); + + display = ecore_x_display_get(); + scr = ecore_x_default_screen_get(); + visual = ecore_x_default_visual_get(display, scr); + img = ecore_x_image_new(17, 17, visual, ecore_x_window_depth_get(sd->grab.xroot)); + ecore_x_image_get(img, sd->grab.xroot, x - 8, y - 8, 0, 0, 17, 17); + src = ecore_x_image_data_get(img, &bpl, &rows, &bpp); + if (!ecore_x_image_is_argb32_get(img)) + { + Ecore_X_Colormap colormap; + unsigned int *pixels; + + colormap = ecore_x_default_colormap_get(display, scr); + pixels = evas_object_image_data_get(sd->picker_display, EINA_TRUE); + ecore_x_image_to_argb_convert(src, bpp, bpl, colormap, visual, + 0, 0, 17, 17, + pixels, (17 * sizeof(int)), 0, 0); + } + else + { + evas_object_image_data_copy_set(sd->picker_display, src); + } + + ecore_x_image_free(img); + + evas_object_geometry_get(sd->picker_display, NULL, NULL, &w, &h); + evas_object_image_data_update_add(sd->picker_display, 0, 0, w, h); + + return EINA_TRUE; +} +#endif + +static void +_mouse_in_canvas(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *obj = data; + ELM_COLORSELECTOR_DATA_GET(obj, sd); + + sd->grab.in = EINA_TRUE; +} + +static void +_mouse_out_canvas(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *obj = data; + ELM_COLORSELECTOR_DATA_GET(obj, sd); + + sd->grab.in = EINA_FALSE; +} + +static void +_color_picker_add(Evas_Object *obj, Elm_Colorselector_Smart_Data *sd) +{ + Evas_Object *ed; + Evas_Object *im; + Evas_Object *label; + Evas_Object *entry; + Evas_Object *table; + Evas_Object *bx; + static const char *labels[4] = { "R:", "G:", "B:", "A:" }; + int i; +#ifdef HAVE_ELEMENTARY_X + Ecore_X_Window xwin; + + xwin = _x11_elm_widget_xwin_get(obj); + sd->grab.xroot = ecore_x_window_root_get(xwin); + ecore_x_input_raw_select(sd->grab.xroot); + + sd->grab.mouse_motion = ecore_event_handler_add(ECORE_X_RAW_MOTION, _mouse_grab_pixels, obj); + sd->grab.key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_up_cb, obj); + sd->grab.mouse_up = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _mouse_up_cb, obj); +#endif + + bx = elm_box_add(sd->picker); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(sd->picker, bx); + evas_object_show(bx); + + ed = edje_object_add(evas_object_evas_get(sd->picker)); + elm_widget_theme_object_set(obj, ed, "colorselector", "picker", elm_widget_style_get(obj)); + evas_object_size_hint_weight_set(ed, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ed, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, ed); + evas_object_show(ed); + +#ifdef HAVE_ELEMENTARY_X + sd->button = elm_button_add(sd->picker); + elm_object_text_set(sd->button, "Pick a color"); + evas_object_smart_callback_add(sd->button, "clicked", _start_grab_pick_cb, obj); + elm_box_pack_end(bx, sd->button); + evas_object_show(sd->button); +#endif + + im = evas_object_image_add(evas_object_evas_get(sd->picker)); + evas_object_size_hint_aspect_set(im, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + evas_object_image_smooth_scale_set(im, EINA_FALSE); + evas_object_image_colorspace_set(im, EVAS_COLORSPACE_ARGB8888); + evas_object_image_size_set(im, 17, 17); + evas_object_image_alpha_set(im, 1); + evas_object_image_filled_set(im, EINA_TRUE); + edje_object_part_swallow(ed, "elm.picker", im); + elm_widget_sub_object_add(obj, im); + + sd->picker_display = im; + + table = elm_table_add(sd->picker); + evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(sd->picker, table); + evas_object_show(table); + + for (i = 0; i < 4; i++) + { + static Elm_Entry_Filter_Accept_Set accept_set = { + .accepted = "0123456789", + .rejected = NULL + }; + + label = elm_label_add(table); + elm_object_text_set(label, labels[i]); + evas_object_size_hint_weight_set(label, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, 0.0, EVAS_HINT_FILL); + elm_table_pack(table, label, 0, i, 1, 1); + evas_object_show(label); + + entry = elm_entry_add(table); + elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, &accept_set); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_scrollable_set(entry, EINA_TRUE); + evas_object_data_set(entry, "parent", obj); + evas_object_smart_callback_add(entry, "changed", _entry_changed_cb, sd); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(table, entry, 1, i, 1, 1); + evas_object_show(entry); + + sd->entries[i] = entry; + } + + evas_event_callback_add(evas_object_evas_get(obj), EVAS_CALLBACK_CANVAS_FOCUS_IN, _mouse_in_canvas, obj); + evas_event_callback_add(evas_object_evas_get(obj), EVAS_CALLBACK_CANVAS_FOCUS_OUT, _mouse_out_canvas, obj); + + _color_picker_init(sd); } static void @@ -994,100 +1431,6 @@ _palette_colors_load(Evas_Object *obj) sd->config_load = EINA_TRUE; } -static void -_rgb_to_hsl(Elm_Colorselector_Smart_Data *sd) -{ - double r2, g2, b2; - double v, m, vm; - double r, g, b; - - r = sd->r; - g = sd->g; - b = sd->b; - - r /= 255.0; - g /= 255.0; - b /= 255.0; - - v = (r > g) ? r : g; - v = (v > b) ? v : b; - - m = (r < g) ? r : g; - m = (m < b) ? m : b; - - sd->h = 0.0; - sd->s = 0.0; - sd->l = 0.0; - - sd->l = (m + v) / 2.0; - - if (sd->l <= 0.0) return; - - vm = v - m; - sd->s = vm; - - if (sd->s > 0.0) sd->s /= (sd->l <= 0.5) ? (v + m) : (2.0 - v - m); - else return; - - r2 = (v - r) / vm; - g2 = (v - g) / vm; - b2 = (v - b) / vm; - - if (r == v) sd->h = (g == m ? 5.0 + b2 : 1.0 - g2); - else if (g == v) - sd->h = (b == m ? 1.0 + r2 : 3.0 - b2); - else sd->h = (r == m ? 3.0 + g2 : 5.0 - r2); - - sd->h *= 60.0; -} - -static void -_colors_set(Evas_Object *obj, - int r, - int g, - int b, - int a) -{ - double x, y; - - ELM_COLORSELECTOR_DATA_GET(obj, sd); - - sd->r = r; - sd->g = g; - sd->b = b; - sd->a = a; - - _rgb_to_hsl(sd); - - edje_object_part_drag_value_get - (sd->cb_data[0]->colorbar, "elm.arrow", &x, &y); - x = sd->h / 360.0; - edje_object_part_drag_value_set - (sd->cb_data[0]->colorbar, "elm.arrow", x, y); - _rectangles_redraw(sd->cb_data[0], x); - - edje_object_part_drag_value_get - (sd->cb_data[1]->colorbar, "elm.arrow", &x, &y); - x = 1.0 - sd->s; - edje_object_part_drag_value_set - (sd->cb_data[1]->colorbar, "elm.arrow", x, y); - _rectangles_redraw(sd->cb_data[1], x); - - edje_object_part_drag_value_get - (sd->cb_data[2]->colorbar, "elm.arrow", &x, &y); - x = sd->l; - edje_object_part_drag_value_set(sd->cb_data[2]->colorbar, "elm.arrow", x, y); - _rectangles_redraw(sd->cb_data[2], x); - - edje_object_part_drag_value_get - (sd->cb_data[3]->colorbar, "elm.arrow", &x, &y); - x = sd->a / 255.0; - edje_object_part_drag_value_set - (sd->cb_data[3]->colorbar, "elm.arrow", x, y); - - _rectangles_redraw(sd->cb_data[3], x); -} - static void _elm_colorselector_smart_add(Evas_Object *obj) { @@ -1136,6 +1479,17 @@ _elm_colorselector_smart_add(Evas_Object *obj) elm_widget_style_get(obj)); elm_layout_content_set(obj, "selector", priv->col_bars_area); + /* setup the color picker */ + priv->picker = elm_box_add(obj); + elm_box_horizontal_set(priv->picker, EINA_TRUE); + evas_object_size_hint_weight_set(priv->picker, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(priv->picker, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_box_padding_set(priv->picker, + (h_pad * elm_widget_scale_get(obj) * elm_config_scale_get()), + (v_pad * elm_widget_scale_get(obj) * elm_config_scale_get())); + elm_box_align_set(priv->palette_box, 0.5, 0.5); + priv->mode = ELM_COLORSELECTOR_BOTH; priv->focused = ELM_COLORSELECTOR_PALETTE; priv->sel_color_type = HUE; @@ -1147,9 +1501,17 @@ _elm_colorselector_smart_add(Evas_Object *obj) priv->s = 1.0; priv->l = 0.0; priv->a = 255; + priv->grab.x = -1; + priv->grab.y = -1; + priv->grab.xroot = -1; + priv->grab.mouse_motion = NULL; + priv->grab.mouse_up = NULL; + priv->grab.key_up = NULL; + priv->grab.in = EINA_TRUE; _hsl_to_rgb(priv); _color_bars_add(obj); + _color_picker_add(obj, priv); elm_layout_sizing_eval(obj); elm_widget_can_focus_set(obj, EINA_TRUE); @@ -1163,8 +1525,14 @@ _elm_colorselector_smart_del(Evas_Object *obj) ELM_COLORSELECTOR_DATA_GET(obj, sd); + evas_event_callback_del_full(evas_object_evas_get(obj), EVAS_CALLBACK_CANVAS_FOCUS_IN, _mouse_in_canvas, obj); + evas_event_callback_del_full(evas_object_evas_get(obj), EVAS_CALLBACK_CANVAS_FOCUS_OUT, _mouse_out_canvas, obj); + if (sd->longpress_timer) ecore_timer_del(sd->longpress_timer); if (sd->palette_name) eina_stringshare_del(sd->palette_name); + if (sd->grab.mouse_motion) ecore_event_handler_del(sd->grab.mouse_motion); + if (sd->grab.mouse_up) ecore_event_handler_del(sd->grab.mouse_up); + if (sd->grab.key_up) ecore_event_handler_del(sd->grab.key_up); _items_del(sd); /* This cb_data are used during the destruction process of base.del */ @@ -1447,6 +1815,7 @@ elm_colorselector_mode_set(Evas_Object *obj, evas_object_hide(elm_layout_content_unset(obj, "selector")); evas_object_hide(elm_layout_content_unset(obj, "palette")); + evas_object_hide(elm_layout_content_unset(obj, "picker")); switch (sd->mode) { @@ -1472,6 +1841,21 @@ elm_colorselector_mode_set(Evas_Object *obj, sd->selected = sd->items; break; + case ELM_COLORSELECTOR_PICKER: + elm_layout_content_set(obj, "picker", sd->picker); + elm_layout_signal_emit(obj, "elm,state,picker", "elm"); + sd->focused = ELM_COLORSELECTOR_PICKER; + break; + + case ELM_COLORSELECTOR_ALL: + elm_layout_content_set(obj, "picker", sd->picker); + elm_layout_content_set(obj, "palette", sd->palette_box); + elm_layout_content_set(obj, "selector", sd->col_bars_area); + elm_layout_signal_emit(obj, "elm,state,all", "elm"); + sd->focused = ELM_COLORSELECTOR_PALETTE; + sd->selected = sd->items; + break; + default: return; } diff --git a/legacy/elementary/src/lib/elm_colorselector.h b/legacy/elementary/src/lib/elm_colorselector.h index e3f2f1d751..c77810d790 100644 --- a/legacy/elementary/src/lib/elm_colorselector.h +++ b/legacy/elementary/src/lib/elm_colorselector.h @@ -60,7 +60,9 @@ typedef enum { ELM_COLORSELECTOR_PALETTE = 0, /**< only color palette is displayed */ ELM_COLORSELECTOR_COMPONENTS, /**< only color selector is displayed */ - ELM_COLORSELECTOR_BOTH /**< Both Palette and selector is displayed, default */ + ELM_COLORSELECTOR_BOTH, /**< Both Palette and selector is displayed, default */ + ELM_COLORSELECTOR_PICKER, /**< only color picker is displayed */ + ELM_COLORSELECTOR_ALL /**< all possible color selector is displayed */ } Elm_Colorselector_Mode; /** diff --git a/legacy/elementary/src/lib/elm_widget_colorselector.h b/legacy/elementary/src/lib/elm_widget_colorselector.h index cc101c22cb..35b960c959 100644 --- a/legacy/elementary/src/lib/elm_widget_colorselector.h +++ b/legacy/elementary/src/lib/elm_widget_colorselector.h @@ -125,9 +125,24 @@ struct _Elm_Colorselector_Smart_Data { Elm_Layout_Smart_Data base; - /* for the 2 displaying modes of the widget */ + /* for the 3 displaying modes of the widget */ Evas_Object *col_bars_area; Evas_Object *palette_box; + Evas_Object *picker; + Evas_Object *picker_display; + Evas_Object *entries[4]; + Evas_Object *button; + + struct { + int x, y; + Eina_Bool in; +#ifdef HAVE_ELEMENTARY_X + Ecore_X_Window xroot; + Ecore_Event_Handler *mouse_motion; + Ecore_Event_Handler *key_up; + Ecore_Event_Handler *mouse_up; +#endif + } grab; Eina_List *items, *selected; Color_Bar_Data *cb_data[4];