88e76139e8279042781c1ad8de910df1340dbd38
[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
77    return 1;
78 }
79
80 static void
81 _basic_create_general(E_Config_Dialog *dialog, Evas *evas, E_Config_Dialog_Data *cfdata)
82 {
83    struct mixer_config_ui_general *ui = &cfdata->ui.general;
84    E_Mixer_Module_Context *ctxt = dialog->data;
85    Evas_Object *label;
86    Eina_List *l;
87    int i;
88
89    ui->frame = e_widget_framelist_add(evas, _("General Settings"), 0);
90
91    label = e_widget_label_add(evas, _("Mixer to use for global actions:"));
92    e_widget_framelist_object_append(ui->frame, label);
93
94    ui->radio = e_widget_radio_group_new(&cfdata->default_instance);
95    for (i = 0, l = ctxt->instances; l; l = l->next, i++)
96      {
97         E_Mixer_Instance *inst;
98         E_Mixer_Gadget_Config *conf;
99         Evas_Object *o;
100         char name[128];
101         const char *card_name;
102
103         inst = l->data;
104         conf = inst->conf;
105
106         card_name = e_mixer_system_get_card_name(conf->card);
107         snprintf(name, sizeof(name), "%s: %s", card_name, conf->channel_name);
108         eina_stringshare_del(card_name);
109
110         o = e_widget_radio_add(evas, name, i, ui->radio);
111         e_widget_framelist_object_append(ui->frame, o);
112      }
113
114    e_widget_list_object_append(cfdata->ui.list, ui->frame, 1, 1, 0.5);
115 }
116
117 static void
118 cb_mixer_app_del(E_Dialog *dialog __UNUSED__, void *data)
119 {
120    E_Mixer_Module_Context *ctxt = data;
121    ctxt->mixer_dialog = NULL;
122 }
123
124 static void
125 cb_mixer_call(void *data, void *data2 __UNUSED__)
126 {
127    E_Mixer_Module_Context *ctxt = data;
128    E_Container *con;
129
130    if (ctxt->mixer_dialog)
131      {
132         e_dialog_show(ctxt->mixer_dialog);
133         return;
134      }
135
136    con = e_container_current_get(e_manager_current_get());
137    ctxt->mixer_dialog = e_mixer_app_dialog_new(con, cb_mixer_app_del, ctxt);
138 }
139
140 static void
141 _basic_create_mixer_call(E_Config_Dialog *dialog, Evas *evas, E_Config_Dialog_Data *cfdata)
142 {
143    Evas_Object *button;
144
145    button = e_widget_button_add(evas, _("Launch mixer..."), NULL,
146                                 cb_mixer_call, dialog->data, NULL);
147    e_widget_list_object_append(cfdata->ui.list, button, 0, 0, 0.0);
148 }
149
150 static Evas_Object *
151 _basic_create(E_Config_Dialog *dialog, Evas *evas, E_Config_Dialog_Data *cfdata)
152 {
153    if (!cfdata)
154      return NULL;
155
156    cfdata->ui.list = e_widget_list_add(evas, 0, 0);
157    _basic_create_general(dialog, evas, cfdata);
158    _basic_create_mixer_call(dialog, evas, cfdata);
159    return cfdata->ui.list;
160 }
161
162 E_Config_Dialog *
163 e_mixer_config_module_dialog_new(E_Container *con, E_Mixer_Module_Context *ctxt)
164 {
165    E_Config_Dialog *dialog;
166    E_Config_Dialog_View *view;
167
168    if (e_config_dialog_find(_e_mixer_Name, "extensions/mixer"))
169      return NULL;
170
171    view = E_NEW(E_Config_Dialog_View, 1);
172    if (!view)
173      return NULL;
174
175    view->create_cfdata = _create_data;
176    view->free_cfdata = _free_data;
177    view->basic.create_widgets = _basic_create;
178    view->basic.apply_cfdata = _basic_apply;
179
180    dialog = e_config_dialog_new(con, _("Mixer Module Settings"),
181                                 _e_mixer_Name, "extensions/mixer",
182                                 e_mixer_theme_path(), 0, view, ctxt);
183
184    return dialog;
185 }