3 typedef struct _E_Widget_Data E_Widget_Data;
7 Evas_Object *o_cslider;
13 Evas_Coord x, y, w, h;
17 E_Color_Component mode;
25 static void _e_wid_del_hook(Evas_Object *obj);
26 static void _e_wid_focus_hook(Evas_Object *obj);
27 static void _e_wid_disable_hook(Evas_Object *obj);
28 static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
29 static void _e_wid_value_set(Evas_Object *obj, double vx);
30 static void _e_wid_update(E_Widget_Data *wd);
31 static void _e_wid_update_standard(E_Widget_Data *wd);
32 static void _e_wid_update_fixed(E_Widget_Data *wd);
34 static void _e_wid_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
35 static void _e_wid_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
36 static void _e_wid_cb_drag_start(void *data, Evas_Object *obj, const char *emission, const char *source);
37 static void _e_wid_cb_drag_stop(void *data, Evas_Object *obj, const char *emission, const char *source);
38 static void _e_wid_cb_drag(void *data, Evas_Object *obj, const char *emission, const char *source);
40 /* static void _e_wid_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info); */
41 /* static void _e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info); */
42 /* static void _e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info); */
45 e_widget_cslider_add(Evas *evas, E_Color_Component mode, E_Color *color, int vertical, int fixed)
51 obj = e_widget_add(evas);
53 e_widget_del_hook_set(obj, _e_wid_del_hook);
54 e_widget_focus_hook_set(obj, _e_wid_focus_hook);
55 e_widget_disable_hook_set(obj, _e_wid_disable_hook);
56 wd = calloc(1, sizeof(E_Widget_Data));
57 e_widget_data_set(obj, wd);
59 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _e_wid_resize, wd);
61 wd->vertical = vertical;
65 wd->prev = calloc(1, sizeof (E_Color));
68 o = edje_object_add(evas);
70 e_theme_edje_object_set(o, "base/theme/widgets",
73 edje_object_signal_emit(o, "e,state,direction,v", "e");
75 edje_object_signal_emit(o, "e,state,direction,h", "e");
77 edje_object_size_min_calc(o, &mw, &mh);
78 e_widget_size_min_set(obj, mw, mh);
80 edje_object_signal_callback_add(wd->o_cslider, "drag,start", "*", _e_wid_cb_drag_start, obj);
81 edje_object_signal_callback_add(wd->o_cslider, "drag", "*", _e_wid_cb_drag, obj);
82 edje_object_signal_callback_add(wd->o_cslider, "drag,stop", "*", _e_wid_cb_drag_stop, obj);
84 e_widget_sub_object_add(obj, o);
85 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
86 e_widget_resize_object_set(obj, o);
88 /* add gradient obj */
89 o = evas_object_rectangle_add(evas);
90 e_widget_sub_object_add(obj, o);
91 /* evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_cb_down, obj); */
92 /* evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_wid_cb_move, obj); */
93 /* evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_wid_cb_up, obj); */
94 evas_object_color_set(o, 255, 255, 255, 255);
97 edje_object_part_swallow(wd->o_cslider, "e.swallow.content", o);
99 o = evas_object_rectangle_add(evas);
100 e_widget_sub_object_add(obj, o);
101 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_wid_move, wd);
103 evas_object_color_set(o, 0, 0, 0, 0);
112 _e_wid_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
115 /* Evas_Coord x, y; */
118 /* evas_object_geometry_get(obj, &x, &y, NULL, NULL); */
119 /* evas_object_move(wd->o_grad, x, y); */
124 _e_wid_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
127 /* Evas_Coord w, h; */
130 /* evas_object_geometry_get(obj, NULL, NULL, &w, &h); */
131 /* evas_object_resize(wd->o_grad, w, h); */
136 _e_wid_value_set(Evas_Object *o, double vx)
140 wd = e_widget_data_get(o);
143 case E_COLOR_COMPONENT_R:
144 wd->color->r = 255 * vx;
145 e_color_update_rgb(wd->color);
147 case E_COLOR_COMPONENT_G:
148 wd->color->g = 255 * vx;
149 e_color_update_rgb(wd->color);
151 case E_COLOR_COMPONENT_B:
152 wd->color->b = 255 * vx;
153 e_color_update_rgb(wd->color);
155 case E_COLOR_COMPONENT_H:
156 wd->color->h = 360 * vx;
157 e_color_update_hsv(wd->color);
159 case E_COLOR_COMPONENT_S:
161 e_color_update_hsv(wd->color);
163 case E_COLOR_COMPONENT_V:
165 e_color_update_hsv(wd->color);
167 case E_COLOR_COMPONENT_MAX:
176 e_widget_cslider_color_value_set(Evas_Object *obj, E_Color *val)
180 wd = e_widget_data_get(obj);
186 e_widget_cslider_update(Evas_Object *obj)
190 wd = e_widget_data_get(obj);
195 e_widget_cslider_mode_set(Evas_Object *obj, E_Color_Component mode)
199 wd = e_widget_data_get(obj);
200 if (wd->mode == mode) return;
206 _e_wid_update(E_Widget_Data *wd)
208 Evas_Coord x, y, w, h;
209 Eina_Bool changed = EINA_FALSE;
211 evas_object_geometry_get(wd->o_event, &x, &y, &w, &h);
212 if (x != wd->x || y != wd->y || w != wd->w || h != wd->h)
215 if (memcmp(wd->color, wd->prev, sizeof (E_Color)))
223 _e_wid_update_fixed(wd);
225 _e_wid_update_standard(wd);
227 wd->x = x; wd->y = y;
228 wd->w = w; wd->h = h;
229 memcpy(wd->prev, wd->color, sizeof (E_Color));
231 if (wd->mode != E_COLOR_COMPONENT_H)
233 EINA_LIST_FREE(wd->o_hgrad, o)
235 evas_object_show(wd->o_grad);
239 evas_object_hide(wd->o_grad);
245 _e_wid_gradient_set(Evas_Object *o, Eina_Bool orientation,
246 int rf, int gf, int bf,
247 int rt, int gt, int bt)
249 static Evas_Map *m = NULL;
251 if (!m) m = evas_map_new(4);
252 evas_map_util_points_populate_from_object(m, o);
256 evas_map_point_color_set(m, 0, rf, gf, bf, 255);
257 evas_map_point_color_set(m, 1, rf, gf, bf, 255);
258 evas_map_point_color_set(m, 2, rt, gt, bt, 255);
259 evas_map_point_color_set(m, 3, rt, gt, bt, 255);
263 /* Rotate by 270° */
264 evas_map_point_color_set(m, 0, rf, gf, bf, 255);
265 evas_map_point_color_set(m, 1, rt, gt, bt, 255);
266 evas_map_point_color_set(m, 2, rt, gt, bt, 255);
267 evas_map_point_color_set(m, 3, rf, gf, bf, 255);
270 evas_object_map_enable_set(o, 1);
271 evas_object_map_set(o, m);
275 _e_wid_update_standard(E_Widget_Data *wd)
279 Evas_Coord x, y, w, h;
286 { &max, &min, &min },
287 { &max, &max, &min },
288 { &min, &max, &min },
289 { &min, &max, &max },
290 { &min, &min, &max },
291 { &max, &min, &max },
295 if (!wd->color) return;
299 case E_COLOR_COMPONENT_R:
300 _e_wid_gradient_set(wd->o_grad, wd->vertical,
301 0, wd->color->g, wd->color->b,
302 255, wd->color->g, wd->color->b);
303 vx = wd->color->r / 255.0;
305 case E_COLOR_COMPONENT_G:
306 _e_wid_gradient_set(wd->o_grad, wd->vertical,
307 wd->color->r, 0, wd->color->b,
308 wd->color->r, 255, wd->color->b);
309 vx = wd->color->g / 255.0;
311 case E_COLOR_COMPONENT_B:
312 _e_wid_gradient_set(wd->o_grad, wd->vertical,
313 wd->color->r, wd->color->g, 0,
314 wd->color->r, wd->color->g, 255);
315 vx = wd->color->b / 255.0;
317 case E_COLOR_COMPONENT_H:
318 evas_color_hsv_to_rgb(0, wd->color->s, wd->color->v, &max, &min, NULL);
324 e = evas_object_evas_get(wd->o_grad);
325 for (i = 0; i < 6; ++i)
326 wd->o_hgrad = eina_list_append(wd->o_hgrad,
327 evas_object_rectangle_add(e));
330 evas_object_geometry_get(wd->o_grad, &x, &y, &w, &h);
331 evas_object_hide(wd->o_grad);
334 EINA_LIST_FOREACH(wd->o_hgrad, l, o)
338 evas_object_move(o, x, y + (i * h) / 6);
339 evas_object_resize(o, w, h / 6);
343 evas_object_move(o, x + (i * w) / 6, y);
344 evas_object_resize(o, w / 6, h);
347 _e_wid_gradient_set(o, wd->vertical,
348 *grad[i][0], *grad[i][1], *grad[i][2],
349 *grad[i + 1][0], *grad[i + 1][1], *grad[i + 1][2]);
353 vx = wd->color->h / 360.0;
355 case E_COLOR_COMPONENT_S:
356 evas_color_hsv_to_rgb(wd->color->h, 0, wd->color->v, &r, &g, &b);
357 evas_color_hsv_to_rgb(wd->color->h, 1, wd->color->v, &rd, &gd, &bd);
359 _e_wid_gradient_set(wd->o_grad, wd->vertical,
364 case E_COLOR_COMPONENT_V:
365 evas_color_hsv_to_rgb(wd->color->h, wd->color->s, 0, &r, &g, &b);
366 evas_color_hsv_to_rgb(wd->color->h, wd->color->s, 1, &rd, &gd, &bd);
368 _e_wid_gradient_set(wd->o_grad, wd->vertical,
373 case E_COLOR_COMPONENT_MAX:
377 edje_object_part_drag_value_set(wd->o_cslider, "e.dragable.cursor", vx, vx);
378 edje_object_message_signal_process(wd->o_cslider); /* really needed or go in infinite loop */
382 _e_wid_update_fixed(E_Widget_Data *wd)
389 Evas_Coord x, y, w, h;
393 { GMAX, GMIN, GMIN },
394 { GMAX, GMIN, GMAX },
395 { GMIN, GMIN, GMAX },
396 { GMIN, GMAX, GMAX },
397 { GMIN, GMAX, GMIN },
398 { GMAX, GMAX, GMIN },
406 case E_COLOR_COMPONENT_R:
407 _e_wid_gradient_set(wd->o_grad, wd->vertical,
410 vx = wd->color->r / 255.0;
412 case E_COLOR_COMPONENT_G:
413 _e_wid_gradient_set(wd->o_grad, wd->vertical,
416 vx = wd->color->g / 255.0;
418 case E_COLOR_COMPONENT_B:
419 _e_wid_gradient_set(wd->o_grad, wd->vertical,
422 vx = wd->color->b / 255.0;
424 case E_COLOR_COMPONENT_H:
440 e = evas_object_evas_get(wd->o_grad);
441 for (i = 0; i < 6; ++i)
442 wd->o_hgrad = eina_list_append(wd->o_hgrad,
443 evas_object_rectangle_add(e));
446 evas_object_geometry_get(wd->o_grad, &x, &y, &w, &h);
447 evas_object_hide(wd->o_grad);
450 EINA_LIST_FOREACH(wd->o_hgrad, l, o)
454 evas_object_move(o, x, y + (i * h) / 6);
455 evas_object_resize(o, w, h / 6);
459 evas_object_move(o, x + (i * w) / 6, y);
460 evas_object_resize(o, w / 6, h);
463 _e_wid_gradient_set(o, wd->vertical,
464 grad[i][0], grad[i][1], grad[i][2],
465 grad[i + 1][0], grad[i + 1][1], grad[i + 1][2]);
469 vx = wd->color->h / 360.0;
471 case E_COLOR_COMPONENT_S:
472 _e_wid_gradient_set(wd->o_grad, wd->vertical,
477 case E_COLOR_COMPONENT_V:
478 _e_wid_gradient_set(wd->o_grad, wd->vertical,
483 case E_COLOR_COMPONENT_MAX:
487 edje_object_part_drag_value_set(wd->o_cslider, "e.dragable.cursor", vx, vx);
494 _e_wid_del_hook(Evas_Object *obj)
498 wd = e_widget_data_get(obj);
503 _e_wid_focus_hook(Evas_Object *obj)
507 wd = e_widget_data_get(obj);
508 if (e_widget_focus_get(obj))
510 edje_object_signal_emit(wd->o_cslider, "e,state,focused", "e");
511 evas_object_focus_set(wd->o_cslider, 1);
515 edje_object_signal_emit(wd->o_cslider, "e,state,unfocused", "e");
516 evas_object_focus_set(wd->o_cslider, 0);
521 _e_wid_disable_hook(Evas_Object *obj)
525 wd = e_widget_data_get(obj);
526 if (e_widget_disabled_get(obj))
527 edje_object_signal_emit(wd->o_cslider, "e,state,disabled", "e");
529 edje_object_signal_emit(wd->o_cslider, "e,state,enabled", "e");
533 _e_wid_focus_steal(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
535 e_widget_focus_steal(data);
539 _e_wid_cb_drag_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
543 double val, valx, valy;
546 wd = e_widget_data_get(o_wid);
549 edje_object_part_drag_value_get(wd->o_cslider, "e.dragable.cursor",
551 if (wd->vertical) val = valy;
553 if (val > 1) val = 1;
554 if (val < 0) val = 0;
555 _e_wid_value_set(o_wid, val);
559 _e_wid_cb_drag_stop(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
565 wd = e_widget_data_get(o_wid);
570 _e_wid_cb_drag(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
576 wd = e_widget_data_get(o_wid);
578 if (wd->dragging == 1)
580 double val, valx, valy;
582 edje_object_part_drag_value_get(wd->o_cslider, "e.dragable.cursor",
584 if (wd->vertical) val = valy;
586 if (val > 1) val = 1;
587 if (val < 0) val = 0;
588 _e_wid_value_set(o_wid, val);