terminology/src/bin/options_theme.c

202 lines
5.2 KiB
C
Raw Normal View History

#include "private.h"
#include <Elementary.h>
#include "config.h"
#include "termio.h"
#include "options.h"
#include "options_theme.h"
#include "options_themepv.h"
#include "utils.h"
#include "main.h"
typedef struct _Theme Theme;
struct _Theme
{
Elm_Object_Item *item;
const char *name;
Evas_Object *term;
};
static Evas_Object *op_themelist;
static Eina_List *themes = NULL;
static Ecore_Timer *seltimer = NULL;
static char *
2013-08-27 06:36:50 -07:00
_cb_op_theme_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
{
Theme *t = data;
char buf[4096], *p;
eina_strlcpy(buf, t->name, sizeof(buf));
p = strrchr(buf, '.');
if (p) *p = 0;
return strdup(buf);
}
static Evas_Object *
_cb_op_theme_content_get(void *data, Evas_Object *obj, const char *part)
{
Theme *t = data;
if (!strcmp(part, "elm.swallow.icon"))
{
Evas_Object *o;
char buf[4096];
Config *config = termio_config_get(t->term);
if (config)
{
snprintf(buf, sizeof(buf), "%s/themes/%s",
elm_app_data_dir_get(), t->name);
o = options_theme_preview_add(obj, config, buf,
128 * elm_config_scale_get(),
64 * elm_config_scale_get());
2013-10-11 22:18:08 -07:00
return o;
}
}
return NULL;
}
static void
2013-08-27 06:36:50 -07:00
_cb_op_theme_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
Theme *t = data;
Config *config = termio_config_get(t->term);
if ((config->theme) && (!strcmp(t->name, config->theme)))
return;
eina_stringshare_replace(&(config->theme), t->name);
config_save(config, NULL);
change_theme(termio_win_get(t->term), config);
}
static int
_cb_op_theme_sort(const void *d1, const void *d2)
{
return strcasecmp(d1, d2);
}
static Eina_Bool
_cb_sel_item(void *data)
{
Theme *t = data;
if (t)
{
elm_gengrid_item_selected_set(t->item, EINA_TRUE);
elm_gengrid_item_bring_in(t->item, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE);
}
seltimer = NULL;
return EINA_FALSE;
}
void
options_theme(Evas_Object *opbox, Evas_Object *term)
{
Evas_Object *o, *box, *fr;
Elm_Gengrid_Item_Class *it_class;
Eina_List *files;
char buf[4096], *file;
Theme *t;
Config *config = termio_config_get(term);
options_theme_clear();
fr = o = elm_frame_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(o, "Theme");
elm_box_pack_end(opbox, o);
evas_object_show(o);
box = o = elm_box_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_horizontal_set(o, EINA_TRUE);
elm_object_content_set(fr, o);
evas_object_show(o);
it_class = elm_gengrid_item_class_new();
it_class->item_style = "thumb";
it_class->func.text_get = _cb_op_theme_text_get;
it_class->func.content_get = _cb_op_theme_content_get;
op_themelist = o = elm_gengrid_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_gengrid_item_size_set(o,
elm_config_scale_get() * 160,
elm_config_scale_get() * 180);
snprintf(buf, sizeof(buf), "%s/themes", elm_app_data_dir_get());
files = ecore_file_ls(buf);
if (files)
files = eina_list_sort(files, eina_list_count(files),
_cb_op_theme_sort);
if (seltimer)
{
ecore_timer_del(seltimer);
seltimer = NULL;
}
EINA_LIST_FREE(files, file)
{
const char *ext = strchr(file, '.');
2013-10-14 14:22:19 -07:00
if ((config) && (file[0] != '.') &&
((ext) && (!strcasecmp(".edj", ext))))
{
t = calloc(1, sizeof(Theme));
t->name = eina_stringshare_add(file);
t->term = term;
t->item = elm_gengrid_item_append(o, it_class, t,
_cb_op_theme_sel, t);
if (t->item)
{
themes = eina_list_append(themes, t);
if ((config->theme) &&
(!strcmp(config->theme, t->name)))
{
if (seltimer) ecore_timer_del(seltimer);
seltimer = ecore_timer_add(0.2, _cb_sel_item, t);
}
}
else
{
eina_stringshare_del(t->name);
free(t);
}
}
free(file);
}
elm_gengrid_item_class_free(it_class);
elm_box_pack_end(box, o);
evas_object_size_hint_weight_set(opbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(opbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(o);
}
void
options_theme_clear(void)
{
Theme *t;
op_themelist = NULL;
if (seltimer)
{
ecore_timer_del(seltimer);
seltimer = NULL;
}
EINA_LIST_FREE(themes, t)
{
eina_stringshare_del(t->name);
free(t);
}
}