options_theme: be able to have multiple instances
This commit is contained in:
parent
8b26cd4149
commit
64502fa8f3
|
@ -79,7 +79,6 @@ _cb_op_del_delay(void *data)
|
||||||
|
|
||||||
evas_object_del(ctx->opbox);
|
evas_object_del(ctx->opbox);
|
||||||
evas_object_del(ctx->frame);
|
evas_object_del(ctx->frame);
|
||||||
options_theme_clear();
|
|
||||||
|
|
||||||
free(ctx);
|
free(ctx);
|
||||||
elm_cache_all_flush();
|
elm_cache_all_flush();
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <Elementary.h>
|
#include <Elementary.h>
|
||||||
#include <Efreet.h>
|
#include <Efreet.h>
|
||||||
|
#include <assert.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "termio.h"
|
#include "termio.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
@ -10,18 +11,23 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
|
typedef struct _Theme_Ctx
|
||||||
|
{
|
||||||
|
Evas_Object *term;
|
||||||
|
Config *config;
|
||||||
|
Evas_Object *op_themelist;
|
||||||
|
Eina_List *themes;
|
||||||
|
Ecore_Timer *seltimer;
|
||||||
|
} Theme_Ctx;
|
||||||
|
|
||||||
typedef struct _Theme Theme;
|
typedef struct _Theme Theme;
|
||||||
struct _Theme
|
struct _Theme
|
||||||
{
|
{
|
||||||
Elm_Object_Item *item;
|
Elm_Object_Item *item;
|
||||||
const char *name;
|
const char *name;
|
||||||
Evas_Object *term;
|
Theme_Ctx *ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
static Evas_Object *op_themelist;
|
|
||||||
static Eina_List *themes = NULL;
|
|
||||||
static Ecore_Timer *seltimer = NULL;
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
_cb_op_theme_text_get(void *data,
|
_cb_op_theme_text_get(void *data,
|
||||||
Evas_Object *_obj EINA_UNUSED,
|
Evas_Object *_obj EINA_UNUSED,
|
||||||
|
@ -32,7 +38,8 @@ _cb_op_theme_text_get(void *data,
|
||||||
|
|
||||||
eina_strlcpy(buf, t->name, sizeof(buf));
|
eina_strlcpy(buf, t->name, sizeof(buf));
|
||||||
p = strrchr(buf, '.');
|
p = strrchr(buf, '.');
|
||||||
if (p) *p = 0;
|
if (p)
|
||||||
|
*p = 0;
|
||||||
|
|
||||||
return strdup(buf);
|
return strdup(buf);
|
||||||
}
|
}
|
||||||
|
@ -45,7 +52,7 @@ _cb_op_theme_content_get(void *data, Evas_Object *obj, const char *part)
|
||||||
if (!strcmp(part, "elm.swallow.icon"))
|
if (!strcmp(part, "elm.swallow.icon"))
|
||||||
{
|
{
|
||||||
Evas_Object *o;
|
Evas_Object *o;
|
||||||
Config *config = termio_config_get(t->term);
|
Config *config = t->ctx->config;
|
||||||
|
|
||||||
if (config)
|
if (config)
|
||||||
{
|
{
|
||||||
|
@ -66,14 +73,14 @@ _cb_op_theme_sel(void *data,
|
||||||
void *_event EINA_UNUSED)
|
void *_event EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Theme *t = data;
|
Theme *t = data;
|
||||||
Config *config = termio_config_get(t->term);
|
Config *config = t->ctx->config;
|
||||||
|
|
||||||
if ((config->theme) && (!strcmp(t->name, config->theme)))
|
if ((config->theme) && (!strcmp(t->name, config->theme)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
eina_stringshare_replace(&(config->theme), t->name);
|
eina_stringshare_replace(&(config->theme), t->name);
|
||||||
config_save(config, NULL);
|
config_save(config, NULL);
|
||||||
change_theme(termio_win_get(t->term), config);
|
change_theme(termio_win_get(t->ctx->term), config);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -92,10 +99,35 @@ _cb_sel_item(void *data)
|
||||||
elm_gengrid_item_selected_set(t->item, EINA_TRUE);
|
elm_gengrid_item_selected_set(t->item, EINA_TRUE);
|
||||||
elm_gengrid_item_bring_in(t->item, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE);
|
elm_gengrid_item_bring_in(t->item, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE);
|
||||||
}
|
}
|
||||||
seltimer = NULL;
|
t->ctx->seltimer = NULL;
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_parent_del_cb(void *data,
|
||||||
|
Evas *_e EINA_UNUSED,
|
||||||
|
Evas_Object *_obj EINA_UNUSED,
|
||||||
|
void *_event_info EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Theme_Ctx *ctx = data;
|
||||||
|
Theme *t;
|
||||||
|
|
||||||
|
ctx->op_themelist = NULL;
|
||||||
|
|
||||||
|
if (ctx->seltimer)
|
||||||
|
{
|
||||||
|
ecore_timer_del(ctx->seltimer);
|
||||||
|
ctx->seltimer = NULL;
|
||||||
|
}
|
||||||
|
EINA_LIST_FREE(ctx->themes, t)
|
||||||
|
{
|
||||||
|
eina_stringshare_del(t->name);
|
||||||
|
free(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
options_theme(Evas_Object *opbox, Evas_Object *term)
|
options_theme(Evas_Object *opbox, Evas_Object *term)
|
||||||
{
|
{
|
||||||
|
@ -108,8 +140,13 @@ options_theme(Evas_Object *opbox, Evas_Object *term)
|
||||||
Config *config = termio_config_get(term);
|
Config *config = termio_config_get(term);
|
||||||
Eina_Bool to_skip = EINA_FALSE;
|
Eina_Bool to_skip = EINA_FALSE;
|
||||||
double scale = elm_config_scale_get();
|
double scale = elm_config_scale_get();
|
||||||
|
Theme_Ctx *ctx;
|
||||||
|
|
||||||
options_theme_clear();
|
ctx = calloc(1, sizeof(*ctx));
|
||||||
|
assert(ctx);
|
||||||
|
|
||||||
|
ctx->config = config;
|
||||||
|
ctx->term = term;
|
||||||
|
|
||||||
fr = o = elm_frame_add(opbox);
|
fr = o = elm_frame_add(opbox);
|
||||||
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||||
|
@ -118,6 +155,9 @@ options_theme(Evas_Object *opbox, Evas_Object *term)
|
||||||
elm_box_pack_end(opbox, o);
|
elm_box_pack_end(opbox, o);
|
||||||
evas_object_show(o);
|
evas_object_show(o);
|
||||||
|
|
||||||
|
evas_object_event_callback_add(fr, EVAS_CALLBACK_DEL,
|
||||||
|
_parent_del_cb, ctx);
|
||||||
|
|
||||||
box = o = elm_box_add(opbox);
|
box = o = elm_box_add(opbox);
|
||||||
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
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);
|
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||||
|
@ -130,7 +170,7 @@ options_theme(Evas_Object *opbox, Evas_Object *term)
|
||||||
it_class->func.text_get = _cb_op_theme_text_get;
|
it_class->func.text_get = _cb_op_theme_text_get;
|
||||||
it_class->func.content_get = _cb_op_theme_content_get;
|
it_class->func.content_get = _cb_op_theme_content_get;
|
||||||
|
|
||||||
op_themelist = o = elm_gengrid_add(opbox);
|
ctx->op_themelist = o = elm_gengrid_add(opbox);
|
||||||
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
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);
|
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||||
elm_gengrid_item_size_set(o, scale * 160, scale * 180);
|
elm_gengrid_item_size_set(o, scale * 160, scale * 180);
|
||||||
|
@ -152,10 +192,10 @@ options_theme(Evas_Object *opbox, Evas_Object *term)
|
||||||
else if (userfiles)
|
else if (userfiles)
|
||||||
files = userfiles;
|
files = userfiles;
|
||||||
|
|
||||||
if (seltimer)
|
if (ctx->seltimer)
|
||||||
{
|
{
|
||||||
ecore_timer_del(seltimer);
|
ecore_timer_del(ctx->seltimer);
|
||||||
seltimer = NULL;
|
ctx->seltimer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
EINA_LIST_FOREACH_SAFE(files, l, l_next, file)
|
EINA_LIST_FOREACH_SAFE(files, l, l_next, file)
|
||||||
|
@ -185,19 +225,21 @@ options_theme(Evas_Object *opbox, Evas_Object *term)
|
||||||
}
|
}
|
||||||
|
|
||||||
t = calloc(1, sizeof(Theme));
|
t = calloc(1, sizeof(Theme));
|
||||||
if (!t) break;
|
if (!t)
|
||||||
|
break;
|
||||||
t->name = eina_stringshare_add(file);
|
t->name = eina_stringshare_add(file);
|
||||||
t->term = term;
|
t->ctx = ctx;
|
||||||
t->item = elm_gengrid_item_append(o, it_class, t,
|
t->item = elm_gengrid_item_append(o, it_class, t,
|
||||||
_cb_op_theme_sel, t);
|
_cb_op_theme_sel, t);
|
||||||
if (t->item)
|
if (t->item)
|
||||||
{
|
{
|
||||||
themes = eina_list_append(themes, t);
|
ctx->themes = eina_list_append(ctx->themes, t);
|
||||||
if ((config) && (config->theme) &&
|
if ((config) && (config->theme) &&
|
||||||
(!strcmp(config->theme, t->name)))
|
(!strcmp(config->theme, t->name)))
|
||||||
{
|
{
|
||||||
if (seltimer) ecore_timer_del(seltimer);
|
if (ctx->seltimer)
|
||||||
seltimer = ecore_timer_add(0.2, _cb_sel_item, t);
|
ecore_timer_del(ctx->seltimer);
|
||||||
|
ctx->seltimer = ecore_timer_add(0.2, _cb_sel_item, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -217,22 +259,3 @@ options_theme(Evas_Object *opbox, Evas_Object *term)
|
||||||
evas_object_size_hint_align_set(opbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
evas_object_size_hint_align_set(opbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||||
evas_object_show(o);
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#ifndef _OPTIONS_THEME_H__
|
#ifndef _OPTIONS_THEME_H__
|
||||||
#define _OPTIONS_THEME_H__ 1
|
#define _OPTIONS_THEME_H__ 1
|
||||||
|
|
||||||
void options_theme_clear(void);
|
|
||||||
void options_theme(Evas_Object *opbox, Evas_Object *term);
|
void options_theme(Evas_Object *opbox, Evas_Object *term);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue