f4f3bc7d07088e32882c81b35b4688785aaa66d7
[framework/uifw/e17.git] / src / modules / conf_display / e_int_config_desks.c
1 #include "e.h"
2
3 /* PROTOTYPES - same all the time */
4 static void *_create_data(E_Config_Dialog *cfd);
5 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
6 static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
7 static int _basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
8 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
9 static void _cb_slider_change(void *data, Evas_Object *obj);
10 static void _cb_disable_flip_anim(void *data, Evas_Object *obj);
11
12 /* Actual config data we will be playing with whil the dialog is active */
13 struct _E_Config_Dialog_Data
14 {
15    /*- BASIC -*/
16    int x;
17    int y;
18    int edge_flip_dragging;
19    int flip_wrap;
20    int flip_mode;
21    int flip_interp;
22    int flip_pan_bg;
23    double flip_speed;
24    double x_axis_pan;
25    double y_axis_pan;
26
27    /*- GUI -*/
28    Evas_Object *preview;
29    Eina_List *flip_anim_list;
30 };
31
32 /* a nice easy setup function that does the dirty work */
33 E_Config_Dialog *
34 e_int_config_desks(E_Container *con, const char *params __UNUSED__)
35 {
36    E_Config_Dialog *cfd;
37    E_Config_Dialog_View *v;
38    
39    if (e_config_dialog_find("E", "screen/virtual_desktops")) return NULL;
40    v = E_NEW(E_Config_Dialog_View, 1);
41    
42    /* methods */
43    v->create_cfdata = _create_data;
44    v->free_cfdata = _free_data;
45    v->basic.apply_cfdata = _basic_apply_data;
46    v->basic.create_widgets = _basic_create_widgets;
47    v->basic.check_changed = _basic_check_changed;
48    v->advanced.apply_cfdata = NULL;
49    v->advanced.create_widgets = NULL;
50    v->advanced.check_changed = NULL;
51    /* create config diaolg for NULL object/data */
52    cfd = e_config_dialog_new(con, _("Virtual Desktops Settings"),
53                              "E", "screen/virtual_desktops",
54                              "preferences-desktop", 0, v, NULL);
55    return cfd;
56 }
57
58 /**--CREATE--**/
59 static void
60 _fill_data(E_Config_Dialog_Data *cfdata)
61 {
62    cfdata->x = e_config->zone_desks_x_count;
63    cfdata->y = e_config->zone_desks_y_count;
64    cfdata->edge_flip_dragging = e_config->edge_flip_dragging;
65    cfdata->flip_wrap = e_config->desk_flip_wrap;
66    cfdata->flip_mode = e_config->desk_flip_animate_mode;
67    cfdata->flip_interp = e_config->desk_flip_animate_interpolation;
68    cfdata->flip_pan_bg = e_config->desk_flip_pan_bg;
69    cfdata->flip_speed = e_config->desk_flip_animate_time;
70    cfdata->x_axis_pan = e_config->desk_flip_pan_x_axis_factor;
71    cfdata->y_axis_pan = e_config->desk_flip_pan_y_axis_factor;
72 }
73
74 static void *
75 _create_data(E_Config_Dialog *cfd __UNUSED__)
76 {
77    E_Config_Dialog_Data *cfdata;
78
79    cfdata = E_NEW(E_Config_Dialog_Data, 1);
80    _fill_data(cfdata);
81    return cfdata;
82 }
83
84 static void
85 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
86 {
87    eina_list_free(cfdata->flip_anim_list);
88    E_FREE(cfdata);
89 }
90
91 /**--APPLY--**/
92
93 static int
94 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
95 {
96    /* Actually take our cfdata settings and apply them in real life */
97    const Eina_List *l, *ll, *lll;
98    E_Manager *man;
99    E_Container *con;
100    E_Zone *zone;
101
102    EINA_LIST_FOREACH(e_manager_list(), l, man)
103      EINA_LIST_FOREACH(man->containers, ll, con)
104        EINA_LIST_FOREACH(con->zones, lll, zone)
105          e_zone_desk_count_set(zone, cfdata->x, cfdata->y);
106
107    e_config->desk_flip_animate_mode = cfdata->flip_mode;
108    e_config->desk_flip_animate_interpolation = cfdata->flip_interp;
109    e_config->desk_flip_pan_bg = cfdata->flip_pan_bg;
110    e_config->desk_flip_animate_time = cfdata->flip_speed;
111    e_config->desk_flip_pan_x_axis_factor = cfdata->x_axis_pan;
112    e_config->desk_flip_pan_y_axis_factor = cfdata->y_axis_pan;
113    
114    e_config->edge_flip_dragging = cfdata->edge_flip_dragging;
115    e_config->desk_flip_wrap = cfdata->flip_wrap;
116
117    e_config_save_queue();
118    return 1; /* Apply was OK */
119 }
120
121 static int
122 _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
123 {
124    const Eina_List *l, *ll, *lll;
125    E_Manager *man;
126    E_Container *con;
127    E_Zone *zone;
128
129    EINA_LIST_FOREACH(e_manager_list(), l, man)
130      EINA_LIST_FOREACH(man->containers, ll, con)
131        EINA_LIST_FOREACH(con->zones, lll, zone)
132          {
133             int x, y;
134
135             e_zone_desk_count_get(zone, &x, &y);
136             if ((x != cfdata->x) || (y != cfdata->y))
137               return 1;
138          }
139
140    return ((e_config->desk_flip_animate_mode != cfdata->flip_mode) ||
141            (e_config->desk_flip_animate_interpolation != cfdata->flip_interp) ||
142            (e_config->desk_flip_pan_bg != cfdata->flip_pan_bg) ||
143            (e_config->desk_flip_animate_time != cfdata->flip_speed) ||
144            (e_config->desk_flip_pan_x_axis_factor != cfdata->x_axis_pan) ||
145            (e_config->desk_flip_pan_y_axis_factor != cfdata->y_axis_pan) ||
146            (e_config->edge_flip_dragging != cfdata->edge_flip_dragging) ||
147            (e_config->desk_flip_wrap != cfdata->flip_wrap));
148 }
149
150 /**--GUI--**/
151 static Evas_Object *
152 _basic_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
153 {
154    /* generate the core widget layout for a basic dialog */
155    Evas_Object *o, *ob, *of, *otb;
156    E_Radio_Group *rg;
157
158    otb = e_widget_toolbook_add(evas, (48 * e_scale), (48 * e_scale));
159    
160    o = e_widget_list_add(evas, 0, 0);
161
162    of = e_widget_frametable_add(evas, _("Number of Desktops"), 0);
163    e_widget_frametable_content_align_set(of, 0.5, 0.0);
164
165    ob = e_widget_deskpreview_add(evas, cfdata->x, cfdata->y);
166    e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
167    cfdata->preview = ob;
168
169    ob = e_widget_slider_add(evas, 0, 0, _("%1.0f"), 1.0, 12.0, 1.0, 0, NULL, 
170                             &(cfdata->y), 150);
171    e_widget_on_change_hook_set(ob, _cb_slider_change, cfdata);
172    e_widget_frametable_object_append(of, ob, 1, 0, 1, 1, 1, 1, 0, 1);
173
174    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f"), 1.0, 12.0, 1.0, 0, NULL, 
175                             &(cfdata->x), 200);
176    e_widget_on_change_hook_set(ob, _cb_slider_change, cfdata);
177    e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 0);
178
179    e_widget_list_object_append(o, of, 1, 1, 0.5);
180
181    of = e_widget_framelist_add(evas, _("Desktop Flip"), 0);
182    ob = e_widget_check_add(evas, _("Flip when dragging objects to the screen edge"), 
183                            &(cfdata->edge_flip_dragging));
184    e_widget_framelist_object_append(of, ob);
185    ob = e_widget_check_add(evas, _("Wrap desktops around when flipping"), 
186                            &(cfdata->flip_wrap));
187    e_widget_framelist_object_append(of, ob);
188
189    e_widget_list_object_append(o, of, 1, 0, 0.5);
190    
191    e_widget_toolbook_page_append(otb, NULL, _("Desktops"), o, 1, 1, 1, 1, 
192                                  0.5, 0.0);
193
194    o = e_widget_list_add(evas, 0, 0);
195    rg = e_widget_radio_group_new(&(cfdata->flip_mode));
196    ob = e_widget_radio_add(evas, _("Off"), 0, rg);
197    e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata);
198    e_widget_list_object_append(o, ob, 1, 0, 0.5);
199    ob = e_widget_radio_add(evas, _("Pane"), 1, rg);
200    e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata);
201    e_widget_list_object_append(o, ob, 1, 0, 0.5);
202    ob = e_widget_radio_add(evas, _("Zoom"), 2, rg);
203    e_widget_on_change_hook_set(ob, _cb_disable_flip_anim, cfdata);
204    e_widget_list_object_append(o, ob, 1, 0, 0.5);
205
206    ob = e_widget_check_add(evas, _("Background panning"), 
207                            &(cfdata->flip_pan_bg));
208    e_widget_disabled_set(ob, !cfdata->flip_mode);
209    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
210    e_widget_list_object_append(o, ob, 1, 0, 0.5);
211
212    ob = e_widget_label_add(evas, _("Animation speed"));
213    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
214    e_widget_list_object_append(o, ob, 1, 0, 0.5);
215    ob = e_widget_slider_add(evas, 1, 0, _("%1.1f sec"), 0, 5, 0.05, 0, 
216                             &(cfdata->flip_speed), NULL, 150);
217    e_widget_disabled_set(ob, !cfdata->flip_mode);
218    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
219    e_widget_list_object_append(o, ob, 1, 0, 0.5);
220
221    ob = e_widget_label_add(evas, _("X-Axis pan factor"));
222    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
223    e_widget_list_object_append(o, ob, 1, 0, 0.5);
224    ob = e_widget_slider_add(evas, 1, 0, _("%.2f"), 0, 1, 0.01, 0, 
225                             &(cfdata->x_axis_pan), NULL, 150);
226    e_widget_disabled_set(ob, !cfdata->flip_mode);
227    e_widget_list_object_append(o, ob, 1, 0, 0.5);
228    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
229
230    ob = e_widget_label_add(evas, _("Y-Axis pan factor"));
231    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
232    e_widget_list_object_append(o, ob, 1, 0, 0.5);
233    ob = e_widget_slider_add(evas, 1, 0, _("%.2f"), 0, 1, 0.01, 0, 
234                             &(cfdata->y_axis_pan), NULL, 150);
235    e_widget_disabled_set(ob, !cfdata->flip_mode);
236    e_widget_list_object_append(o, ob, 1, 0, 0.5);
237    cfdata->flip_anim_list = eina_list_append(cfdata->flip_anim_list, ob);
238
239    e_widget_toolbook_page_append(otb, NULL, _("Flip Animation"), o, 
240                                  1, 0, 1, 0, 0.5, 0.0);
241
242    e_widget_toolbook_page_show(otb, 0);
243
244    return otb;
245 }
246
247 static void
248 _cb_slider_change(void *data, Evas_Object *obj __UNUSED__)
249 {
250    E_Config_Dialog_Data *cfdata = data;
251
252    e_widget_deskpreview_num_desks_set(cfdata->preview, cfdata->x, cfdata->y);
253 }
254
255 static void
256 _cb_disable_flip_anim(void *data, Evas_Object *obj __UNUSED__)
257 {
258    E_Config_Dialog_Data *cfdata = (E_Config_Dialog_Data*) data;
259    Eina_List *list = cfdata->flip_anim_list;
260    Eina_List *l;
261    Evas_Object *o;
262
263    EINA_LIST_FOREACH(list, l, o)
264      e_widget_disabled_set(o, !cfdata->flip_mode);
265 }