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