Tizen 2.1 release
[platform/core/uifw/e17.git] / src / modules / conf_theme / e_int_config_transitions.c
1 #include "e.h"
2
3 static Evas_Object *_trans_preview_add(E_Config_Dialog_Data *cfdata, Evas *evas, int minw, int minh);
4 static void         _e_wid_done(void *data, Evas_Object *obj, const char *emission, const char *source);
5 static void         _trans_preview_trans_set(E_Config_Dialog_Data *cfdata, const char *trans);
6
7 static void        *_create_data(E_Config_Dialog *cfd);
8 static void         _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
9 static int          _basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
10 static int          _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
11 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
12
13 static void         _event_cb_changed(void *data);
14 static void         _trans_cb_changed(void *data);
15
16 struct _E_Config_Dialog_Data
17 {
18    char        *transition_start;
19    char        *transition_desk;
20    char        *transition_change;
21
22    Evas_Object *event_list;
23    Evas_Object *trans_list;
24    Evas_Object *tp;
25    Evas_Object *o_trans;
26    Evas_Object *o_prev_bg;
27    Evas_Object *o_bg;
28 };
29
30 E_Config_Dialog *
31 e_int_config_transitions(E_Container *con, const char *params __UNUSED__)
32 {
33    E_Config_Dialog *cfd;
34    E_Config_Dialog_View *v;
35
36    if (e_config_dialog_find("E", "appearance/transitions")) return NULL;
37    v = E_NEW(E_Config_Dialog_View, 1);
38    if (!v) return NULL;
39
40    v->create_cfdata = _create_data;
41    v->free_cfdata = _free_data;
42    v->basic.apply_cfdata = _basic_apply_data;
43    v->basic.create_widgets = _basic_create_widgets;
44    v->basic.check_changed = _basic_check_changed;
45
46    cfd = e_config_dialog_new(con, _("Transition Settings"),
47                              "E", "appearance/transitions",
48                              "preferences-transitions", 0, v, NULL);
49    return cfd;
50 }
51
52 static void
53 _fill_data(E_Config_Dialog_Data *cfdata)
54 {
55    if (e_config->transition_start)
56      cfdata->transition_start = strdup(e_config->transition_start);
57    if (e_config->transition_desk)
58      cfdata->transition_desk = strdup(e_config->transition_desk);
59    if (e_config->transition_change)
60      cfdata->transition_change = strdup(e_config->transition_change);
61 }
62
63 static void *
64 _create_data(E_Config_Dialog *cfd __UNUSED__)
65 {
66    E_Config_Dialog_Data *cfdata;
67
68    cfdata = E_NEW(E_Config_Dialog_Data, 1);
69    _fill_data(cfdata);
70    return cfdata;
71 }
72
73 static void
74 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
75 {
76    E_FREE(cfdata->transition_start);
77    E_FREE(cfdata->transition_desk);
78    E_FREE(cfdata->transition_change);
79    E_FREE(cfdata);
80 }
81
82 static int
83 _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
84 {
85    return (!cfdata->transition_start && e_config->transition_start) ||
86           (cfdata->transition_start && !e_config->transition_start) ||
87           (!cfdata->transition_desk && e_config->transition_desk) ||
88           (cfdata->transition_desk && !e_config->transition_desk) ||
89           (!cfdata->transition_change && e_config->transition_change) ||
90           (cfdata->transition_change && !e_config->transition_change) ||
91           (cfdata->transition_start && e_config->transition_start &&
92            strcmp(cfdata->transition_start, e_config->transition_start)) ||
93           (cfdata->transition_desk && e_config->transition_desk &&
94            strcmp(cfdata->transition_desk, e_config->transition_desk)) ||
95           (cfdata->transition_change && e_config->transition_change &&
96            strcmp(cfdata->transition_change, e_config->transition_change));
97 }
98
99 static int
100 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
101 {
102    Eina_List *trans = NULL;
103    const char *str;
104
105    trans = e_theme_transition_list();
106
107    if (e_config->transition_start)
108      eina_stringshare_del(e_config->transition_start);
109    e_config->transition_start = NULL;
110    if (cfdata->transition_start)
111      {
112         if (eina_list_search_sorted(trans, EINA_COMPARE_CB(strcmp),
113                                     cfdata->transition_start))
114           {
115              e_config->transition_start =
116                eina_stringshare_add(cfdata->transition_start);
117           }
118         /* if (e_theme_transition_find(cfdata->transition_start))  */
119         /*   e_config->transition_start =  */
120         /*   eina_stringshare_add(cfdata->transition_start); */
121      }
122
123    if (e_config->transition_desk)
124      eina_stringshare_del(e_config->transition_desk);
125    e_config->transition_desk = NULL;
126    if (cfdata->transition_desk)
127      {
128         if (eina_list_search_sorted(trans, EINA_COMPARE_CB(strcmp),
129                                     cfdata->transition_desk))
130           {
131              e_config->transition_desk =
132                eina_stringshare_add(cfdata->transition_desk);
133           }
134         /* if (e_theme_transition_find(cfdata->transition_desk))  */
135         /*   e_config->transition_desk = eina_stringshare_add(cfdata->transition_desk); */
136      }
137
138    if (e_config->transition_change)
139      eina_stringshare_del(e_config->transition_change);
140    e_config->transition_change = NULL;
141    if (cfdata->transition_change)
142      {
143         if (eina_list_search_sorted(trans, EINA_COMPARE_CB(strcmp),
144                                     cfdata->transition_change))
145           {
146              e_config->transition_change =
147                eina_stringshare_add(cfdata->transition_change);
148           }
149         /* if (e_theme_transition_find(cfdata->transition_change))  */
150         /*   e_config->transition_change = eina_stringshare_add(cfdata->transition_change); */
151      }
152
153    e_config_save_queue();
154
155    EINA_LIST_FREE(trans, str)
156      eina_stringshare_del(str);
157
158    return 1;
159 }
160
161 static Evas_Object *
162 _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
163 {
164    E_Zone *zone;
165    Evas_Object *o, *of, *il;
166    Eina_List *l;
167    char *t;
168
169    zone = e_zone_current_get(cfd->con);
170
171    o = e_widget_table_add(evas, 0);
172
173    of = e_widget_framelist_add(evas, _("Events"), 0);
174    il = e_widget_ilist_add(evas, 48, 48, NULL);
175    cfdata->event_list = il;
176    e_widget_size_min_set(il, 140, 128);
177
178    evas_event_freeze(evas_object_evas_get(il));
179    edje_freeze();
180    e_widget_ilist_freeze(il);
181    e_widget_ilist_append(il, NULL, _("Startup"), _event_cb_changed, cfdata, NULL);
182    e_widget_ilist_append(il, NULL, _("Desk Change"), _event_cb_changed, cfdata, NULL);
183    e_widget_ilist_append(il, NULL, _("Background Change"), _event_cb_changed, cfdata, NULL);
184    e_widget_ilist_go(il);
185    e_widget_ilist_thaw(il);
186    edje_thaw();
187    evas_event_thaw(evas_object_evas_get(il));
188    e_widget_framelist_object_append(of, il);
189    e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 0);
190
191    of = e_widget_framelist_add(evas, _("Transitions"), 0);
192    il = e_widget_ilist_add(evas, 48, 48, NULL);
193    cfdata->trans_list = il;
194    e_widget_size_min_set(il, 100, 128);
195
196    evas_event_freeze(evas_object_evas_get(il));
197    edje_freeze();
198    e_widget_ilist_freeze(il);
199    e_widget_ilist_append(il, NULL, _("None"), _trans_cb_changed, cfdata, NULL);
200
201    for (l = e_theme_transition_list(); l; l = l->next)
202      {
203         t = l->data;
204         if (!t) continue;
205         e_widget_ilist_append(il, NULL, t, _trans_cb_changed, cfdata, NULL);
206      }
207
208    EINA_LIST_FREE(l, t)
209      eina_stringshare_del(t);
210
211    e_widget_ilist_go(il);
212    e_widget_ilist_thaw(il);
213    edje_thaw();
214    evas_event_thaw(evas_object_evas_get(il));
215    e_widget_framelist_object_append(of, il);
216    e_widget_table_object_append(o, of, 1, 0, 1, 1, 1, 1, 1, 0);
217
218    of = e_widget_framelist_add(evas, _("Preview"), 0);
219    il = _trans_preview_add(cfdata, evas, 200, ((200 * zone->h) / zone->w));
220    e_widget_framelist_object_append(of, il);
221    e_widget_table_object_append(o, of, 0, 1, 2, 1, 1, 1, 1, 1);
222
223    e_dialog_resizable_set(cfd->dia, 1);
224
225    return o;
226 }
227
228 static void
229 _event_cb_changed(void *data)
230 {
231    E_Config_Dialog_Data *cfdata;
232    const char *list, *trans = NULL;
233    int sel, i;
234
235    cfdata = data;
236    sel = e_widget_ilist_selected_get(cfdata->event_list);
237    switch (sel)
238      {
239       case 0:
240         trans = e_config->transition_start;
241         break;
242
243       case 1:
244         trans = e_config->transition_desk;
245         break;
246
247       case 2:
248         trans = e_config->transition_change;
249         break;
250      }
251
252    for (i = 0; i < e_widget_ilist_count(cfdata->trans_list); i++)
253      {
254         list = e_widget_ilist_nth_label_get(cfdata->trans_list, i);
255         if (!list) continue;
256         if (!trans)
257           {
258              if (!strcmp(_("None"), list))
259                {
260                   e_widget_ilist_selected_set(cfdata->trans_list, i);
261                   return;
262                }
263           }
264         else
265           {
266              if (!strcmp(trans, list))
267                {
268                   e_widget_ilist_selected_set(cfdata->trans_list, i);
269                   return;
270                }
271           }
272      }
273
274    e_widget_ilist_unselect(cfdata->trans_list);
275 }
276
277 static void
278 _trans_cb_changed(void *data)
279 {
280    E_Config_Dialog_Data *cfdata;
281    const char *t;
282    int sel;
283
284    cfdata = data;
285    sel = e_widget_ilist_selected_get(cfdata->event_list);
286
287    t = e_widget_ilist_selected_label_get(cfdata->trans_list);
288    if (!t) return;
289
290    if (!strcmp(t, _("None"))) t = NULL;
291    switch (sel)
292      {
293       case 0:
294         E_FREE(cfdata->transition_start);
295         if (t) cfdata->transition_start = strdup(t);
296         break;
297
298       case 1:
299         E_FREE(cfdata->transition_desk);
300         if (t) cfdata->transition_desk = strdup(t);
301         break;
302
303       case 2:
304         E_FREE(cfdata->transition_change);
305         if (t) cfdata->transition_change = strdup(t);
306         break;
307
308       default:
309         break;
310      }
311    if (!t) return;
312    _trans_preview_trans_set(cfdata, t);
313 }
314
315 Evas_Object *
316 _trans_preview_add(E_Config_Dialog_Data *cfdata, Evas *evas, int minw, int minh)
317 {
318    Evas_Object *obj, *o, *oa;
319
320    oa = e_widget_aspect_add(evas, minw, minh);
321    obj = e_widget_preview_add(evas, minw, minh);
322    e_widget_aspect_child_set(oa, obj);
323
324    o = edje_object_add(e_widget_preview_evas_get(obj));
325    cfdata->o_prev_bg = o;
326    e_theme_edje_object_set(o, "base/theme/widgets", "e/transpreview/1");
327    evas_object_show(o);
328    e_widget_preview_extern_object_set(obj, o);
329
330    cfdata->tp = obj;
331    return oa;
332 }
333
334 static void
335 _trans_preview_trans_set(E_Config_Dialog_Data *cfdata, const char *trans)
336 {
337    Evas_Object *o;
338    char buf[4096];
339
340    if (cfdata->o_trans)
341      evas_object_del(cfdata->o_trans);
342    if (cfdata->o_bg)
343      evas_object_del(cfdata->o_bg);
344    if (cfdata->o_prev_bg)
345      evas_object_del(cfdata->o_prev_bg);
346
347    cfdata->o_trans = NULL;
348    cfdata->o_bg = NULL;
349    cfdata->o_prev_bg = NULL;
350
351    snprintf(buf, sizeof(buf), "e/transitions/%s", trans);
352
353    o = edje_object_add(e_widget_preview_evas_get(cfdata->tp));
354    cfdata->o_trans = o;
355    e_theme_edje_object_set(cfdata->o_trans, "base/theme/transitions", buf);
356    edje_object_signal_callback_add(o, "e,state,done", "*", _e_wid_done, cfdata);
357    evas_object_show(o);
358    e_widget_preview_extern_object_set(cfdata->tp, o);
359
360    o = edje_object_add(e_widget_preview_evas_get(cfdata->tp));
361    cfdata->o_bg = o;
362    e_theme_edje_object_set(o, "base/theme/widgets", "e/transpreview/0");
363    evas_object_show(o);
364
365    o = edje_object_add(e_widget_preview_evas_get(cfdata->tp));
366    cfdata->o_prev_bg = o;
367    e_theme_edje_object_set(o, "base/theme/widgets", "e/transpreview/1");
368    evas_object_show(o);
369
370    edje_object_part_swallow(cfdata->o_trans, "e.swallow.bg.old", cfdata->o_prev_bg);
371    edje_object_part_swallow(cfdata->o_trans, "e.swallow.bg.new", cfdata->o_bg);
372
373    edje_object_signal_emit(cfdata->o_trans, "e,action,start", "e");
374 }
375
376 static void
377 _e_wid_done(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
378 {
379    E_Config_Dialog_Data *cfdata;
380    Evas_Object *o;
381
382    cfdata = data;
383
384    if (cfdata->o_trans)
385      evas_object_del(cfdata->o_trans);
386    if (cfdata->o_bg)
387      evas_object_del(cfdata->o_bg);
388    if (cfdata->o_prev_bg)
389      evas_object_del(cfdata->o_prev_bg);
390
391    cfdata->o_trans = NULL;
392    cfdata->o_bg = NULL;
393    cfdata->o_prev_bg = NULL;
394
395    o = edje_object_add(e_widget_preview_evas_get(cfdata->tp));
396    cfdata->o_prev_bg = o;
397    e_theme_edje_object_set(o, "base/theme/widgets", "e/transpreview/1");
398    evas_object_show(o);
399    e_widget_preview_extern_object_set(cfdata->tp, o);
400 }
401