e_entry -> elm_entry conversion
[platform/upstream/enlightenment.git] / src / bin / e_widget_csel.c
1 #include "e.h"
2
3 typedef struct _E_Widget_Data E_Widget_Data;
4 struct _E_Widget_Data
5 {
6    Evas_Object *obj;
7    Eina_List   *sliders;
8    Eina_List   *entries;
9    Evas_Object *spectrum, *vert, *well;
10    E_Color     *cv;
11    char       **values;
12    int          mode;
13    int          changing;
14 };
15
16 static void
17 _e_wid_del_hook(Evas_Object *obj)
18 {
19    E_Widget_Data *wd;
20    int i = 0;
21
22    wd = e_widget_data_get(obj);
23    if (!wd) return;
24
25    for (i = 0; i < E_COLOR_COMPONENT_MAX; i++)
26      E_FREE(wd->values[i]);
27
28    E_FREE(wd->values);
29
30    eina_list_free(wd->sliders);
31    eina_list_free(wd->entries);
32
33    E_FREE(wd);
34 }
35
36 static void
37 _e_wid_cb_radio_changed(void *data, Evas_Object *o __UNUSED__)
38 {
39    E_Widget_Data *wd = data;
40
41    e_widget_spectrum_mode_set(wd->spectrum, wd->mode);
42    e_widget_cslider_mode_set(wd->vert, wd->mode);
43 }
44
45 static void
46 _e_wid_cb_color_changed(void *data, Evas_Object *o)
47 {
48    E_Widget_Data *wd = data;
49    Eina_List *l;
50    Evas_Object *eo, *so;
51    int changed = -1, i = 0;
52
53    if (wd->changing) return;
54
55    wd->changing = 1;
56
57    /* entry changed */
58    EINA_LIST_FOREACH(wd->entries, l, eo)
59      {
60         if (o == eo)
61           {
62              changed = i;
63              switch (i)
64                {
65                 case E_COLOR_COMPONENT_R:
66                   wd->cv->r = atoi(wd->values[i]);
67                   if (wd->cv->r > 255) wd->cv->r = 255;
68                   if (wd->cv->r < 0) wd->cv->r = 0;
69                   break;
70
71                 case E_COLOR_COMPONENT_G:
72                   wd->cv->g = atoi(wd->values[i]);
73                   if (wd->cv->g > 255) wd->cv->g = 255;
74                   if (wd->cv->g < 0) wd->cv->g = 0;
75                   break;
76
77                 case E_COLOR_COMPONENT_B:
78                   wd->cv->b = atoi(wd->values[i]);
79                   if (wd->cv->b > 255) wd->cv->b = 255;
80                   if (wd->cv->b < 0) wd->cv->b = 0;
81                   break;
82
83                 case E_COLOR_COMPONENT_H:
84                   wd->cv->h = atof(wd->values[i]);
85                   if (wd->cv->h > 360) wd->cv->h = 360;
86                   if (wd->cv->h < 0) wd->cv->h = 0;
87                   break;
88
89                 case E_COLOR_COMPONENT_S:
90                   wd->cv->s = atof(wd->values[i]);
91                   if (wd->cv->s > 1) wd->cv->s = 1;
92                   if (wd->cv->s < 0) wd->cv->s = 0;
93                   break;
94
95                 case E_COLOR_COMPONENT_V:
96                   wd->cv->v = atof(wd->values[i]);
97                   if (wd->cv->v > 1) wd->cv->v = 1;
98                   if (wd->cv->v < 0) wd->cv->v = 0;
99                   break;
100                }
101              break;
102           }
103         i++;
104      }
105
106    if (changed != -1)
107      {
108         if (changed >= E_COLOR_COMPONENT_H)
109           e_color_update_hsv(wd->cv);
110         else if (changed >= E_COLOR_COMPONENT_R)
111           e_color_update_rgb(wd->cv);
112      }
113
114    if (o == wd->vert)
115      changed = wd->mode;
116    else
117      e_widget_cslider_update(wd->vert);
118
119    /* update the sliders */
120    i = 0;
121    EINA_LIST_FOREACH(wd->sliders, l, so)
122      {
123         if (o != so)
124           e_widget_cslider_update(so);
125         else
126           changed = i;
127         i++;
128      }
129
130    /* update the spectrum */
131    if (o != wd->spectrum /* && changed != -1*/)
132      {
133         if (wd->mode == changed ||
134             (wd->mode >= E_COLOR_COMPONENT_H && changed <= E_COLOR_COMPONENT_B) ||
135             (wd->mode <= E_COLOR_COMPONENT_B && changed >= E_COLOR_COMPONENT_H))
136           e_widget_spectrum_update(wd->spectrum, 1);
137         else
138           e_widget_spectrum_update(wd->spectrum, 1);
139      }
140
141    e_widget_color_well_update(wd->well);
142
143    /* now update the text fields to show current values */
144    i = 0;
145    EINA_LIST_FOREACH(wd->entries, l, eo)
146      {
147         char buf[10];
148
149         if (o == eo) continue;
150         switch (i)
151           {
152            case E_COLOR_COMPONENT_R:
153              snprintf(buf, 10, "%i", wd->cv->r);
154              break;
155
156            case E_COLOR_COMPONENT_G:
157              snprintf(buf, 10, "%i", wd->cv->g);
158              break;
159
160            case E_COLOR_COMPONENT_B:
161              snprintf(buf, 10, "%i", wd->cv->b);
162              break;
163
164            case E_COLOR_COMPONENT_H:
165              snprintf(buf, 10, "%.0f", wd->cv->h);
166              break;
167
168            case E_COLOR_COMPONENT_S:
169              snprintf(buf, 10, "%.2f", wd->cv->s);
170              break;
171
172            case E_COLOR_COMPONENT_V:
173              snprintf(buf, 10, "%.2f", wd->cv->v);
174              break;
175
176            default:
177              break;
178           }
179         e_widget_entry_text_set(eo, buf);
180         i++;
181      }
182
183    wd->changing = 0;
184
185    e_widget_change(wd->obj);
186 }
187
188 static void
189 _e_wid_cb_alpha_changed(void *data, Evas_Object *o __UNUSED__)
190 {
191    _e_wid_cb_color_changed(data, NULL);
192 }
193
194 Evas_Object *
195 e_widget_csel_add(Evas *evas, E_Color *color, Eina_Bool alpha_enabled)
196 {
197    Evas_Object *obj, *o;
198    Evas_Object *frame, *table;
199    int i = 0;
200    E_Radio_Group *grp = NULL;
201    char *labels[6] = { N_("R"), N_("G"), N_("B"), N_("H"), N_("S"), N_("V") };
202    E_Widget_Data *wd;
203    Evas_Coord mw, mh;
204
205    obj = e_widget_add(evas);
206    e_widget_del_hook_set(obj, _e_wid_del_hook);
207
208    wd = calloc(1, sizeof(E_Widget_Data));
209    wd->mode = 1;
210    wd->cv = color;
211    wd->obj = obj;
212    e_widget_data_set(obj, wd);
213
214    table = e_widget_table_add(evas, 0);
215    e_widget_sub_object_add(obj, table);
216    e_widget_resize_object_set(obj, table);
217
218    frame = e_widget_table_add(evas, 0);
219    e_widget_sub_object_add(obj, frame);
220    grp = e_widget_radio_group_new(&wd->mode);
221
222    wd->values = calloc(E_COLOR_COMPONENT_MAX, sizeof(char *));
223
224    for (i = 0; i < E_COLOR_COMPONENT_MAX; i++)
225      {
226         wd->values[i] = calloc(10, sizeof(char));
227         switch (i)
228           {
229            case E_COLOR_COMPONENT_R:
230              snprintf(wd->values[i], 10, "%i", wd->cv->r);
231              break;
232
233            case E_COLOR_COMPONENT_G:
234              snprintf(wd->values[i], 10, "%i", wd->cv->g);
235              break;
236
237            case E_COLOR_COMPONENT_B:
238              snprintf(wd->values[i], 10, "%i", wd->cv->b);
239              break;
240
241            case E_COLOR_COMPONENT_H:
242              snprintf(wd->values[i], 10, "%.0f", wd->cv->h);
243              break;
244
245            case E_COLOR_COMPONENT_S:
246              snprintf(wd->values[i], 10, "%.2f", wd->cv->s);
247              break;
248
249            case E_COLOR_COMPONENT_V:
250              snprintf(wd->values[i], 10, "%.2f", wd->cv->v);
251              break;
252
253            default:
254              break;
255           }
256
257         o = e_widget_radio_add(evas, _(labels[i]), i, grp);
258         e_widget_sub_object_add(obj, o);
259         e_widget_on_change_hook_set(o, _e_wid_cb_radio_changed, wd);
260         e_widget_table_object_append(frame, o, 0, i, 1, 1, 1, 1, 0, 0);
261
262         o = e_widget_cslider_add(evas, i, wd->cv, 0, 0);
263         e_widget_sub_object_add(obj, o);
264         evas_object_show(o);
265         wd->sliders = eina_list_append(wd->sliders, o);
266         e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
267         e_widget_size_min_set(o, 32, 16);
268         e_widget_table_object_append(frame, o, 1, i, 6, 1, 1, 1, 1, 0);
269
270         o = e_widget_entry_add(e_win_evas_win_get(evas), &(wd->values[i]), NULL, NULL, NULL);
271         e_widget_sub_object_add(obj, o);
272         evas_object_show(o);
273         wd->entries = eina_list_append(wd->entries, o);
274         e_widget_table_object_append(frame, o, 7, i, 1, 1, 1, 1, 1, 0);
275         e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
276      }
277
278    if (alpha_enabled)
279      {
280         o = e_widget_label_add(evas, _("Alpha"));
281         e_widget_table_object_append(frame, o, 0, i, 1, 1, 1, 1, 0, 0);
282         o = e_widget_slider_add(evas, 1, 0, "%0.0f", 0, 255, 1, 0, NULL,
283                                 &(wd->cv->a), 100);
284         e_widget_on_change_hook_set(o, _e_wid_cb_alpha_changed, wd);
285         e_widget_table_object_append(frame, o, 1, i, 10, 1, 1, 1, 0, 0);
286      }
287
288    e_widget_table_object_append(table, frame, 2, 0, 1, 2, 1, 0, 1, 0);
289
290    o = e_widget_spectrum_add(evas, wd->mode, wd->cv);
291    e_widget_sub_object_add(obj, o);
292    evas_object_show(o);
293    e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
294    wd->spectrum = o;
295    e_widget_size_min_set(o, 120, 120);
296    e_widget_table_object_append(table, o, 0, 0, 1, 2, 1, 1, 1, 1);
297
298    o = e_widget_cslider_add(evas, wd->mode, wd->cv, 1, 1);
299    e_widget_sub_object_add(obj, o);
300    e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
301    e_widget_size_min_set(o, 16, 16);
302    evas_object_show(o);
303    wd->vert = o;
304    e_widget_table_object_append(table, o, 1, 0, 1, 2, 0, 1, 0, 1);
305
306    o = e_widget_color_well_add(evas, wd->cv, 0);
307    e_widget_sub_object_add(obj, o);
308    evas_object_show(o);
309    wd->well = o;
310    e_widget_size_min_set(o, 32, 32);
311    e_widget_table_object_append(table, o, 0, 2, 3, 1, 1, 1, 0, 0);
312
313    e_widget_size_min_get(table, &mw, &mh);
314    e_widget_size_min_set(obj, mw, mh);
315
316    return obj;
317 }
318