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