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_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
37 static void _e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
38 static void _e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
41 e_widget_cslider_add(Evas *evas, E_Color_Component mode, E_Color *color, int vertical, int fixed)
47 obj = e_widget_add(evas);
49 e_widget_del_hook_set(obj, _e_wid_del_hook);
50 e_widget_focus_hook_set(obj, _e_wid_focus_hook);
51 e_widget_disable_hook_set(obj, _e_wid_disable_hook);
52 wd = calloc(1, sizeof(E_Widget_Data));
53 e_widget_data_set(obj, wd);
55 wd->vertical = vertical;
59 wd->prev = calloc(1, sizeof (E_Color));
62 o = edje_object_add(evas);
64 e_theme_edje_object_set(o, "base/theme/widgets",
67 edje_object_signal_emit(o, "e,state,direction,v", "e");
69 edje_object_signal_emit(o, "e,state,direction,h", "e");
71 edje_object_size_min_calc(o, &mw, &mh);
72 e_widget_size_min_set(obj, mw, mh);
74 e_widget_sub_object_add(obj, o);
75 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
76 e_widget_resize_object_set(obj, o);
78 /* add gradient obj */
79 o = evas_object_rectangle_add(evas);
80 e_widget_sub_object_add(obj, o);
81 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_wid_move, wd);
82 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_wid_resize, wd);
84 evas_object_color_set(o, 0, 0, 0, 0);
87 edje_object_part_swallow(wd->o_cslider, "e.swallow.content", o);
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);
95 evas_object_color_set(o, 255, 255, 255, 255);
104 _e_wid_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
110 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
111 evas_object_move(wd->o_grad, x, y);
116 _e_wid_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
122 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
123 evas_object_resize(wd->o_grad, w, h);
128 _e_wid_value_set(Evas_Object *o, double vx)
132 wd = e_widget_data_get(o);
135 case E_COLOR_COMPONENT_R:
136 wd->color->r = 255 * vx;
137 e_color_update_rgb(wd->color);
139 case E_COLOR_COMPONENT_G:
140 wd->color->g = 255 * vx;
141 e_color_update_rgb(wd->color);
143 case E_COLOR_COMPONENT_B:
144 wd->color->b = 255 * vx;
145 e_color_update_rgb(wd->color);
147 case E_COLOR_COMPONENT_H:
148 wd->color->h = 360 * vx;
149 e_color_update_hsv(wd->color);
151 case E_COLOR_COMPONENT_S:
153 e_color_update_hsv(wd->color);
155 case E_COLOR_COMPONENT_V:
157 e_color_update_hsv(wd->color);
159 case E_COLOR_COMPONENT_MAX:
168 e_widget_cslider_color_value_set(Evas_Object *obj, E_Color *val)
172 wd = e_widget_data_get(obj);
178 e_widget_cslider_update(Evas_Object *obj)
182 wd = e_widget_data_get(obj);
187 e_widget_cslider_mode_set(Evas_Object *obj, E_Color_Component mode)
191 wd = e_widget_data_get(obj);
192 if (wd->mode == mode) return;
198 _e_wid_update(E_Widget_Data *wd)
200 Evas_Coord x, y, w, h;
201 Eina_Bool changed = EINA_FALSE;
203 evas_object_geometry_get(wd->o_event, &x, &y, &w, &h);
204 if (x != wd->x || y != wd->y || w != wd->w || h != wd->h)
207 if (memcmp(wd->color, wd->prev, sizeof (E_Color)))
215 _e_wid_update_fixed(wd);
217 _e_wid_update_standard(wd);
219 wd->x = x; wd->y = y;
220 wd->w = w; wd->h = h;
221 memcpy(wd->prev, wd->color, sizeof (E_Color));
223 if (wd->mode != E_COLOR_COMPONENT_H)
225 EINA_LIST_FREE(wd->o_hgrad, o)
227 evas_object_show(wd->o_grad);
231 evas_object_hide(wd->o_grad);
237 _e_wid_gradient_set(Evas_Object *o, Eina_Bool orientation,
238 int rf, int gf, int bf,
239 int rt, int gt, int bt)
244 evas_map_util_points_populate_from_object(m, o);
248 evas_map_point_color_set(m, 0, rf, gf, bf, 255);
249 evas_map_point_color_set(m, 1, rf, gf, bf, 255);
250 evas_map_point_color_set(m, 2, rt, gt, bt, 255);
251 evas_map_point_color_set(m, 3, rt, gt, bt, 255);
255 /* Rotate by 270° */
256 evas_map_point_color_set(m, 0, rf, gf, bf, 255);
257 evas_map_point_color_set(m, 1, rt, gt, bt, 255);
258 evas_map_point_color_set(m, 2, rt, gt, bt, 255);
259 evas_map_point_color_set(m, 3, rf, gf, bf, 255);
262 evas_object_map_enable_set(o, 1);
263 evas_object_map_set(o, m);
268 _e_wid_update_standard(E_Widget_Data *wd)
272 Evas_Coord x, y, w, h;
279 { &max, &min, &min },
280 { &max, &max, &min },
281 { &min, &max, &min },
282 { &min, &max, &max },
283 { &min, &min, &max },
284 { &max, &min, &max },
288 if (!wd->color) return;
292 case E_COLOR_COMPONENT_R:
293 _e_wid_gradient_set(wd->o_grad, wd->vertical,
294 0, wd->color->g, wd->color->b,
295 255, wd->color->g, wd->color->b);
296 vx = wd->color->r / 255.0;
298 case E_COLOR_COMPONENT_G:
299 _e_wid_gradient_set(wd->o_grad, wd->vertical,
300 wd->color->r, 0, wd->color->b,
301 wd->color->r, 255, wd->color->b);
302 vx = wd->color->g / 255.0;
304 case E_COLOR_COMPONENT_B:
305 _e_wid_gradient_set(wd->o_grad, wd->vertical,
306 wd->color->r, wd->color->g, 0,
307 wd->color->r, wd->color->g, 255);
308 vx = wd->color->b / 255.0;
310 case E_COLOR_COMPONENT_H:
311 evas_color_hsv_to_rgb(0, wd->color->s, wd->color->v, &max, &min, NULL);
317 e = evas_object_evas_get(wd->o_grad);
318 for (i = 0; i < 6; ++i)
319 wd->o_hgrad = eina_list_append(wd->o_hgrad,
320 evas_object_rectangle_add(e));
323 evas_object_geometry_get(wd->o_grad, &x, &y, &w, &h);
324 evas_object_hide(wd->o_grad);
327 EINA_LIST_FOREACH(wd->o_hgrad, l, o)
331 evas_object_move(o, x, y + (i * h) / 6);
332 evas_object_resize(o, w, h / 6);
336 evas_object_move(o, x + (i * w) / 6, y);
337 evas_object_resize(o, w / 6, h);
340 _e_wid_gradient_set(o, wd->vertical,
341 *grad[i][0], *grad[i][1], *grad[i][2],
342 *grad[i + 1][0], *grad[i + 1][1], *grad[i + 1][2]);
346 vx = wd->color->h / 360.0;
348 case E_COLOR_COMPONENT_S:
349 evas_color_hsv_to_rgb(wd->color->h, 0, wd->color->v, &r, &g, &b);
350 evas_color_hsv_to_rgb(wd->color->h, 1, wd->color->v, &rd, &gd, &bd);
352 _e_wid_gradient_set(wd->o_grad, wd->vertical,
357 case E_COLOR_COMPONENT_V:
358 evas_color_hsv_to_rgb(wd->color->h, wd->color->s, 0, &r, &g, &b);
359 evas_color_hsv_to_rgb(wd->color->h, wd->color->s, 1, &rd, &gd, &bd);
361 _e_wid_gradient_set(wd->o_grad, wd->vertical,
366 case E_COLOR_COMPONENT_MAX:
370 edje_object_part_drag_value_set(wd->o_cslider, "e.dragable.cursor", vx, vx);
374 _e_wid_update_fixed(E_Widget_Data *wd)
381 Evas_Coord x, y, w, h;
385 { GMAX, GMIN, GMIN },
386 { GMAX, GMIN, GMAX },
387 { GMIN, GMIN, GMAX },
388 { GMIN, GMAX, GMAX },
389 { GMIN, GMAX, GMIN },
390 { GMAX, GMAX, GMIN },
398 case E_COLOR_COMPONENT_R:
399 _e_wid_gradient_set(wd->o_grad, wd->vertical,
402 vx = wd->color->r / 255.0;
404 case E_COLOR_COMPONENT_G:
405 _e_wid_gradient_set(wd->o_grad, wd->vertical,
408 vx = wd->color->g / 255.0;
410 case E_COLOR_COMPONENT_B:
411 _e_wid_gradient_set(wd->o_grad, wd->vertical,
414 vx = wd->color->b / 255.0;
416 case E_COLOR_COMPONENT_H:
432 e = evas_object_evas_get(wd->o_grad);
433 for (i = 0; i < 6; ++i)
434 wd->o_hgrad = eina_list_append(wd->o_hgrad,
435 evas_object_rectangle_add(e));
438 evas_object_geometry_get(wd->o_grad, &x, &y, &w, &h);
439 evas_object_hide(wd->o_grad);
442 EINA_LIST_FOREACH(wd->o_hgrad, l, o)
446 evas_object_move(o, x, y + (i * h) / 6);
447 evas_object_resize(o, w, h / 6);
451 evas_object_move(o, x + (i * w) / 6, y);
452 evas_object_resize(o, w / 6, h);
455 _e_wid_gradient_set(o, wd->vertical,
456 grad[i][0], grad[i][1], grad[i][2],
457 grad[i + 1][0], grad[i + 1][1], grad[i + 1][2]);
461 vx = wd->color->h / 360.0;
463 case E_COLOR_COMPONENT_S:
464 _e_wid_gradient_set(wd->o_grad, wd->vertical,
469 case E_COLOR_COMPONENT_V:
470 _e_wid_gradient_set(wd->o_grad, wd->vertical,
475 case E_COLOR_COMPONENT_MAX:
479 edje_object_part_drag_value_set(wd->o_cslider, "e.dragable.cursor", vx, vx);
486 _e_wid_del_hook(Evas_Object *obj)
490 wd = e_widget_data_get(obj);
495 _e_wid_focus_hook(Evas_Object *obj)
499 wd = e_widget_data_get(obj);
500 if (e_widget_focus_get(obj))
502 edje_object_signal_emit(wd->o_cslider, "e,state,focused", "e");
503 evas_object_focus_set(wd->o_cslider, 1);
507 edje_object_signal_emit(wd->o_cslider, "e,state,unfocused", "e");
508 evas_object_focus_set(wd->o_cslider, 0);
513 _e_wid_disable_hook(Evas_Object *obj)
517 wd = e_widget_data_get(obj);
518 if (e_widget_disabled_get(obj))
519 edje_object_signal_emit(wd->o_cslider, "e,state,disabled", "e");
521 edje_object_signal_emit(wd->o_cslider, "e,state,enabled", "e");
525 _e_wid_focus_steal(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
527 e_widget_focus_steal(data);
531 _e_wid_cb_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
533 Evas_Event_Mouse_Down *ev;
536 Evas_Coord ox, oy, ow, oh;
542 wd = e_widget_data_get(o_wid);
545 evas_object_geometry_get(wd->o_grad, &ox, &oy, &ow, &oh);
548 val = 1 - ((ev->canvas.y - oy) / (double)oh);
550 val = (ev->canvas.x - ox) / (double)ow;
551 if (val > 1) val = 1;
552 if (val < 0) val = 0;
553 _e_wid_value_set(o_wid, val);
557 _e_wid_cb_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
563 wd = e_widget_data_get(o_wid);
568 _e_wid_cb_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
570 Evas_Event_Mouse_Move *ev;
575 wd = e_widget_data_get(o_wid);
578 if (wd->dragging == 1)
580 Evas_Coord ox, oy, ow, oh;
582 evas_object_geometry_get(wd->o_grad, &ox, &oy, &ow, &oh);
585 val = 1 - ((ev->cur.canvas.y - oy) / (double)oh);
587 val = (ev->cur.canvas.x - ox) / (double)ow;
588 if (val > 1) val = 1;
589 if (val < 0) val = 0;
590 _e_wid_value_set(o_wid, val);