3 typedef struct _E_Widget_Data E_Widget_Data;
8 Evas_Object *o_spectrum;
12 E_Color_Component mode;
17 static void _e_wid_del_hook(Evas_Object *obj);
18 static void _e_wid_focus_hook(Evas_Object *obj);
19 static void _e_wid_disable_hook(Evas_Object *obj);
20 static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
22 static void _e_wid_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h);
23 static void _e_wid_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y);
25 static void _e_wid_mouse_handle(Evas_Object *obj, int mx, int my);
26 static void _e_wid_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
27 static void _e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
28 static void _e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
31 e_widget_spectrum_add(Evas *evas, E_Color_Component mode, E_Color *cv)
37 obj = e_widget_add(evas);
39 e_widget_del_hook_set(obj, _e_wid_del_hook);
40 e_widget_focus_hook_set(obj, _e_wid_focus_hook);
41 e_widget_disable_hook_set(obj, _e_wid_disable_hook);
43 wd = calloc(1, sizeof(E_Widget_Data));
44 e_widget_data_set(obj, wd);
49 o = edje_object_add(evas);
51 e_theme_edje_object_set(o, "base/theme/widgets",
52 "e/widgets/spectrum");
55 edje_object_size_min_calc(o, &mw, &mh);
56 e_widget_size_min_set(obj, mw, mh);
58 e_widget_sub_object_add(obj, o);
59 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
60 e_widget_resize_object_set(obj, o);
61 evas_object_intercept_resize_callback_add(o, _e_wid_resize, wd);
62 evas_object_intercept_move_callback_add(o, _e_wid_move, wd);
64 o = e_spectrum_add(evas);
65 e_spectrum_color_value_set(o, cv);
66 e_spectrum_mode_set(o, mode);
67 e_widget_sub_object_add(obj, o);
70 edje_object_part_swallow(wd->o_edje, "e.swallow.content", o);
71 edje_extern_object_min_size_set(o, 100, 100);
73 o = evas_object_rectangle_add(evas);
74 evas_object_color_set(o, 0, 0, 0, 0);
75 e_widget_sub_object_add(obj, o);
77 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_cb_down, obj);
78 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_wid_cb_move, obj);
79 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_wid_cb_up, obj);
82 e_widget_spectrum_update(obj, 0);
88 e_widget_spectrum_update(Evas_Object *obj, int redraw)
91 double vx = 0, vy = 0;
93 wd = e_widget_data_get(obj);
96 e_spectrum_update(wd->o_spectrum);
100 case E_COLOR_COMPONENT_R:
101 vy = wd->cv->g / 255.0;
102 vx = wd->cv->b / 255.0;
104 case E_COLOR_COMPONENT_G:
105 vy = wd->cv->b / 255.0;
106 vx = wd->cv->r / 255.0;
108 case E_COLOR_COMPONENT_B:
109 vy = wd->cv->r / 255.0;
110 vx = wd->cv->g / 255.0;
112 case E_COLOR_COMPONENT_H:
116 case E_COLOR_COMPONENT_S:
118 vx = wd->cv->h / 360.0;
120 case E_COLOR_COMPONENT_V:
121 vy = wd->cv->h / 360.0;
124 case E_COLOR_COMPONENT_MAX:
127 edje_object_part_drag_value_set(wd->o_edje, "cursor", vx, vy);
131 e_widget_spectrum_mode_set(Evas_Object *obj, E_Color_Component mode)
135 wd = e_widget_data_get(obj);
136 if (wd->mode == mode) return;
138 e_spectrum_mode_set(wd->o_spectrum, mode);
139 e_widget_spectrum_update(obj, 0);
143 _e_wid_move(void *data, Evas_Object *o __UNUSED__, Evas_Coord x, Evas_Coord y)
148 evas_object_move(wd->o_edje, x, y);
149 evas_object_move(wd->o_event, x, y);
153 _e_wid_resize(void *data, Evas_Object *o __UNUSED__, Evas_Coord w, Evas_Coord h)
158 evas_object_resize(wd->o_edje, w, h);
159 evas_object_resize(wd->o_event, w, h);
164 _e_wid_del_hook(Evas_Object *obj)
168 wd = e_widget_data_get(obj);
173 _e_wid_focus_hook(Evas_Object *obj)
177 wd = e_widget_data_get(obj);
178 if (e_widget_focus_get(obj))
180 edje_object_signal_emit(wd->o_edje, "e,state,focused", "e");
181 evas_object_focus_set(wd->o_edje, 1);
185 edje_object_signal_emit(wd->o_edje, "e,state,unfocused", "e");
186 evas_object_focus_set(wd->o_edje, 0);
191 _e_wid_disable_hook(Evas_Object *obj)
195 wd = e_widget_data_get(obj);
196 if (e_widget_disabled_get(obj))
197 edje_object_signal_emit(wd->o_spectrum, "e,state,disabled", "e");
199 edje_object_signal_emit(wd->o_spectrum, "e,state,enabled", "e");
203 _e_wid_focus_steal(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
205 e_widget_focus_steal(data);
209 _e_wid_mouse_handle(Evas_Object *obj, int mx, int my)
212 Evas_Coord x, y, w, h;
215 wd = e_widget_data_get(obj);
217 evas_object_geometry_get(wd->o_spectrum, &x, &y, &w, &h);
218 vx = (mx - x) / (double)w;
219 vy = (my - y) / (double)h;
225 edje_object_part_drag_value_set(wd->o_edje, "e.dragable.cursor", vx, vy);
229 case E_COLOR_COMPONENT_R:
230 wd->cv->g = vy * 255;
231 wd->cv->b = vx * 255;
232 e_color_update_rgb(wd->cv);
234 case E_COLOR_COMPONENT_G:
235 wd->cv->b = vy * 255;
236 wd->cv->r = vx * 255;
237 e_color_update_rgb(wd->cv);
239 case E_COLOR_COMPONENT_B:
240 wd->cv->r = vy * 255;
241 wd->cv->g = vx * 255;
242 e_color_update_rgb(wd->cv);
244 case E_COLOR_COMPONENT_H:
247 e_color_update_hsv(wd->cv);
249 case E_COLOR_COMPONENT_S:
251 wd->cv->h = vx * 360;
252 e_color_update_hsv(wd->cv);
254 case E_COLOR_COMPONENT_V:
255 wd->cv->h = vy * 360;
257 e_color_update_hsv(wd->cv);
259 case E_COLOR_COMPONENT_MAX:
262 e_widget_change(obj);
267 _e_wid_cb_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
269 Evas_Event_Mouse_Down *ev;
274 wd = e_widget_data_get(o_wid);
278 _e_wid_mouse_handle(o_wid, ev->canvas.x, ev->canvas.y);
282 _e_wid_cb_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
288 wd = e_widget_data_get(o_wid);
293 _e_wid_cb_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
295 Evas_Event_Mouse_Move *ev;
300 wd = e_widget_data_get(o_wid);
303 if (wd->dragging == 1)
305 _e_wid_mouse_handle(o_wid, ev->cur.canvas.x, ev->cur.canvas.y);