[E_BORDER] Add missing code to delete timer when the window gets DEICONIFY_APPROVE...
[platform/core/uifw/e17.git] / src / bin / e_widget_spectrum.c
1 #include "e.h"
2
3 typedef struct _E_Widget_Data E_Widget_Data;
4
5 struct _E_Widget_Data
6 {
7    Evas_Object *o_edje;
8    Evas_Object *o_spectrum;
9    Evas_Object *o_event;
10
11    E_Color *cv;
12    E_Color_Component mode;
13
14    int dragging;
15 };
16
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);
21
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);
24
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);
29
30 Evas_Object *
31 e_widget_spectrum_add(Evas *evas, E_Color_Component mode, E_Color *cv)
32 {
33    Evas_Object *obj, *o;
34    E_Widget_Data *wd;
35    Evas_Coord mw, mh;
36
37    obj = e_widget_add(evas);
38
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);
42
43    wd = calloc(1, sizeof(E_Widget_Data));
44    e_widget_data_set(obj, wd);
45
46    wd->cv = cv;
47    wd->mode = mode;
48
49    o = edje_object_add(evas);
50    wd->o_edje = o;
51    e_theme_edje_object_set(o, "base/theme/widgets",
52                            "e/widgets/spectrum");
53
54    evas_object_show(o);
55    edje_object_size_min_calc(o, &mw, &mh);
56    e_widget_size_min_set(obj, mw, mh);
57
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);
63
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);
68    evas_object_show(o);
69    wd->o_spectrum = o;
70    edje_object_part_swallow(wd->o_edje, "e.swallow.content", o);
71    edje_extern_object_min_size_set(o, 100, 100);
72
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);
76    evas_object_show(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);
80    wd->o_event = o;
81
82    e_widget_spectrum_update(obj, 0);
83
84    return obj;
85 }
86
87 void
88 e_widget_spectrum_update(Evas_Object *obj, int redraw)
89 {
90    E_Widget_Data *wd;
91    double vx = 0, vy = 0;
92
93    wd = e_widget_data_get(obj);
94    /* redraw spectrum */
95    if (redraw)
96      e_spectrum_update(wd->o_spectrum);
97
98    switch (wd->mode)
99      {
100       case E_COLOR_COMPONENT_R:
101          vy = wd->cv->g / 255.0;
102          vx = wd->cv->b / 255.0;
103          break;
104       case E_COLOR_COMPONENT_G:
105          vy = wd->cv->b / 255.0;
106          vx = wd->cv->r / 255.0;
107          break;
108       case E_COLOR_COMPONENT_B:
109          vy = wd->cv->r / 255.0;
110          vx = wd->cv->g / 255.0;
111          break;
112       case E_COLOR_COMPONENT_H:
113          vy = wd->cv->s;
114          vx = wd->cv->v;
115          break;
116       case E_COLOR_COMPONENT_S:
117          vy = wd->cv->v;
118          vx = wd->cv->h / 360.0;
119          break;
120       case E_COLOR_COMPONENT_V:
121          vy = wd->cv->h / 360.0;
122          vx = wd->cv->s;
123          break;
124      case E_COLOR_COMPONENT_MAX:
125         break;
126      }
127    edje_object_part_drag_value_set(wd->o_edje, "cursor", vx, vy);
128 }
129
130 void
131 e_widget_spectrum_mode_set(Evas_Object *obj, E_Color_Component mode)
132 {
133    E_Widget_Data *wd;
134
135    wd = e_widget_data_get(obj);
136    if (wd->mode == mode) return;
137    wd->mode = mode;
138    e_spectrum_mode_set(wd->o_spectrum, mode);
139    e_widget_spectrum_update(obj, 0);
140 }
141
142 static void
143 _e_wid_move(void *data, Evas_Object *o __UNUSED__, Evas_Coord x, Evas_Coord y)
144 {
145    E_Widget_Data *wd;
146
147    wd = data;
148    evas_object_move(wd->o_edje, x, y);
149    evas_object_move(wd->o_event, x, y);
150 }
151
152 static void
153 _e_wid_resize(void *data, Evas_Object *o __UNUSED__, Evas_Coord w, Evas_Coord h)
154 {
155    E_Widget_Data *wd;
156
157    wd = data;
158    evas_object_resize(wd->o_edje, w, h);
159    evas_object_resize(wd->o_event, w, h);
160 }
161
162
163 static void
164 _e_wid_del_hook(Evas_Object *obj)
165 {
166    E_Widget_Data *wd;
167
168    wd = e_widget_data_get(obj);
169    free(wd);
170 }
171
172 static void
173 _e_wid_focus_hook(Evas_Object *obj)
174 {
175    E_Widget_Data *wd;
176
177    wd = e_widget_data_get(obj);
178    if (e_widget_focus_get(obj))
179      {
180         edje_object_signal_emit(wd->o_edje, "e,state,focused", "e");
181         evas_object_focus_set(wd->o_edje, 1);
182      }
183    else
184      {
185         edje_object_signal_emit(wd->o_edje, "e,state,unfocused", "e");
186         evas_object_focus_set(wd->o_edje, 0);
187      }
188 }
189
190 static void
191 _e_wid_disable_hook(Evas_Object *obj)
192 {
193    E_Widget_Data *wd;
194
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");
198    else
199      edje_object_signal_emit(wd->o_spectrum, "e,state,enabled", "e");
200 }
201
202 static void
203 _e_wid_focus_steal(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
204 {
205    e_widget_focus_steal(data);
206 }
207
208 static void
209 _e_wid_mouse_handle(Evas_Object *obj, int mx, int my)
210 {
211    E_Widget_Data *wd;
212    Evas_Coord x, y, w, h;
213    double vx, vy;
214
215    wd = e_widget_data_get(obj);
216
217    evas_object_geometry_get(wd->o_spectrum, &x, &y, &w, &h);
218    vx = (mx - x) / (double)w;
219    vy = (my - y) / (double)h;
220    if (vx > 1) vx = 1;
221    if (vx < 0) vx = 0;
222    if (vy > 1) vy = 1;
223    if (vy < 0) vy = 0;
224
225    edje_object_part_drag_value_set(wd->o_edje, "e.dragable.cursor", vx, vy);
226
227    switch (wd->mode)
228      {
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);
233          break;
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);
238          break;
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);
243          break;
244       case E_COLOR_COMPONENT_H:
245          wd->cv->s = vy;
246          wd->cv->v = vx;
247          e_color_update_hsv(wd->cv);
248          break;
249       case E_COLOR_COMPONENT_S:
250          wd->cv->v = vy;
251          wd->cv->h = vx * 360;
252          e_color_update_hsv(wd->cv);
253          break;
254       case E_COLOR_COMPONENT_V:
255          wd->cv->h = vy * 360;
256          wd->cv->s = vx;
257          e_color_update_hsv(wd->cv);
258          break;
259       case E_COLOR_COMPONENT_MAX:
260          break;
261      }
262    e_widget_change(obj);
263 }
264
265
266 static void
267 _e_wid_cb_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
268 {
269    Evas_Event_Mouse_Down *ev;
270    Evas_Object *o_wid;
271    E_Widget_Data *wd;
272
273    o_wid = data;
274    wd = e_widget_data_get(o_wid);
275    ev = event_info;
276
277    wd->dragging = 1;
278    _e_wid_mouse_handle(o_wid, ev->canvas.x, ev->canvas.y);
279 }
280
281 static void
282 _e_wid_cb_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
283 {
284    Evas_Object *o_wid;
285    E_Widget_Data *wd;
286
287    o_wid = data;
288    wd = e_widget_data_get(o_wid);
289    wd->dragging = 0;
290 }
291
292 static void
293 _e_wid_cb_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
294 {
295    Evas_Event_Mouse_Move *ev;
296    Evas_Object *o_wid;
297    E_Widget_Data *wd;
298
299    o_wid = data;
300    wd = e_widget_data_get(o_wid);
301    ev = event_info;
302
303    if (wd->dragging == 1)
304      {
305         _e_wid_mouse_handle(o_wid, ev->cur.canvas.x, ev->cur.canvas.y);
306      }
307 }