3 typedef struct _E_Path_Pair E_Path_Pair;
4 typedef struct _CFPath_Change_Data CFPath_Change_Data;
6 static void *_create_data(E_Config_Dialog *cfd);
7 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
8 static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
9 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
11 static void _ilist_update(Evas_Object *obj, CFPath_Change_Data *old, CFPath_Change_Data *new);
12 static void _ilist_path_cb_change(void *data);
17 const char *path_description;
20 struct _CFPath_Change_Data
23 Eina_List *new_user_path;
25 E_Config_Dialog_Data *cfdata;
28 struct _E_Config_Dialog_Data
33 CFPath_Change_Data *cur_pcd;
36 E_Path_Pair *paths_available;
39 Evas_Object *path_list;
40 Evas_Object *default_list; /* Read Only */
41 Evas_Object *user_list; /* Editable */
46 e_int_config_paths(E_Container *con, const char *params __UNUSED__)
49 E_Config_Dialog_View *v;
51 if (e_config_dialog_find("E", "advanced/search_directories")) return NULL;
52 v = E_NEW(E_Config_Dialog_View, 1);
54 v->create_cfdata = _create_data;
55 v->free_cfdata = _free_data;
56 v->basic.create_widgets = _basic_create_widgets;
57 v->basic.apply_cfdata = _basic_apply_data;
59 cfd = e_config_dialog_new(con, _("Search Path Settings"),
60 "E", "advanced/search_directories",
61 "preferences-directories", 0, v, NULL);
66 _fill_data(E_Config_Dialog_Data *cfdata)
68 cfdata->paths_available = E_NEW(E_Path_Pair, 10);
69 cfdata->paths_available[0].path = path_data;
70 cfdata->paths_available[0].path_description = _("Data");
71 cfdata->paths_available[1].path = path_images;
72 cfdata->paths_available[1].path_description = _("Images");
73 cfdata->paths_available[2].path = path_fonts;
74 cfdata->paths_available[2].path_description = _("Fonts");
75 cfdata->paths_available[3].path = path_themes;
76 cfdata->paths_available[3].path_description = _("Themes");
77 cfdata->paths_available[4].path = path_icons;
78 cfdata->paths_available[4].path_description = _("Icons");
79 cfdata->paths_available[5].path = path_modules;
80 cfdata->paths_available[5].path_description = _("Modules");
81 cfdata->paths_available[6].path = path_backgrounds;
82 cfdata->paths_available[6].path_description = _("Backgrounds");
83 cfdata->paths_available[7].path = path_messages;
84 cfdata->paths_available[7].path_description = _("Messages");
85 cfdata->paths_available[8].path = NULL;
86 cfdata->paths_available[8].path_description = NULL;
91 _create_data(E_Config_Dialog *cfd)
93 E_Config_Dialog_Data *cfdata;
95 cfdata = E_NEW(E_Config_Dialog_Data, 1);
102 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
104 while (cfdata->pcd_list)
106 CFPath_Change_Data *pcd;
108 pcd = cfdata->pcd_list->data;
109 while (pcd->new_user_path)
113 dir = pcd->new_user_path->data;
114 eina_stringshare_del(dir);
116 eina_list_remove_list(pcd->new_user_path, pcd->new_user_path);
120 eina_list_remove_list(cfdata->pcd_list, cfdata->pcd_list);
122 free(cfdata->paths_available);
127 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
132 _ilist_update(cfdata->gui.user_list, cfdata->cur_pcd, NULL);
134 for (l = cfdata->pcd_list; l; l = l->next)
136 CFPath_Change_Data *pcd;
139 if (pcd->new_user_path)
141 e_path_user_path_clear(pcd->path);
142 for (ll = pcd->new_user_path; ll; ll = ll->next)
147 e_path_user_path_append(pcd->path, dir);
150 else if (*(pcd->path->user_dir_list) && pcd->dirty)
151 e_path_user_path_clear(pcd->path);
153 e_config_save_queue();
158 _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
160 Evas_Object *o, *of, *ob;
163 o = e_widget_table_add(evas, 0);
165 of = e_widget_framelist_add(evas, _("E Paths"), 0);
166 ob = e_widget_ilist_add(evas, 0, 0, NULL);
167 cfdata->gui.path_list = ob;
168 e_widget_size_min_set(ob, 170, 100);
170 evas_event_freeze(evas_object_evas_get(cfdata->gui.path_list));
172 e_widget_ilist_freeze(cfdata->gui.path_list);
175 for (i = 0; cfdata->paths_available[i].path; i++)
177 CFPath_Change_Data *pcd;
179 pcd = E_NEW(CFPath_Change_Data, 1);
180 pcd->path = cfdata->paths_available[i].path;
181 pcd->cfdata = cfdata;
182 cfdata->pcd_list = eina_list_append(cfdata->pcd_list, pcd);
183 e_widget_ilist_append(ob, NULL,
184 cfdata->paths_available[i].path_description,
185 _ilist_path_cb_change, pcd, NULL);
188 e_widget_ilist_go(ob);
189 e_widget_ilist_thaw(cfdata->gui.path_list);
191 evas_event_thaw(evas_object_evas_get(cfdata->gui.path_list));
193 e_widget_framelist_object_append(of, ob);
194 e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1);
196 of = e_widget_framelist_add(evas, _("Default Directories"), 0);
197 ob = e_widget_ilist_add(evas, 0, 0, NULL);
198 cfdata->gui.default_list = ob;
199 e_widget_size_min_set(ob, 100, 100);
200 e_widget_framelist_object_append(of, ob);
201 e_widget_table_object_append(o, of, 0, 1, 1, 1, 1, 1, 1, 1);
203 of = e_widget_framelist_add(evas, _("User Defined Directories"), 0);
204 ob = e_widget_config_list_add(evas, e_widget_entry_add,
205 _("New Directory"), 2);
206 e_widget_disabled_set(ob, 1);
207 cfdata->gui.user_list = ob;
208 e_widget_framelist_object_append(of, ob);
209 e_widget_table_object_append(o, of, 1, 0, 1, 2, 0, 1, 0, 1);
211 e_dialog_resizable_set(cfd->dia, 1);
216 _ilist_path_cb_change(void *data)
218 CFPath_Change_Data *pcd;
219 Eina_List *default_list;
223 default_list = pcd->path->default_dir_list;
225 /* Update Default List */
226 evas_event_freeze(evas_object_evas_get(pcd->cfdata->gui.default_list));
228 e_widget_ilist_freeze(pcd->cfdata->gui.default_list);
230 e_widget_ilist_clear(pcd->cfdata->gui.default_list);
231 for (l = default_list; l; l = l->next)
235 dir = ((E_Path_Dir *)l->data)->dir;
236 e_widget_ilist_append(pcd->cfdata->gui.default_list,
237 NULL, dir, NULL, NULL, NULL);
239 e_widget_ilist_go(pcd->cfdata->gui.default_list);
241 e_widget_ilist_thaw(pcd->cfdata->gui.default_list);
243 evas_event_thaw(evas_object_evas_get(pcd->cfdata->gui.default_list));
245 _ilist_update(pcd->cfdata->gui.user_list,
246 pcd->cfdata->cur_pcd, /* Path data to save */
247 pcd); /* New Path to show */
249 pcd->cfdata->cur_pcd = pcd;
253 _ilist_update(Evas_Object *obj, CFPath_Change_Data *old, CFPath_Change_Data *new)
255 /* Save current data to old path */
261 while (old->new_user_path)
265 dir = old->new_user_path->data;
266 eina_stringshare_del(dir);
268 eina_list_remove_list(old->new_user_path, old->new_user_path);
271 for (i = 0; i < e_widget_config_list_count(obj); i++)
275 dir = e_widget_config_list_nth_get(obj, i);
277 eina_list_append(old->new_user_path, eina_stringshare_add(dir));
283 /* Fill list with selected data */
284 e_widget_disabled_set(obj, 0);
285 e_widget_config_list_clear(obj);
287 if (new->new_user_path)
290 Eina_List *user_path;
292 user_path = new->new_user_path;
294 for (l = user_path; l; l = l->next)
299 e_widget_config_list_append(obj, dir);
302 else if (*(new->path->user_dir_list) && !new->dirty)
305 Eina_List *user_path;
307 user_path = *(new->path->user_dir_list);
309 for (l = user_path; l; l = l->next)
314 e_widget_config_list_append(obj, epd->dir);