update for beta release
[framework/uifw/e17.git] / src / modules / mixer / conf_module.c
1 #include "e_mod_main.h"
2
3 extern const char _e_mixer_Name[];
4
5 struct _E_Config_Dialog_Data
6 {
7    int default_instance;
8    struct mixer_config_ui
9    {
10       Evas_Object *list;
11       struct mixer_config_ui_general
12       {
13          Evas_Object *frame;
14          E_Radio_Group *radio;
15       } general;
16    } ui;
17 };
18
19 static int
20 _find_default_instance_index(E_Mixer_Module_Context *ctxt)
21 {
22    Eina_List *l;
23    int i;
24
25    for (i = 0, l = ctxt->instances; l; l = l->next, i++)
26      if (l->data == ctxt->default_instance)
27        return i;
28
29    return 0;
30 }
31
32 static void *
33 _create_data(E_Config_Dialog *dialog)
34 {
35    E_Config_Dialog_Data *cfdata;
36    E_Mixer_Module_Context *ctxt;
37
38    cfdata = E_NEW(E_Config_Dialog_Data, 1);
39    if (!cfdata)
40      return NULL;
41
42    ctxt = dialog->data;
43    cfdata->default_instance = _find_default_instance_index(ctxt);
44
45    return cfdata;
46 }
47
48 static void
49 _free_data(E_Config_Dialog *dialog, E_Config_Dialog_Data *cfdata)
50 {
51    E_Mixer_Module_Context *ctxt = dialog->data;
52    if (ctxt)
53      ctxt->conf_dialog = NULL;
54
55    E_FREE(cfdata);
56 }
57
58 static int
59 _basic_apply(E_Config_Dialog *dialog, E_Config_Dialog_Data *cfdata)
60 {
61    E_Mixer_Module_Context *ctxt = dialog->data;
62    ctxt->default_instance = eina_list_nth(ctxt->instances,
63                                           cfdata->default_instance);
64    if (ctxt->default_instance)
65      {
66         E_Mixer_Module_Config *conf;
67         const char *id;
68
69         conf = ctxt->conf;
70         if (conf->default_gc_id)
71           eina_stringshare_del(conf->default_gc_id);
72
73         id = ctxt->default_instance->gcc->cf->id;
74         conf->default_gc_id = eina_stringshare_add(id);
75
76         conf->desktop_notification = ctxt->desktop_notification;
77      }
78
79    return 1;
80 }
81
82 static void
83 _basic_create_general(E_Config_Dialog *dialog, Evas *evas, E_Config_Dialog_Data *cfdata)
84 {
85    struct mixer_config_ui_general *ui = &cfdata->ui.general;
86    E_Mixer_Module_Context *ctxt = dialog->data;
87    Evas_Object *label, *chk;
88    Eina_List *l;
89    int i;
90
91    ui->frame = e_widget_framelist_add(evas, _("General Settings"), 0);
92
93    label = e_widget_label_add(evas, _("Mixer to use for global actions:"));
94    e_widget_framelist_object_append(ui->frame, label);
95
96    ui->radio = e_widget_radio_group_new(&cfdata->default_instance);
97    for (i = 0, l = ctxt->instances; l; l = l->next, i++)
98      {
99         E_Mixer_Instance *inst;
100         E_Mixer_Gadget_Config *conf;
101         Evas_Object *o;
102         char name[128];
103         const char *card_name;
104
105         inst = l->data;
106         conf = inst->conf;
107
108         card_name = e_mixer_system_get_card_name(conf->card);
109         snprintf(name, sizeof(name), "%s: %s", card_name, conf->channel_name);
110         eina_stringshare_del(card_name);
111
112         o = e_widget_radio_add(evas, name, i, ui->radio);
113         e_widget_framelist_object_append(ui->frame, o);
114      }
115
116
117    e_widget_list_object_append(cfdata->ui.list, ui->frame, 1, 1, 0.5);
118    chk = e_widget_check_add(evas, _("Diplay desktop notifications on volume change"), &ctxt->desktop_notification);
119    e_widget_check_checked_set(chk, ctxt->conf->desktop_notification);
120 #ifndef HAVE_ENOTIFY
121    e_widget_disabled_set(chk, EINA_TRUE);
122 #endif
123    e_widget_list_object_append(cfdata->ui.list, chk, 1, 1, 0.5);
124 }
125
126 static void
127 cb_mixer_app_del(E_Dialog *dialog __UNUSED__, void *data)
128 {
129    E_Mixer_Module_Context *ctxt = data;
130    ctxt->mixer_dialog = NULL;
131 }
132
133 static void
134 cb_mixer_call(void *data, void *data2 __UNUSED__)
135 {
136    E_Mixer_Module_Context *ctxt = data;
137    E_Container *con;
138
139    if (ctxt->mixer_dialog)
140      {
141         e_dialog_show(ctxt->mixer_dialog);
142         return;
143      }
144
145    con = e_container_current_get(e_manager_current_get());
146    ctxt->mixer_dialog = e_mixer_app_dialog_new(con, cb_mixer_app_del, ctxt);
147 }
148
149 static void
150 _basic_create_mixer_call(E_Config_Dialog *dialog, Evas *evas, E_Config_Dialog_Data *cfdata)
151 {
152    Evas_Object *button;
153
154    button = e_widget_button_add(evas, _("Launch mixer..."), NULL,
155                                 cb_mixer_call, dialog->data, NULL);
156    e_widget_list_object_append(cfdata->ui.list, button, 0, 0, 0.0);
157 }
158
159 static Evas_Object *
160 _basic_create(E_Config_Dialog *dialog, Evas *evas, E_Config_Dialog_Data *cfdata)
161 {
162    if (!cfdata)
163      return NULL;
164
165    cfdata->ui.list = e_widget_list_add(evas, 0, 0);
166    _basic_create_general(dialog, evas, cfdata);
167    _basic_create_mixer_call(dialog, evas, cfdata);
168    return cfdata->ui.list;
169 }
170
171 E_Config_Dialog *
172 e_mixer_config_module_dialog_new(E_Container *con, E_Mixer_Module_Context *ctxt)
173 {
174    E_Config_Dialog *dialog;
175    E_Config_Dialog_View *view;
176
177    if (e_config_dialog_find(_e_mixer_Name, "extensions/mixer"))
178      return NULL;
179
180    view = E_NEW(E_Config_Dialog_View, 1);
181    if (!view)
182      return NULL;
183
184    view->create_cfdata = _create_data;
185    view->free_cfdata = _free_data;
186    view->basic.create_widgets = _basic_create;
187    view->basic.apply_cfdata = _basic_apply;
188
189    dialog = e_config_dialog_new(con, _("Mixer Module Settings"),
190                                 _e_mixer_Name, "extensions/mixer",
191                                 e_mixer_theme_path(), 0, view, ctxt);
192
193    return dialog;
194 }