Tizen 2.1 release
[platform/core/uifw/e17.git] / src / modules / conf_theme / e_int_config_scale.c
1 #include "e.h"
2
3 /* local function prototypes */
4 static void        *_create_data(E_Config_Dialog *cfd);
5 static void         _fill_data(E_Config_Dialog_Data *cfdata);
6 static void         _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
7 static Evas_Object *_basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata);
8 static int          _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
9 static Evas_Object *_adv_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata);
10 static int          _adv_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
11 static int          _adv_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
12 static void         _adv_policy_changed(void *data, Evas_Object *obj __UNUSED__);
13
14 struct _E_Config_Dialog_Data
15 {
16    int    use_dpi;
17    double min, max, factor;
18    int    use_mode, base_dpi, use_custom;
19    struct
20    {
21       struct
22       {
23          Evas_Object *o_lbl, *o_slider;
24       } basic;
25       struct
26       {
27          Evas_Object *dpi_lbl, *dpi_slider;
28          Evas_Object *custom_slider;
29          Evas_Object *min_lbl, *min_slider;
30          Evas_Object *max_lbl, *max_slider;
31       } adv;
32    } gui;
33    Eina_List *obs;
34 };
35
36 static void
37 _scale_preview_sel_set(Evas_Object *ob, int sel)
38 {
39    Evas_Object *rc, *ob2;
40    double *sc, scl;
41    int v;
42    Eina_List *l;
43    E_Config_Dialog_Data *cfdata;
44    
45    cfdata = evas_object_data_get(ob, "cfdata");
46    rc = evas_object_data_get(ob, "rec");
47    if (sel)
48      {
49         evas_object_color_set(rc, 0, 0, 0, 0);
50         sc = evas_object_data_get(ob, "scalep");
51         v = (int)(unsigned long)evas_object_data_get(ob, "scale");
52         scl = (double)v / 1000.0;
53         if (sc) *sc = scl;
54         if (evas_object_data_get(ob, "dpi"))
55           {
56              cfdata->use_dpi = EINA_TRUE;
57              cfdata->use_mode = 1;
58              cfdata->use_custom = 0;
59              fprintf(stderr, "custom 0\n");
60           }
61         else
62           {
63              cfdata->use_dpi = EINA_FALSE;
64              cfdata->use_mode = 2;
65              cfdata->use_custom = 1;
66              fprintf(stderr, "custom 1\n");
67           }
68         EINA_LIST_FOREACH(cfdata->obs, l, ob2)
69           {
70              if (ob == ob2) continue;
71              _scale_preview_sel_set(ob2, 0);
72           }
73      }
74    else evas_object_color_set(rc, 0, 0, 0, 192);
75 }
76
77 static void
78 _scale_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
79 {
80    Evas_Object *ob = data;
81    
82    _scale_preview_sel_set(ob, 1);
83 }
84
85 static Evas_Object *
86 _scale_preview_new(E_Config_Dialog_Data *cfdata, Evas *e, double sc, double *scp, const char *tit, Eina_Bool dpi)
87 {
88    Evas_Object *ob, *bg, *cm, *bd, *wb, *rc;
89    const char *file;
90    char buf[64];
91    int v;
92    
93 #define SZW 110
94 #define SZH 80
95    ob = e_widget_preview_add(e, SZW, SZH);
96    e_widget_preview_vsize_set(ob, SZW, SZH);
97    
98    bg = edje_object_add(e_widget_preview_evas_get(ob));
99    file = e_bg_file_get(0, 0, 0, 0);
100    edje_object_file_set(bg, file, "e/desktop/background");
101    evas_object_move(bg, 0, 0);
102    evas_object_resize(bg, 640, 480);
103    evas_object_show(bg);
104    
105    cm = edje_object_add(e_widget_preview_evas_get(ob));
106    e_theme_edje_object_set(cm, "base/theme/borders", "e/comp/default");
107    evas_object_move(cm, 16, 16);
108    evas_object_resize(cm, 320, 400);
109    evas_object_show(cm);
110    
111    bd = edje_object_add(e_widget_preview_evas_get(ob));
112    e_theme_edje_object_set(bd, "base/theme/borders", "e/widgets/border/default/border");
113    edje_object_part_swallow(cm, "e.swallow.content", bd);
114    evas_object_show(bd);
115    
116    wb = edje_object_add(e_widget_preview_evas_get(ob));
117    e_theme_edje_object_set(wb, "base/theme/dialog", "e/widgets/dialog/main");
118    edje_object_part_swallow(bd, "e.swallow.client", wb);
119    evas_object_show(wb);
120    
121    rc = evas_object_rectangle_add(e_widget_preview_evas_get(ob));
122    evas_object_move(rc, 0, 0);
123    evas_object_resize(rc, 640, 480);
124    evas_object_color_set(rc, 0, 0, 0, 192);
125    evas_object_show(rc);
126
127    if (!tit)
128      {
129         snprintf(buf, sizeof(buf), "%1.1f %s", sc, _("Factor"));
130         edje_object_part_text_set(bd, "e.text.title", buf);
131      }
132    else
133      edje_object_part_text_set(bd, "e.text.title", tit);
134    edje_object_signal_emit(bd, "e,state,focused", "e");
135    
136    edje_object_signal_emit(cm, "e,state,visible,on", "e");
137    edje_object_signal_emit(cm, "e,state,shadow,on", "e");
138    edje_object_signal_emit(cm, "e,state,focus,on", "e");
139    
140    edje_object_scale_set(bd, sc);
141    edje_object_scale_set(cm, sc);
142    edje_object_scale_set(bg, sc);
143    edje_object_scale_set(wb, sc);
144    
145    evas_object_data_set(ob, "rec", rc);
146    v = sc * 1000;
147    evas_object_data_set(ob, "scale", (void *)(unsigned long)v);
148    evas_object_data_set(ob, "scalep", scp);
149    evas_object_data_set(ob, "dpi", (void *)(unsigned long)dpi);
150    evas_object_data_set(ob, "cfdata", cfdata);
151    
152    evas_object_event_callback_add(rc,
153                                   EVAS_CALLBACK_MOUSE_DOWN,
154                                   _scale_down, ob);
155    cfdata->obs = eina_list_append(cfdata->obs, ob);
156    
157    return ob;
158 }
159
160 E_Config_Dialog *
161 e_int_config_scale(E_Container *con, const char *params __UNUSED__)
162 {
163    E_Config_Dialog *cfd;
164    E_Config_Dialog_View *v;
165
166    if (e_config_dialog_find("E", "appearance/scale")) return NULL;
167
168    v = E_NEW(E_Config_Dialog_View, 1);
169    v->create_cfdata = _create_data;
170    v->free_cfdata = _free_data;
171    v->basic.create_widgets = _basic_create;
172    v->basic.apply_cfdata = _basic_apply;
173    v->advanced.create_widgets = _adv_create;
174    v->advanced.apply_cfdata = _adv_apply;
175    v->advanced.check_changed = _adv_changed;
176
177    cfd = e_config_dialog_new(con, _("Scale Settings"), "E", "appearance/scale",
178                              "preferences-scale", 0, v, NULL);
179    e_config_dialog_changed_auto_set(cfd, 0);
180    e_config_dialog_changed_set(cfd, 1);
181    return cfd;
182 }
183
184 /* local function prototypes */
185 static void *
186 _create_data(E_Config_Dialog *cfd __UNUSED__)
187 {
188    E_Config_Dialog_Data *cfdata;
189
190    cfdata = E_NEW(E_Config_Dialog_Data, 1);
191    _fill_data(cfdata);
192    return cfdata;
193 }
194
195 static void
196 _fill_data(E_Config_Dialog_Data *cfdata)
197 {
198    cfdata->use_dpi = e_config->scale.use_dpi;
199    cfdata->use_custom = e_config->scale.use_custom;
200    cfdata->use_mode = 0;
201    if (cfdata->use_dpi) cfdata->use_mode = 1;
202    else if (cfdata->use_custom) cfdata->use_mode = 2;
203    cfdata->min = e_config->scale.min;
204    cfdata->max = e_config->scale.max;
205    cfdata->factor = e_config->scale.factor;
206    cfdata->base_dpi = e_config->scale.base_dpi;
207 }
208
209 static void
210 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
211 {
212    eina_list_free(cfdata->obs);
213    E_FREE(cfdata);
214 }
215
216 static Evas_Object *
217 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
218 {
219    Evas_Object *o, *ob;
220    double sc = 1.0;
221    int dpi, x = 0, y = 0;
222
223    o = e_widget_table_add(evas, 1);
224
225    dpi = ecore_x_dpi_get();
226    if ((dpi > 0) && (cfdata->base_dpi > 0))
227      sc = (double)dpi / (double)cfdata->base_dpi;
228    
229    ob = _scale_preview_new(cfdata, evas, sc, &(cfdata->factor), _("DPI Scaling"), EINA_TRUE);
230    e_widget_table_object_align_append(o, ob, 0, 0, 1, 1, 0, 0, 0, 0, 0.5, 0.5);
231    if (cfdata->use_dpi) _scale_preview_sel_set(ob, 1);
232    
233    x = 1;
234
235 #define COL 3   
236 #define SCALE_OP(v) do { \
237    ob = _scale_preview_new(cfdata, evas, v, &(cfdata->factor), NULL, EINA_FALSE); \
238    e_widget_table_object_align_append(o, ob, x, y, 1, 1, 0, 0, 0, 0, 0.5, 0.5); \
239    if ((cfdata->factor >= (v - 0.05)) && (cfdata->factor < v + 0.05)) \
240      _scale_preview_sel_set(ob, 1); \
241    x++; if (x >= COL) { x = 0; y++; } \
242 } while (0)
243
244    SCALE_OP(0.8);
245    SCALE_OP(1.0);
246    SCALE_OP(1.2);
247    SCALE_OP(1.5);
248    SCALE_OP(1.7);
249    SCALE_OP(1.9);
250    SCALE_OP(2.0);
251    SCALE_OP(2.2);
252    return o;
253 }
254
255 static int
256 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
257 {
258    E_Action *a;
259    
260    if (cfdata->use_dpi) cfdata->use_mode = 1;
261    else cfdata->use_mode = 0;
262
263    e_config->scale.use_dpi = cfdata->use_dpi;
264    e_config->scale.use_custom = cfdata->use_custom;
265    e_config->scale.min = cfdata->min;
266    e_config->scale.max = cfdata->max;
267    e_config->scale.factor = cfdata->factor;
268    e_config->scale.base_dpi = cfdata->base_dpi;
269
270    fprintf(stderr, "dpi: %i, custom: %i, min: %3.3f, max: %3.3f, sc: %3.3f: base: %i\n",
271            e_config->scale.use_dpi, e_config->scale.use_custom,
272            e_config->scale.min, e_config->scale.max, e_config->scale.factor,
273            e_config->scale.base_dpi);
274    
275    e_config_save_queue();
276
277    a = e_action_find("restart");
278    if ((a) && (a->func.go)) a->func.go(NULL, NULL);
279    
280    return 1;
281 }
282
283 static Evas_Object *
284 _adv_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
285 {
286    Evas_Object *o, *otb, *ow;
287    E_Radio_Group *rg;
288    char buff[256];
289
290    if (cfdata->obs) cfdata->obs = eina_list_free(cfdata->obs);
291    otb = e_widget_toolbook_add(evas, 24, 24);
292
293    /* Policy */
294    o = e_widget_list_add(evas, 0, 0);
295    rg = e_widget_radio_group_new(&(cfdata->use_mode));
296    ow = e_widget_radio_add(evas, _("Don't Scale"), 0, rg);
297    e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
298    e_widget_list_object_append(o, ow, 1, 1, 0.5);
299    ow = e_widget_radio_add(evas, _("Scale relative to screen DPI"), 1, rg);
300    e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
301    e_widget_list_object_append(o, ow, 1, 1, 0.5);
302
303    snprintf(buff, sizeof(buff),
304             _("Base DPI (Currently %i DPI)"), ecore_x_dpi_get());
305    ow = e_widget_label_add(evas, buff);
306    cfdata->gui.adv.dpi_lbl = ow;
307    e_widget_list_object_append(o, ow, 1, 1, 0.5);
308    ow = e_widget_slider_add(evas, 1, 0, _("%1.0f DPI"), 30, 600, 1, 0,
309                             NULL, &(cfdata->base_dpi), 100);
310    cfdata->gui.adv.dpi_slider = ow;
311    e_widget_list_object_append(o, ow, 1, 1, 0.5);
312    ow = e_widget_radio_add(evas, _("Custom scaling factor"), 2, rg);
313    e_widget_on_change_hook_set(ow, _adv_policy_changed, cfdata);
314    e_widget_list_object_append(o, ow, 1, 1, 0.5);
315    ow = e_widget_slider_add(evas, 1, 0, _("%1.2f x"), 0.25, 8.0, 0.05,
316                             0, &(cfdata->factor), NULL, 100);
317    cfdata->gui.adv.custom_slider = ow;
318    e_widget_list_object_append(o, ow, 1, 1, 0.5);
319    e_widget_toolbook_page_append(otb, NULL, _("Policy"), o,
320                                  1, 0, 1, 0, 0.5, 0.0);
321
322    /* Constraints */
323    o = e_widget_list_add(evas, 0, 0);
324    ow = e_widget_label_add(evas, _("Minimum"));
325    cfdata->gui.adv.min_lbl = ow;
326    e_widget_list_object_append(o, ow, 1, 1, 0.5);
327    ow = e_widget_slider_add(evas, 1, 0, _("%1.2f times"), 0.25, 8.0, 0.05,
328                             0, &(cfdata->min), NULL, 150);
329    cfdata->gui.adv.min_slider = ow;
330    e_widget_list_object_append(o, ow, 1, 1, 0.5);
331    ow = e_widget_label_add(evas, _("Maximum"));
332    cfdata->gui.adv.max_lbl = ow;
333    e_widget_list_object_append(o, ow, 1, 1, 0.5);
334    ow = e_widget_slider_add(evas, 1, 0, _("%1.2f times"), 0.25, 8.0, 0.05,
335                             0, &(cfdata->max), NULL, 150);
336    cfdata->gui.adv.max_slider = ow;
337    e_widget_list_object_append(o, ow, 1, 1, 0.5);
338    e_widget_toolbook_page_append(otb, NULL, _("Constraints"), o,
339                                  1, 0, 1, 0, 0.5, 0.0);
340
341    e_widget_toolbook_page_show(otb, 0);
342    _adv_policy_changed(cfdata, NULL);
343    return otb;
344 }
345
346 static int
347 _adv_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
348 {
349    E_Action *a;
350    
351    cfdata->use_custom = 0;
352    cfdata->use_dpi = 0;
353    if (cfdata->use_mode == 1)
354      cfdata->use_dpi = 1;
355    else if (cfdata->use_mode == 2)
356      cfdata->use_custom = 1;
357
358    e_config->scale.use_dpi = cfdata->use_dpi;
359    e_config->scale.use_custom = cfdata->use_custom;
360    e_config->scale.min = cfdata->min;
361    e_config->scale.max = cfdata->max;
362    e_config->scale.factor = cfdata->factor;
363    e_config->scale.base_dpi = cfdata->base_dpi;
364
365    e_config_save_queue();
366    
367    a = e_action_find("restart");
368    if ((a) && (a->func.go)) a->func.go(NULL, NULL);
369    
370    return 1;
371 }
372
373 static int
374 _adv_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
375 {
376    int use_dpi = 0, use_custom = 0;
377
378    if (cfdata->use_mode == 1)
379      use_dpi = 1;
380    else if (cfdata->use_mode == 2)
381      use_custom = 1;
382
383    return (use_dpi != e_config->scale.use_dpi) ||
384           (use_custom != e_config->scale.use_custom) ||
385           (cfdata->min != e_config->scale.min) ||
386           (cfdata->max != e_config->scale.max) ||
387           (cfdata->factor != e_config->scale.factor) ||
388           (cfdata->base_dpi != e_config->scale.base_dpi);
389    return 1;
390 }
391
392 static void
393 _adv_policy_changed(void *data, Evas_Object *obj __UNUSED__)
394 {
395    E_Config_Dialog_Data *cfdata;
396
397    if (!(cfdata = data)) return;
398    e_widget_disabled_set(cfdata->gui.adv.dpi_lbl, (cfdata->use_mode != 1));
399    e_widget_disabled_set(cfdata->gui.adv.dpi_slider, (cfdata->use_mode != 1));
400    e_widget_disabled_set(cfdata->gui.adv.custom_slider, (cfdata->use_mode != 2));
401 }
402