forked from enlightenment/efl
elementary: add color picker to elm_colorselector.
SVN revision: 77409
This commit is contained in:
parent
ced635d572
commit
98f1dc53d6
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in New Issue