improved icon theme, with nice previews!

preview couple of icons at bottom, and try harder to find an icon for
the list item, otherwise just skip the theme as it is not worth.



SVN revision: 47070
This commit is contained in:
Gustavo Sverzut Barbieri 2010-03-09 02:46:07 +00:00
parent 78e5959bdf
commit 3c5b485a98
2 changed files with 100 additions and 28 deletions

View File

@ -10,6 +10,7 @@ static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static int _sort_icon_themes(const void *data1, const void *data2);
static Evas_Object *_icon_new(Evas *evas, const char *theme, const char *icon, unsigned int size);
struct _E_Config_Dialog_Data
{
@ -17,13 +18,24 @@ struct _E_Config_Dialog_Data
Eina_List *icon_themes;
const char *themename;
int overrides;
int populating;
struct {
Evas_Object *list;
Evas_Object *checkbox;
Evas_Object *preview[4]; /* same size as _icon_previews */
} gui;
Ecore_Idler *fill_icon_themes_delayed;
};
static const char *_icon_previews[4] = {
"system-run",
"system-file-manager",
"preferences-desktop-theme",
"text-x-generic"
};
#define PREVIEW_SIZE (48)
E_Config_Dialog *
e_int_config_icon_themes(E_Container *con, const char *params __UNUSED__)
{
@ -121,6 +133,20 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
return 1;
}
static void
_populate_preview(E_Config_Dialog_Data *cfdata)
{
const char *t = cfdata->themename;
unsigned int i;
for (i = 0; i < sizeof(_icon_previews)/sizeof(_icon_previews[0]); i++)
{
char *path = efreet_icon_path_find(t, _icon_previews[i], PREVIEW_SIZE);
if (e_icon_file_set(cfdata->gui.preview[i], path))
e_icon_fill_inside_set(cfdata->gui.preview[i], EINA_TRUE);
free(path);
}
}
struct _fill_icon_themes_data
{
Eina_List *l;
@ -136,6 +162,15 @@ _fill_icon_themes(void *data)
struct _fill_icon_themes_data *d = data;
Efreet_Icon_Theme *theme;
Evas_Object *oc = NULL;
const char **example_icon, *example_icons[] = {
NULL,
"folder",
"user-home",
"text-x-generic",
"system-run",
"preferences-system",
NULL,
};
if (!d->themes_loaded)
{
@ -151,6 +186,8 @@ _fill_icon_themes(void *data)
{
e_widget_ilist_go(d->cfdata->gui.list);
d->cfdata->fill_icon_themes_delayed = NULL;
d->cfdata->populating = EINA_FALSE;
_populate_preview(d->cfdata);
free(d);
return 0;
}
@ -158,55 +195,70 @@ _fill_icon_themes(void *data)
theme = d->l->data;
if (theme->example_icon)
{
char *path;
path = efreet_icon_path_find(theme->name.internal, theme->example_icon, 24);
if (path)
{
oc = e_icon_add(d->evas);
e_icon_file_set(oc, path);
e_icon_fill_inside_set(oc, 1);
free(path);
}
example_icons[0] = theme->example_icon;
example_icon = example_icons;
}
else
{
example_icon = example_icons + 1;
}
for (; (*example_icon) && (!oc); example_icon++)
oc = _icon_new(d->evas, theme->name.internal, *example_icon, 24);
if (oc)
{
e_widget_ilist_append(d->cfdata->gui.list, oc, theme->name.name,
NULL, NULL, theme->name.internal);
if ((d->cfdata->themename) && (theme->name.internal) &&
(strcmp(d->cfdata->themename, theme->name.internal) == 0))
e_widget_ilist_selected_set(d->cfdata->gui.list, d->i);
}
e_widget_ilist_append(d->cfdata->gui.list, oc, theme->name.name,
NULL, NULL, theme->name.internal);
if ((d->cfdata->themename) && (theme->name.internal) &&
(strcmp(d->cfdata->themename, theme->name.internal) == 0))
e_widget_ilist_selected_set(d->cfdata->gui.list, d->i);
d->i++;
d->l = d->l->next;
return 1;
}
static void
_icon_theme_changed(void *data, Evas_Object *o __UNUSED__)
{
E_Config_Dialog_Data *cfdata = data;
if (cfdata->populating) return;
_populate_preview(cfdata);
}
static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *o, *ilist, *of, *checkbox;
Evas_Object *o, *ilist, *checkbox, *ol;
struct _fill_icon_themes_data *d;
Evas_Coord mw, mh;
unsigned int i;
o = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Icon Themes"), 0);
ilist = e_widget_ilist_add(evas, 24, 24, &(cfdata->themename));
cfdata->gui.list = ilist;
e_widget_size_min_set(ilist, 200, 240);
cfdata->populating = EINA_TRUE;
e_widget_on_change_hook_set(ilist, _icon_theme_changed, cfdata);
e_widget_list_object_append(o, ilist, 1, 1, 0.5);
e_widget_framelist_object_append(of, ilist);
ol = e_widget_framelist_add(evas, _("Preview"), 1);
for (i = 0; i < sizeof(_icon_previews)/sizeof(_icon_previews[0]); i++)
{
cfdata->gui.preview[i] = e_icon_add(evas);
e_widget_framelist_object_append_full
(ol, cfdata->gui.preview[i], 0, 0, 0, 0, 0.5, 0.5,
PREVIEW_SIZE, PREVIEW_SIZE, PREVIEW_SIZE, PREVIEW_SIZE);
}
e_widget_list_object_append(o, ol, 0, 0, 0.5);
checkbox = e_widget_check_add(evas, _("This overrides general theme"), &(cfdata->overrides));
e_widget_size_min_get(checkbox, &mw, &mh);
e_widget_framelist_object_append_full(of, checkbox,
1, 1, /* fill */
1, 0, /* expand */
0.5, 0.5, /* align */
mw, mh, /* min */
99999, 99999 /* max */
);
e_widget_list_object_append(o, checkbox, 0, 0, 0.0);
e_widget_list_object_append(o, of, 1, 1, 0.5);
e_dialog_resizable_set(cfd->dia, 1);
if (cfdata->fill_icon_themes_delayed)
@ -237,3 +289,23 @@ _sort_icon_themes(const void *data1, const void *data2)
return (strcmp(m1->name.name, m2->name.name));
}
static Evas_Object *
_icon_new(Evas *evas, const char *theme, const char *icon, unsigned int size)
{
Evas_Object *o;
char *path = efreet_icon_path_find(theme, icon, size);
if (!path) return NULL;
o = e_icon_add(evas);
if (e_icon_file_set(o, path))
e_icon_fill_inside_set(o, 1);
else
{
evas_object_del(o);
o = NULL;
}
free(path);
return o;
}

View File

@ -26,7 +26,7 @@ e_modapi_init(E_Module *m)
}
EAPI int
e_modapi_shutdown(E_Module *m)
e_modapi_shutdown(E_Module *m __UNUSED__)
{
E_Config_Dialog *cfd;
@ -38,7 +38,7 @@ e_modapi_shutdown(E_Module *m)
}
EAPI int
e_modapi_save(E_Module *m)
e_modapi_save(E_Module *m __UNUSED__)
{
return 1;
}