update for beta release
[framework/uifw/e17.git] / src / modules / battery / e_mod_config.c
1 #include "e.h"
2 #include "e_mod_main.h"
3
4 struct _E_Config_Dialog_Data
5 {
6    int show_alert;
7    int poll_interval;
8 #ifdef HAVE_EEZE
9    int fuzzy;
10 #endif
11    int alert_time;
12    int alert_percent;
13    int dismiss_alert;
14    int alert_timeout;
15    int suspend_below;
16    int force_mode; // 0 == auto, 1 == batget, 2 == subsystem
17    struct 
18      {
19         Evas_Object *show_alert_label;
20         Evas_Object *show_alert_time;
21         Evas_Object *show_alert_percent;
22         Evas_Object *dismiss_alert_label;
23         Evas_Object *alert_timeout;
24 #ifdef HAVE_EEZE
25         Evas_Object *fuzzy;
26 #endif
27      } ui;
28 };
29
30 /* Protos */
31 static void *_create_data(E_Config_Dialog *cfd);
32 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
33 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
34 static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
35 static int _basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
36 static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
37 static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
38 static int _advanced_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
39 static void _cb_radio_changed(void *data, Evas_Object *obj __UNUSED__);
40
41 E_Config_Dialog *
42 e_int_config_battery_module(E_Container *con, const char *params __UNUSED__) 
43 {
44    E_Config_Dialog *cfd;
45    E_Config_Dialog_View *v;
46    char buf[PATH_MAX];
47
48    v = E_NEW(E_Config_Dialog_View, 1);
49    v->create_cfdata = _create_data;
50    v->free_cfdata = _free_data;
51    v->basic.apply_cfdata = _basic_apply_data;
52    v->basic.create_widgets = _basic_create_widgets;
53    v->basic.check_changed = _basic_check_changed;
54    v->advanced.apply_cfdata = _advanced_apply_data;
55    v->advanced.create_widgets = _advanced_create_widgets;
56    v->advanced.check_changed = _advanced_check_changed;
57
58    snprintf(buf, sizeof(buf), "%s/e-module-battery.edj", 
59             e_module_dir_get(battery_config->module));
60    cfd = e_config_dialog_new(con, _("Battery Monitor Settings"), 
61                              "E", "_e_mod_battery_config_dialog",
62                              buf, 0, v, NULL);
63    battery_config->config_dialog = cfd;
64    return cfd;
65 }
66
67 static void
68 _fill_data(E_Config_Dialog_Data *cfdata) 
69 {
70    if (!battery_config) return;
71    cfdata->alert_time = battery_config->alert;
72    cfdata->alert_percent = battery_config->alert_p;
73    cfdata->poll_interval = battery_config->poll_interval;
74    cfdata->alert_timeout = battery_config->alert_timeout;
75    cfdata->suspend_below = battery_config->suspend_below;
76    cfdata->force_mode = battery_config->force_mode;
77 #ifdef HAVE_EEZE
78    cfdata->fuzzy = battery_config->fuzzy;
79 #endif
80
81    if ((cfdata->alert_time > 0) || (cfdata->alert_percent > 0)) 
82      cfdata->show_alert = 1;
83    else 
84      cfdata->show_alert = 0;
85
86    if (cfdata->alert_timeout > 0)
87      cfdata->dismiss_alert = 1;
88    else
89      cfdata->dismiss_alert = 0;
90 }
91
92 static void
93 _ensure_alert_time(E_Config_Dialog_Data *cfdata)
94 {
95    if ((cfdata->alert_time > 0) || (cfdata->alert_percent > 0))
96      return;
97
98    // must handle the case where user toggled the checkbox but set no threshold
99    cfdata->alert_time = 5;
100 }
101
102 static void *
103 _create_data(E_Config_Dialog *cfd __UNUSED__)
104 {
105    E_Config_Dialog_Data *cfdata;
106
107    cfdata = E_NEW(E_Config_Dialog_Data, 1);
108    _fill_data(cfdata);
109    return cfdata;
110 }
111
112 static void
113 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
114 {
115    if (!battery_config) return;
116    battery_config->config_dialog = NULL;
117    E_FREE(cfdata);
118 }
119
120 static Evas_Object *
121 _basic_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
122 {
123    Evas_Object *o, *ob;
124
125    o = e_widget_list_add(evas, 0, 0);
126    ob = e_widget_check_add(evas, _("Show alert when battery is low"),
127                            &(cfdata->show_alert));
128    e_widget_list_object_append(o, ob, 1, 0, 0.5);
129    return o;
130 }
131
132 static int
133 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
134 {
135    if (!battery_config) return 0;
136
137    if (cfdata->show_alert)
138      {
139         _ensure_alert_time(cfdata);
140         battery_config->alert = cfdata->alert_time;
141         battery_config->alert_p = cfdata->alert_percent;
142      }
143    else
144      {
145         battery_config->alert = 0;
146         battery_config->alert_p = 0;
147      }
148
149    _battery_config_updated();
150    e_config_save_queue();
151    return 1;
152 }
153
154 static int
155 _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
156 {
157    int old_show_alert = ((battery_config->alert > 0) ||
158                          (battery_config->alert_p > 0));
159
160    return (cfdata->show_alert != old_show_alert);
161 }
162
163 static void
164 _cb_show_alert_changed(void *data, Evas_Object *obj __UNUSED__)
165 {
166    E_Config_Dialog_Data *cfdata = data;
167    Eina_Bool show_alert = cfdata->show_alert;
168    Eina_Bool dismiss_alert = cfdata->show_alert && cfdata->dismiss_alert;
169
170    e_widget_disabled_set(cfdata->ui.show_alert_label, !show_alert);
171    e_widget_disabled_set(cfdata->ui.show_alert_time, !show_alert);
172    e_widget_disabled_set(cfdata->ui.show_alert_percent, !show_alert);
173    e_widget_disabled_set(cfdata->ui.dismiss_alert_label, !show_alert);
174
175    e_widget_disabled_set(cfdata->ui.alert_timeout, !dismiss_alert);
176 }
177
178 static void
179 _cb_dismiss_alert_changed(void *data, Evas_Object *obj __UNUSED__)
180 {
181    E_Config_Dialog_Data *cfdata = data;
182    Eina_Bool dismiss_alert = cfdata->show_alert && cfdata->dismiss_alert;
183
184    e_widget_disabled_set(cfdata->ui.alert_timeout, !dismiss_alert);
185 }
186
187 static void 
188 _cb_radio_changed(void *data, Evas_Object *obj __UNUSED__) 
189 {
190    E_Config_Dialog_Data *cfdata;
191    Eina_Bool fuzzy;
192
193    if (!(cfdata = data)) return;
194    fuzzy = (cfdata->force_mode == SUBSYSTEM);
195 #ifdef HAVE_EEZE
196    e_widget_disabled_set(cfdata->ui.fuzzy, !fuzzy);
197 #endif
198 }
199
200 static Evas_Object *
201 _advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
202 {
203    Evas_Object *o, *ob, *otb;
204    E_Radio_Group *rg;
205
206    otb = e_widget_toolbook_add(evas, (48 * e_scale), (48 * e_scale));
207
208    /* Use Sliders for both cfg options */
209    o = e_widget_table_add(evas, 0);
210
211    ob = e_widget_label_add(evas, _("Check every:"));
212    e_widget_table_object_append(o, ob, 0, 0, 1, 1, 1, 0, 1, 0);
213    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f ticks"), 1, 256, 4, 0, 
214                             NULL, &(cfdata->poll_interval), 100);
215    e_widget_table_object_append(o, ob, 0, 1, 1, 1, 1, 0, 1, 0);
216    
217    ob = e_widget_label_add(evas, _("Hibernate when below:"));
218    e_widget_table_object_append(o, ob, 0, 2, 1, 1, 1, 0, 1, 0);
219    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f %%"), 0, 50, 1, 0, 
220                             NULL, &(cfdata->suspend_below), 100);
221    e_widget_table_object_append(o, ob, 0, 3, 1, 1, 1, 0, 1, 0);
222    
223    e_widget_toolbook_page_append(otb, NULL, _("Polling"), o, 1, 0, 1, 0, 
224                                  0.5, 0.0);
225
226    o = e_widget_table_add(evas, 0);
227    ob = e_widget_check_add(evas, _("Show low battery alert"),
228                            &(cfdata->show_alert));
229    e_widget_on_change_hook_set(ob, _cb_show_alert_changed, cfdata);
230    e_widget_table_object_append(o, ob, 0, 0, 1, 1, 1, 1, 1, 0);
231    ob = e_widget_label_add(evas, _("Alert when at:"));
232    cfdata->ui.show_alert_label = ob;
233    e_widget_table_object_append(o, ob, 0, 1, 1, 1, 1, 0, 1, 1);
234    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f min"), 0, 60, 1, 0, NULL, 
235                             &(cfdata->alert_time), 100);
236    cfdata->ui.show_alert_time = ob;
237    e_widget_table_object_append(o, ob, 0, 2, 1, 1, 1, 0, 1, 0);
238    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f %%"), 0, 100, 1, 0, NULL, 
239                             &(cfdata->alert_percent), 100);
240    cfdata->ui.show_alert_percent = ob;
241    e_widget_table_object_append(o, ob, 0, 3, 1, 1, 1, 0, 1, 0);
242    ob = e_widget_check_add(evas, _("Auto dismiss in..."),
243                            &(cfdata->dismiss_alert));
244    cfdata->ui.dismiss_alert_label = ob;
245    e_widget_on_change_hook_set(ob, _cb_dismiss_alert_changed, cfdata);
246    e_widget_table_object_append(o, ob, 0, 4, 1, 1, 1, 1, 1, 0);
247    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f sec"), 1, 300, 1, 0, NULL,
248                             &(cfdata->alert_timeout), 100);
249    cfdata->ui.alert_timeout = ob;
250    e_widget_table_object_append(o, ob, 0, 5, 1, 1, 1, 0, 1, 0);
251
252    _cb_show_alert_changed(cfdata, NULL);
253
254    e_widget_toolbook_page_append(otb, NULL, _("Alert"), o, 1, 0, 1, 0, 
255                                  0.5, 0.0);
256
257    o = e_widget_list_add(evas, 0, 0);
258
259    rg = e_widget_radio_group_new(&(cfdata->force_mode));
260    ob = e_widget_radio_add(evas, _("Auto Detect"), UNKNOWN, rg);
261    e_widget_on_change_hook_set(ob, _cb_radio_changed, cfdata);
262    e_widget_list_object_append(o, ob, 1, 0, 0.0);
263    ob = e_widget_radio_add(evas, _("Internal"), NOSUBSYSTEM, rg);
264    e_widget_on_change_hook_set(ob, _cb_radio_changed, cfdata);
265    e_widget_list_object_append(o, ob, 1, 0, 0.0);
266 #ifdef HAVE_EEZE
267    ob = e_widget_radio_add(evas, _("udev"), SUBSYSTEM, rg);
268    e_widget_on_change_hook_set(ob, _cb_radio_changed, cfdata);
269    e_widget_list_object_append(o, ob, 1, 0, 0.0);
270    ob = e_widget_check_add(evas, _("Fuzzy Mode"),
271                            &(cfdata->fuzzy));
272    cfdata->ui.fuzzy = ob;
273 #else
274    ob = e_widget_radio_add(evas, _("HAL"), 2, rg);
275    e_widget_on_change_hook_set(ob, _cb_radio_changed, cfdata);
276 #endif
277    e_widget_list_object_append(o, ob, 1, 0, 0.0);
278
279    e_widget_toolbook_page_append(otb, NULL, _("Hardware"), o, 1, 0, 1, 0, 
280                                  0.5, 0.0);
281
282    e_widget_toolbook_page_show(otb, 0);
283    return otb;
284 }
285
286 static int
287 _advanced_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
288 {
289    if (!battery_config) return 0;
290
291    battery_config->poll_interval = cfdata->poll_interval;
292 #ifdef HAVE_EEZE
293    battery_config->fuzzy = cfdata->fuzzy;
294 #endif
295
296    if (cfdata->show_alert)
297      {
298         _ensure_alert_time(cfdata);
299         battery_config->alert = cfdata->alert_time;
300         battery_config->alert_p = cfdata->alert_percent;
301      }
302    else
303      {
304         battery_config->alert = 0;
305         battery_config->alert_p = 0;
306      }
307
308    if ((cfdata->dismiss_alert) && (cfdata->alert_timeout > 0))
309      battery_config->alert_timeout = cfdata->alert_timeout;
310    else
311      battery_config->alert_timeout = 0;
312
313    battery_config->force_mode = cfdata->force_mode;
314    battery_config->suspend_below = cfdata->suspend_below;
315
316    _battery_config_updated();
317    e_config_save_queue();
318    return 1;
319 }
320
321 static int
322 _advanced_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
323 {
324    int old_show_alert = ((battery_config->alert > 0) ||
325                          (battery_config->alert_p > 0));
326    int old_dismiss_alert = (battery_config->alert_timeout > 0);
327
328    return ((cfdata->alert_time != battery_config->alert) ||
329            (cfdata->alert_percent != battery_config->alert_p) ||
330            (cfdata->poll_interval != battery_config->poll_interval) ||
331            (cfdata->alert_timeout != battery_config->alert_timeout) ||
332            (cfdata->suspend_below != battery_config->suspend_below) ||
333 #ifdef HAVE_EEZE
334            (cfdata->fuzzy != battery_config->fuzzy) ||
335 #endif           
336            (cfdata->force_mode != battery_config->force_mode) ||
337            (cfdata->show_alert != old_show_alert) ||
338            (cfdata->dismiss_alert != old_dismiss_alert));
339 }
340