2 #include "e_int_config_theme_import.h"
3 #include "e_int_config_theme_web.h"
5 static void *_create_data(E_Config_Dialog *cfd);
6 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
7 static void _fill_data(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);
10 static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
11 static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
12 static Eina_List *_get_theme_categories_list(void);
14 struct _E_Config_Dialog_Data
20 Evas_Object *o_up_button;
21 Evas_Object *o_preview;
22 Evas_Object *o_personal;
23 Evas_Object *o_system;
28 Evas_Object *o_categories_ilist;
29 Evas_Object *o_files_ilist;
30 int personal_file_count;
31 Eina_List *theme_list;
32 Eina_List *parts_list;
39 static const char *parts_list[] =
41 "about:e/widgets/about/main",
42 "borders:e/widgets/border/default/border",
43 "background:e/desktop/background",
44 "configure:e/widgets/configure/main",
45 "dialog:e/widgets/dialog/main",
48 "exebuf:e/widgets/exebuf/main",
50 "gadman:e/gadman/control",
54 "modules/pager:e/widgets/pager/popup",
57 "modules/clock:e/modules/clock/main",
58 "modules/battery:e/modules/battery/main",
59 "modules/cpufreq:e/modules/cpufreq/main",
60 "modules/start:e/modules/start/main",
61 "modules/temperature:e/modules/temperature/main",
63 "shelf:e/shelf/default/base",
66 "winlist:e/widgets/winlist/main",
71 e_int_config_theme(E_Container *con, const char *params __UNUSED__)
74 E_Config_Dialog_View *v;
76 if (e_config_dialog_find("E", "appearance/theme")) return NULL;
77 v = E_NEW(E_Config_Dialog_View, 1);
79 v->create_cfdata = _create_data;
80 v->free_cfdata = _free_data;
81 v->basic.apply_cfdata = _basic_apply_data;
82 v->basic.create_widgets = _basic_create_widgets;
83 v->advanced.apply_cfdata = _advanced_apply_data;
84 v->advanced.create_widgets = _advanced_create_widgets;
85 v->override_auto_apply = 1;
86 cfd = e_config_dialog_new(con,
88 "E", "appearance/theme",
89 "preferences-desktop-theme", 0, v, NULL);
94 e_int_config_theme_import_done(E_Config_Dialog *dia)
96 E_Config_Dialog_Data *cfdata;
99 cfdata->win_import = NULL;
103 e_int_config_theme_web_done(E_Config_Dialog *dia)
105 E_Config_Dialog_Data *cfdata;
107 cfdata = dia->cfdata;
108 cfdata->dia_web = NULL;
112 e_int_config_theme_update(E_Config_Dialog *dia, char *file)
114 E_Config_Dialog_Data *cfdata;
117 cfdata = dia->cfdata;
120 e_widget_radio_toggle_set(cfdata->o_personal, 1);
122 e_user_dir_concat_static(path, "themes");
123 eina_stringshare_del(cfdata->theme);
124 cfdata->theme = eina_stringshare_add(file);
127 e_widget_flist_path_set(cfdata->o_fm, path, "/");
129 if (cfdata->o_preview)
130 e_widget_preview_edje_set(cfdata->o_preview, cfdata->theme,
131 "e/desktop/background");
132 if (cfdata->o_fm) e_widget_change(cfdata->o_fm);
136 _cb_button_up(void *data1, void *data2 __UNUSED__)
138 E_Config_Dialog_Data *cfdata;
141 if (cfdata->o_fm) e_widget_flist_parent_go(cfdata->o_fm);
145 _cb_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
147 E_Config_Dialog_Data *cfdata;
150 if (!cfdata->o_fm) return;
151 if (cfdata->o_up_button)
152 e_widget_disabled_set(cfdata->o_up_button,
153 !e_widget_flist_has_parent_get(cfdata->o_fm));
157 _cb_files_selection_change(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
159 E_Config_Dialog_Data *cfdata;
161 E_Fm2_Icon_Info *ici;
162 const char *realpath;
166 if (!cfdata->o_fm) return;
168 if (!(selected = e_widget_flist_selected_list_get(cfdata->o_fm))) return;
170 ici = selected->data;
171 realpath = e_widget_flist_real_path_get(cfdata->o_fm);
173 if (!strcmp(realpath, "/"))
174 snprintf(buf, sizeof(buf), "/%s", ici->file);
176 snprintf(buf, sizeof(buf), "%s/%s", realpath, ici->file);
177 eina_list_free(selected);
179 if (ecore_file_is_dir(buf)) return;
181 eina_stringshare_del(cfdata->theme);
182 cfdata->theme = eina_stringshare_add(buf);
183 if (cfdata->o_preview)
184 e_widget_preview_edje_set(cfdata->o_preview, buf, "e/desktop/background");
185 if (cfdata->o_fm) e_widget_change(cfdata->o_fm);
191 _cb_files_selected(void *data, Evas_Object *obj, void *event_info)
193 E_Config_Dialog_Data *cfdata;
200 _cb_files_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
202 E_Config_Dialog_Data *cfdata;
208 if ((!cfdata->theme) || (!cfdata->o_fm)) return;
210 p = e_widget_flist_real_path_get(cfdata->o_fm);
213 if (strncmp(p, cfdata->theme, strlen(p))) return;
217 len = e_user_dir_concat_static(buf, "themes");
218 if (!strncmp(cfdata->theme, buf, len))
219 p = cfdata->theme + len + 1;
222 len = e_prefix_data_concat_static(buf, "data/themes");
223 if (!strncmp(cfdata->theme, buf, len))
224 p = cfdata->theme + len + 1;
228 e_widget_flist_select_set(cfdata->o_fm, p, 1);
229 e_widget_flist_file_show(cfdata->o_fm, p);
233 _cb_dir(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
235 E_Config_Dialog_Data *cfdata;
239 if (cfdata->fmdir == 1)
240 e_prefix_data_concat_static(path, "data/themes");
242 e_user_dir_concat_static(path, "themes");
243 e_widget_flist_path_set(cfdata->o_fm, path, "/");
247 _cb_files_files_deleted(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
249 E_Config_Dialog_Data *cfdata;
250 Eina_List *sel, *all, *n;
251 E_Fm2_Icon_Info *ici, *ic;
254 if ((!cfdata->theme) || (!cfdata->o_fm)) return;
256 if (!(all = e_widget_flist_all_list_get(cfdata->o_fm))) return;
257 if (!(sel = e_widget_flist_selected_list_get(cfdata->o_fm))) return;
261 all = eina_list_data_find_list(all, ici);
262 n = eina_list_next(all);
265 n = eina_list_prev(all);
269 if (!(ic = n->data)) return;
271 e_widget_flist_select_set(cfdata->o_fm, ic->file, 1);
272 e_widget_flist_file_show(cfdata->o_fm, ic->file);
276 evas_object_smart_callback_call(cfdata->o_fm, "selection_change", cfdata);
280 _cb_import(void *data1, void *data2 __UNUSED__)
282 E_Config_Dialog_Data *cfdata;
285 if (cfdata->win_import)
286 e_win_raise(cfdata->win_import);
288 cfdata->win_import = e_int_config_theme_import(cfdata->cfd);
293 _cb_web(void *data1, void *data2 __UNUSED__)
295 E_Config_Dialog_Data *cfdata;
299 e_win_raise(cfdata->dia_web->win);
301 cfdata->dia_web = e_int_config_theme_web(cfdata->cfd);
306 _fill_data(E_Config_Dialog_Data *cfdata)
312 c = e_theme_config_get("theme");
314 cfdata->theme = eina_stringshare_add(c->file);
317 e_prefix_data_concat_static(path, "data/themes/default.edj");
318 cfdata->theme = eina_stringshare_add(path);
320 if (cfdata->theme[0] != '/')
322 e_user_dir_snprintf(path, sizeof(path), "themes/%s", cfdata->theme);
323 if (ecore_file_exists(path))
325 eina_stringshare_del(cfdata->theme);
326 cfdata->theme = eina_stringshare_add(path);
330 e_prefix_data_snprintf(path, sizeof(path), "data/themes/%s",
332 if (ecore_file_exists(path))
334 eina_stringshare_del(cfdata->theme);
335 cfdata->theme = eina_stringshare_add(path);
340 cfdata->theme_list = _get_theme_categories_list();
342 len = e_prefix_data_concat_static(path, "data/themes");
343 if (!strncmp(cfdata->theme, path, len))
348 _create_data(E_Config_Dialog *cfd)
350 E_Config_Dialog_Data *cfdata;
352 cfdata = E_NEW(E_Config_Dialog_Data, 1);
353 cfd->cfdata = cfdata;
360 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
364 if (cfdata->win_import)
365 e_int_config_theme_del(cfdata->win_import);
367 EINA_LIST_FREE(cfdata->theme_list, t)
369 eina_stringshare_del(t->file);
370 eina_stringshare_del(t->category);
378 _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
380 Evas_Object *o, *ot, *of, *il, *ol;
385 z = e_zone_current_get(cfd->con);
387 ot = e_widget_table_add(evas, 0);
388 ol = e_widget_table_add(evas, 0);
389 il = e_widget_table_add(evas, 1);
391 rg = e_widget_radio_group_new(&(cfdata->fmdir));
392 o = e_widget_radio_add(evas, _("Personal"), 0, rg);
393 cfdata->o_personal = o;
394 evas_object_smart_callback_add(o, "changed", _cb_dir, cfdata);
395 e_widget_table_object_append(il, o, 0, 0, 1, 1, 1, 1, 0, 0);
396 o = e_widget_radio_add(evas, _("System"), 1, rg);
397 cfdata->o_system = o;
398 evas_object_smart_callback_add(o, "changed", _cb_dir, cfdata);
399 e_widget_table_object_append(il, o, 1, 0, 1, 1, 1, 1, 0, 0);
401 e_widget_table_object_append(ol, il, 0, 0, 1, 1, 0, 0, 0, 0);
403 o = e_widget_button_add(evas, _("Go up a Directory"), "go-up",
404 _cb_button_up, cfdata, NULL);
405 cfdata->o_up_button = o;
406 e_widget_table_object_append(ol, o, 0, 1, 1, 1, 0, 0, 0, 0);
408 if (cfdata->fmdir == 1)
409 e_prefix_data_concat_static(path, "data/themes");
411 e_user_dir_concat_static(path, "themes");
413 o = e_widget_flist_add(evas);
415 evas_object_smart_callback_add(o, "dir_changed",
416 _cb_files_changed, cfdata);
417 evas_object_smart_callback_add(o, "selection_change",
418 _cb_files_selection_change, cfdata);
419 evas_object_smart_callback_add(o, "changed",
420 _cb_files_files_changed, cfdata);
421 evas_object_smart_callback_add(o, "files_deleted",
422 _cb_files_files_deleted, cfdata);
423 e_widget_flist_path_set(o, path, "/");
425 e_widget_size_min_set(o, 160, 160);
426 e_widget_table_object_append(ol, o, 0, 2, 1, 1, 1, 1, 1, 1);
427 e_widget_table_object_append(ot, ol, 0, 0, 1, 1, 1, 1, 1, 1);
429 of = e_widget_list_add(evas, 0, 0);
431 il = e_widget_list_add(evas, 0, 1);
432 o = e_widget_button_add(evas, _(" Import..."), "preferences-desktop-theme",
433 _cb_import, cfdata, NULL);
434 e_widget_list_object_append(il, o, 1, 0, 0.5);
436 o = e_widget_button_add(evas, _(" Online..."), "network-website",
437 _cb_web, cfdata, NULL);
438 e_widget_list_object_append(il, o, 1, 0, 0.5);
440 e_widget_list_object_append(of, il, 1, 0, 0.0);
447 mh = (mw * z->h) / z->w;
448 oa = e_widget_aspect_add(evas, mw, mh);
449 o = e_widget_preview_add(evas, mw, mh);
450 evas_object_size_hint_min_set(o, mw, mh);
451 cfdata->o_preview = o;
453 e_widget_preview_edje_set(o, cfdata->theme, "e/desktop/background");
454 e_widget_aspect_child_set(oa, o);
455 e_widget_list_object_append(of, oa, 1, 1, 0);
457 evas_object_show(oa);
459 e_widget_table_object_append(ot, of, 1, 0, 1, 1, 1, 1, 1, 1);
461 e_dialog_resizable_set(cfd->dia, 1);
466 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
471 /* Actually take our cfdata settings and apply them in real life */
472 ct = e_theme_config_get("theme");
473 if ((ct) && (!strcmp(ct->file, cfdata->theme))) return 1;
475 e_theme_config_set("theme", cfdata->theme);
476 e_config_save_queue();
478 a = e_action_find("restart");
479 if ((a) && (a->func.go)) a->func.go(NULL, NULL);
480 return 1; /* Apply was OK */
484 * --------------------------------------
485 * --- A D V A N C E D S U P P O R T ---
486 * --------------------------------------
490 _cb_sort(const void *data1, const void *data2)
499 return strcmp(d1, d2);
503 _get_theme_categories_list(void)
505 Eina_List *themes, *tcl = NULL;
506 Eina_List *cats = NULL, *g = NULL, *cats2 = NULL;
510 /* Setup some default theme categories */
511 cats = eina_list_append(cats, eina_stringshare_add("base/theme/about"));
512 cats = eina_list_append(cats, eina_stringshare_add("base/theme/borders"));
513 cats = eina_list_append(cats, eina_stringshare_add("base/theme/background"));
514 cats = eina_list_append(cats, eina_stringshare_add("base/theme/configure"));
515 cats = eina_list_append(cats, eina_stringshare_add("base/theme/dialog"));
516 cats = eina_list_append(cats, eina_stringshare_add("base/theme/dnd"));
517 cats = eina_list_append(cats, eina_stringshare_add("base/theme/error"));
518 cats = eina_list_append(cats, eina_stringshare_add("base/theme/exebuf"));
519 cats = eina_list_append(cats, eina_stringshare_add("base/theme/fileman"));
520 cats = eina_list_append(cats, eina_stringshare_add("base/theme/gadman"));
521 cats = eina_list_append(cats, eina_stringshare_add("base/theme/icons"));
522 cats = eina_list_append(cats, eina_stringshare_add("base/theme/menus"));
523 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules"));
524 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules/pager"));
525 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules/ibar"));
526 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules/ibox"));
527 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules/clock"));
528 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules/battery"));
529 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules/cpufreq"));
530 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules/start"));
531 cats = eina_list_append(cats, eina_stringshare_add("base/theme/modules/temperature"));
532 cats = eina_list_append(cats, eina_stringshare_add("base/theme/pointer"));
533 cats = eina_list_append(cats, eina_stringshare_add("base/theme/shelf"));
534 cats = eina_list_append(cats, eina_stringshare_add("base/theme/transitions"));
535 cats = eina_list_append(cats, eina_stringshare_add("base/theme/widgets"));
536 cats = eina_list_append(cats, eina_stringshare_add("base/theme/winlist"));
538 cats = eina_list_sort(cats, 0, _cb_sort);
541 * Get a list of registered themes.
542 * Add those which are not in the above list
544 EINA_LIST_FOREACH(e_theme_category_list(), g, c)
550 cats2 = eina_list_search_sorted_near_list(cats, _cb_sort, c, &res);
553 cats = eina_list_prepend_relative_list(cats, eina_stringshare_ref(c), cats2);
555 cats = eina_list_append_relative_list(cats, eina_stringshare_ref(c), cats2);
558 EINA_LIST_FREE(cats, category)
560 E_Config_Theme *theme, *newtheme = NULL;
562 /* Not interested in adding "base" */
563 if (strcmp(category, "base"))
565 newtheme = (E_Config_Theme *)malloc(sizeof(E_Config_Theme));
566 if (!newtheme) break;
567 if (!strcmp(category, "base/theme"))
568 newtheme->category = eina_stringshare_add("base/theme/Base Theme");
570 newtheme->category = eina_stringshare_ref(category);
571 newtheme->file = NULL;
573 EINA_LIST_FOREACH(e_config->themes, themes, theme)
575 if (!strcmp(category + 5, theme->category))
577 newtheme->file = eina_stringshare_add(theme->file);
580 tcl = eina_list_append(tcl, newtheme);
582 eina_stringshare_del(category);
589 _files_ilist_nth_label_to_file(void *data, int n)
591 E_Config_Dialog_Data *cfdata;
594 if (!(cfdata = data)) return NULL;
595 if (!cfdata->o_files_ilist) return NULL;
597 if (n > cfdata->personal_file_count)
598 e_prefix_data_snprintf(file, sizeof(file), "data/themes/%s.edj",
599 e_widget_ilist_nth_label_get(cfdata->o_files_ilist, n));
601 e_user_dir_snprintf(file, sizeof(file), "themes/%s.edj",
602 e_widget_ilist_nth_label_get(cfdata->o_files_ilist, n));
604 return eina_stringshare_add(file);
608 _preview_set(void *data)
610 E_Config_Dialog_Data *cfdata;
615 if (!(cfdata = data)) return;
617 n = e_widget_ilist_selected_get(cfdata->o_files_ilist);
618 theme = _files_ilist_nth_label_to_file(cfdata, n);
619 snprintf(c_label, sizeof(c_label), "%s:",
620 e_widget_ilist_selected_label_get(cfdata->o_categories_ilist));
626 for (i = 0; parts_list[i]; i++)
627 if (strstr(parts_list[i], c_label)) break;
630 ret = e_widget_preview_edje_set(cfdata->o_preview, theme,
631 parts_list[i] + strlen(c_label));
633 e_widget_preview_edje_set(cfdata->o_preview, theme,
634 "e/desktop/background");
635 eina_stringshare_del(theme);
640 _cb_adv_categories_change(void *data, Evas_Object *obj __UNUSED__)
642 E_Config_Dialog_Data *cfdata;
643 const char *label = NULL;
644 const char *file = NULL;
646 Eina_List *themes = NULL;
648 Evas_Object *ic = NULL;
651 if (!(cfdata = data)) return;
653 label = e_widget_ilist_selected_label_get(cfdata->o_categories_ilist);
656 n = e_widget_ilist_selected_get(cfdata->o_categories_ilist);
657 ic = e_widget_ilist_nth_icon_get(cfdata->o_categories_ilist, n);
664 snprintf(category, sizeof(category), "base/theme/%s", label);
665 EINA_LIST_FOREACH(cfdata->theme_list, themes, t)
667 if (!strcmp(category, t->category) && (t->file))
675 cnt = e_widget_ilist_count(cfdata->o_files_ilist);
676 for (n = 0; n < cnt; n++)
680 tmp = _files_ilist_nth_label_to_file(cfdata, n);
681 eina_stringshare_del(tmp);
682 if (file == tmp) /* We don't need the value, just the address. */
684 e_widget_ilist_selected_set(cfdata->o_files_ilist, n);
691 _cb_adv_theme_change(void *data, Evas_Object *obj __UNUSED__)
697 _theme_file_used(Eina_List *tlist, const char *filename)
699 E_Config_Theme *theme;
702 if (!filename) return 0;
704 EINA_LIST_FOREACH(tlist, l, theme)
705 if (theme->file == filename) return 1;
711 _ilist_files_add(E_Config_Dialog_Data *cfdata,
712 const char *header, const char *dir,
717 Eina_List *themefiles = NULL;
724 o = cfdata->o_files_ilist;
725 e_widget_ilist_header_append(o, NULL, header);
726 evas = evas_object_evas_get(o);
728 it = eina_file_ls(dir);
732 EINA_ITERATOR_FOREACH(it, file)
733 if (strstr(file, ".edj"))
735 themefiles = eina_list_append(themefiles, file);
739 eina_stringshare_del(file);
742 eina_iterator_free(it);
747 char themename[PATH_MAX];
749 themefiles = eina_list_sort(themefiles, -1, _cb_sort);
750 count = eina_list_count(themefiles);
752 EINA_LIST_FREE(themefiles, theme)
754 Evas_Object *ic = NULL;
756 if (_theme_file_used(cfdata->theme_list, theme))
758 ic = e_icon_add(evas);
759 e_util_icon_theme_set(ic, "preferences-desktop-theme");
761 tmp = strdup(strrchr(theme, '/') + 1);
762 strncpy(themename, tmp, strlen(tmp) - 3);
763 themename[strlen(tmp) - 4] = '\0';
764 e_widget_ilist_append(o, ic, themename, NULL, NULL, NULL);
767 eina_stringshare_del(theme);
776 _fill_files_ilist(E_Config_Dialog_Data *cfdata)
780 char theme_dir[4096];
782 if (!(o = cfdata->o_files_ilist)) return;
784 evas = evas_object_evas_get(o);
785 evas_event_freeze(evas);
787 e_widget_ilist_freeze(o);
788 e_widget_ilist_clear(o);
790 /* Grab the "Personal" themes. */
791 e_user_dir_concat_static(theme_dir, "themes");
792 _ilist_files_add(cfdata, _("Personal"), theme_dir, &cfdata->personal_file_count);
794 /* Grab the "System" themes. */
795 e_prefix_data_concat_static(theme_dir, "data/themes");
796 _ilist_files_add(cfdata, _("System"), theme_dir, NULL);
798 e_widget_ilist_go(o);
799 e_widget_ilist_thaw(o);
801 evas_event_thaw(evas);
805 _fill_categories_ilist(E_Config_Dialog_Data *cfdata)
809 E_Config_Theme *theme;
812 if (!(o = cfdata->o_categories_ilist)) return;
814 evas = evas_object_evas_get(o);
815 evas_event_freeze(evas);
817 e_widget_ilist_freeze(o);
818 e_widget_ilist_clear(o);
820 EINA_LIST_FOREACH(cfdata->theme_list, themes, theme)
822 Evas_Object *ic = NULL;
826 ic = e_icon_add(evas);
827 e_util_icon_theme_set(ic, "dialog-ok-apply");
829 e_widget_ilist_append(o, ic, theme->category + 11, NULL, NULL, NULL);
832 e_widget_ilist_go(o);
833 e_widget_ilist_thaw(o);
835 evas_event_thaw(evas);
839 _cb_adv_btn_assign(void *data1, void *data2 __UNUSED__)
842 E_Config_Dialog_Data *cfdata;
843 E_Config_Theme *newtheme, *t;
845 Evas_Object *ic = NULL, *oc = NULL, *of = NULL;
850 if (!(cfdata = data1)) return;
852 if (!(oc = cfdata->o_categories_ilist)) return;
853 if (!(of = cfdata->o_files_ilist)) return;
855 evas = evas_object_evas_get(oc);
856 n = e_widget_ilist_selected_get(oc);
857 ic = e_icon_add(evas);
858 e_util_icon_theme_set(ic, "enlightenment");
859 e_widget_ilist_nth_icon_set(oc, n, ic);
861 newtheme = malloc(sizeof(E_Config_Theme));
862 if (!newtheme) return;
864 label = e_widget_ilist_selected_label_get(oc);
865 snprintf(buf, sizeof(buf), "base/theme/%s", label);
866 newtheme->category = eina_stringshare_add(buf);
868 n = e_widget_ilist_selected_get(of);
869 ic = e_icon_add(evas);
870 e_util_icon_theme_set(ic, "preferences-desktop-theme");
871 e_widget_ilist_nth_icon_set(of, n, ic);
872 newtheme->file = _files_ilist_nth_label_to_file(cfdata, n);
874 EINA_LIST_FOREACH(cfdata->theme_list, themes, t)
876 const char *filename = NULL;
878 if (!strcmp(t->category, newtheme->category))
880 if ((t->file) && (strcmp(t->file, newtheme->file)))
885 if (!_theme_file_used(cfdata->theme_list, filename))
887 cnt = e_widget_ilist_count(of);
888 for (n = 0; n < cnt; n++)
892 tmp = _files_ilist_nth_label_to_file(cfdata, n);
893 eina_stringshare_del(tmp);
894 if (filename == tmp) /* We just need the pointer, not the value. */
895 e_widget_ilist_nth_icon_set(of, n, NULL);
899 t->file = eina_stringshare_add(newtheme->file);
900 if (filename) eina_stringshare_del(filename);
905 cfdata->theme_list = eina_list_append(cfdata->theme_list, newtheme);
908 eina_stringshare_del(newtheme->category);
909 eina_stringshare_del(newtheme->file);
917 _cb_adv_btn_clear(void *data1, void *data2 __UNUSED__)
919 E_Config_Dialog_Data *cfdata;
922 Evas_Object *oc = NULL, *of = NULL;
925 const char *filename = NULL;
928 if (!(cfdata = data1)) return;
930 if (!(oc = cfdata->o_categories_ilist)) return;
931 if (!(of = cfdata->o_files_ilist)) return;
933 n = e_widget_ilist_selected_get(oc);
934 e_widget_ilist_nth_icon_set(oc, n, NULL);
936 label = e_widget_ilist_selected_label_get(oc);
937 snprintf(cat, sizeof(cat), "base/theme/%s", label);
939 EINA_LIST_FOREACH(cfdata->theme_list, themes, t)
941 if (!strcmp(t->category, cat))
952 if ((filename) && (!_theme_file_used(cfdata->theme_list, filename)))
954 cnt = e_widget_ilist_count(of);
955 for (n = 0; n < cnt; n++)
959 tmp = _files_ilist_nth_label_to_file(cfdata, n);
961 e_widget_ilist_nth_icon_set(of, n, NULL);
962 eina_stringshare_del(tmp);
964 eina_stringshare_del(filename);
971 _cb_adv_btn_clearall(void *data1, void *data2 __UNUSED__)
973 E_Config_Dialog_Data *cfdata;
976 Evas_Object *oc = NULL, *of = NULL;
979 if (!(cfdata = data1)) return;
981 if (!(oc = cfdata->o_categories_ilist)) return;
982 if (!(of = cfdata->o_files_ilist)) return;
984 cnt = e_widget_ilist_count(oc);
985 for (n = 0; n < cnt; n++)
986 e_widget_ilist_nth_icon_set(oc, n, NULL);
988 cnt = e_widget_ilist_count(of);
989 for (n = 0; n < cnt; n++)
990 e_widget_ilist_nth_icon_set(of, n, NULL);
992 EINA_LIST_FOREACH(cfdata->theme_list, themes, t)
994 eina_stringshare_del(t->file);
1001 static Evas_Object *
1002 _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
1004 Evas_Object *ot, *of, *ob, *oa, *ol;
1008 zone = e_zone_current_get(cfd->con);
1009 ot = e_widget_table_add(evas, 0);
1011 of = e_widget_framelist_add(evas, _("Theme Categories"), 0);
1012 ob = e_widget_ilist_add(evas, 16, 16, NULL);
1013 e_widget_on_change_hook_set(ob, _cb_adv_categories_change, cfdata);
1014 cfdata->o_categories_ilist = ob;
1015 e_widget_ilist_multi_select_set(ob, 0);
1016 e_widget_size_min_set(ob, 150, 250);
1017 e_widget_framelist_object_append(of, ob);
1018 e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 0, 1);
1020 of = e_widget_framelist_add(evas, _("Themes"), 0);
1021 ob = e_widget_ilist_add(evas, 16, 16, NULL);
1022 e_widget_on_change_hook_set(ob, _cb_adv_theme_change, cfdata);
1023 cfdata->o_files_ilist = ob;
1024 e_widget_size_min_set(ob, 150, 250);
1025 e_widget_framelist_object_append(of, ob);
1026 e_widget_table_object_append(ot, of, 1, 0, 1, 1, 1, 1, 1, 1);
1028 ol = e_widget_list_add(evas, 1, 1);
1029 ob = e_widget_button_add(evas, _("Assign"), NULL,
1030 _cb_adv_btn_assign, cfdata, NULL);
1031 e_widget_list_object_append(ol, ob, 1, 0, 0.5);
1032 ob = e_widget_button_add(evas, _("Clear"), NULL,
1033 _cb_adv_btn_clear, cfdata, NULL);
1034 e_widget_list_object_append(ol, ob, 1, 0, 0.5);
1035 ob = e_widget_button_add(evas, _("Clear All"), NULL,
1036 _cb_adv_btn_clearall, cfdata, NULL);
1037 e_widget_list_object_append(ol, ob, 1, 0, 0.5);
1038 e_widget_table_object_append(ot, ol, 0, 1, 1, 1, 1, 0, 0, 0);
1040 of = e_widget_framelist_add(evas, _("Preview"), 0);
1042 mh = (mw * zone->h) / zone->w;
1043 oa = e_widget_aspect_add(evas, mw, mh);
1044 ob = e_widget_preview_add(evas, mw, mh);
1045 cfdata->o_preview = ob;
1047 e_widget_preview_edje_set(ob, cfdata->theme, "e/desktop/background");
1048 e_widget_aspect_child_set(oa, ob);
1049 e_widget_framelist_object_append(of, oa);
1050 e_widget_table_object_append(ot, of, 2, 0, 1, 1, 1, 1, 1, 1);
1052 _fill_files_ilist(cfdata);
1053 _fill_categories_ilist(cfdata);
1055 e_widget_ilist_selected_set(cfdata->o_files_ilist, 1);
1056 e_widget_ilist_selected_set(cfdata->o_categories_ilist, 0);
1058 /* FIXME this makes the preview disappear at the beginning and
1059 when resizing (Issue is caused by e_widget_aspect i guess) */
1060 // e_dialog_resizable_set(cfd->dia, 1);
1065 _advanced_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
1067 E_Config_Theme *theme;
1071 EINA_LIST_FOREACH(cfdata->theme_list, themes, theme)
1073 E_Config_Theme *ec_theme;
1074 Eina_List *ec_themes;
1076 if (!strcmp(theme->category, "base/theme/Base Theme"))
1077 theme->category = eina_stringshare_add("base/theme");
1079 EINA_LIST_FOREACH(e_config->themes, ec_themes, ec_theme)
1081 if (!strcmp(theme->category + 5, ec_theme->category))
1084 e_theme_config_set(theme->category + 5, theme->file);
1086 e_theme_config_remove(theme->category + 5);
1090 if ((!ec_themes) && (theme->file))
1091 e_theme_config_set(theme->category + 5, theme->file);
1094 e_config_save_queue();
1096 a = e_action_find("restart");
1097 if ((a) && (a->func.go)) a->func.go(NULL, NULL);