entrance: first step to split configuration panel code, create a generic interface to build config panel

This commit is contained in:
Michael Bouchaud 2014-03-20 00:40:12 +00:00
parent 0ef9b100c7
commit 7607e486ad
1 changed files with 239 additions and 696 deletions

View File

@ -1,70 +1,114 @@
#include "entrance_client.h"
typedef struct Entrance_Conf_Background_
typedef struct Entrance_Conf_Module_
{
const char *path;
const char *group;
const char *name;
} Entrance_Conf_Background;
const char *label;
Entrance_Conf_Begin begin;
Entrance_Conf_End end;
Entrance_Conf_Build build;
Entrance_Conf_Check check;
Entrance_Conf_Apply apply;
Elm_Object_Item *item;
} Entrance_Conf_Module;
typedef struct Entrance_Int_Conf_
{
struct
{
Evas_Object *preview;
const char *path;
const char *group;
} bg;
const char *theme;
const char *elm_profile;
Eina_Bool vkbd_enabled : 1;
double scale;
Eina_Bool update : 1;
struct
{
Entrance_Login *orig;
struct
{
Evas_Object *preview;
const char *path;
const char *group;
} bg;
struct
{
const char *path;
const char *group;
} image;
const char *lsess;
Eina_Bool remember_session : 1;
Eina_Bool update : 1;
} user;
struct
{
Evas_Object *btn_ok;
Evas_Object *btn_apply;
} gui;
Evas_Object *btn_ok;
Evas_Object *btn_apply;
Eina_List *modules;
Entrance_Conf_Module *current;
Entrance_Fill *background_fill;
} Entrance_Int_Conf;
static void _entrance_conf_init(void);
static void _entrance_conf_shutdown(void);
static void _entrance_conf_build(Evas_Object *naviframe, Evas_Object *segment);
static void _entrance_conf_apply(void);
static void _entrance_conf_end(Evas_Object *win);
static void _entrance_conf_promote(Entrance_Conf_Module *conf);
static void _entrance_conf_control_changed(void *data, Evas_Object *obj, void *event);
static void _entrance_conf_ok_clicked(void *data, Evas_Object *obj, void *event);
static void _entrance_conf_apply_clicked(void *data, Evas_Object *obj, void *event);
static void _entrance_conf_close_clicked(void *data, Evas_Object *obj, void *event);
static char *_entrance_conf_bg_text_get(void *data, Evas_Object *obj, const char *part);
static Evas_Object *_entrance_conf_bg_content_get(void *data, Evas_Object *obj, const char *part);
static Eina_Bool _entrance_conf_bg_state_get(void *data, Evas_Object *obj, const char *part);
static void _entrance_conf_bg_sel(void *data, Evas_Object *obj, void *event_info);
static Eina_Bool _entrance_conf_bg_fill_cb(void *data, Elm_Object_Item *it);
static Eina_Bool _entrance_conf_user_bg_fill_cb(void *data, Elm_Object_Item *it);
static void _entrance_conf_user_bg_sel(void *data, Evas_Object *obj, void *event_info);
static void _entrance_conf_changed(void);
static void _entrance_conf_apply(void);
static Evas_Object *_entrance_conf_user_build(Evas_Object *obj);
static void _entrance_conf_user_build_cb(Evas_Object *t, Entrance_Login *eu);
static void _entrance_conf_bg_del(void *data, Evas_Object *obj);
static Entrance_Fill *_entrance_background_fill = NULL;
static Entrance_Fill *_entrance_session_fill = NULL;
static Entrance_Int_Conf *_entrance_int_conf = NULL;
static Entrance_Int_Conf *_entrance_conf = NULL;
static void
_entrance_conf_build(Evas_Object *naviframe, Evas_Object *segment)
{
Entrance_Conf_Module *conf;
Eina_List *l;
Evas_Object *o;
Elm_Object_Item *it, *itc;
EINA_LIST_FOREACH(_entrance_conf->modules, l, conf)
{
o = conf->build(naviframe);
it = elm_naviframe_item_simple_push(naviframe, o);
itc = elm_segment_control_item_add(segment, NULL, conf->label);
conf->item = it;
elm_object_item_data_set(itc, conf);
if (!_entrance_conf->current)
_entrance_conf_promote(conf);
}
}
static void
_entrance_conf_apply(void)
{
_entrance_conf->current->apply();
}
static void
_entrance_conf_end(Evas_Object *win)
{
Entrance_Conf_Module *conf;
Eina_List *l;
PT("Delete config panel\n");
evas_object_del(win);
EINA_LIST_FOREACH(_entrance_conf->modules, l, conf)
conf->end();
_entrance_conf->current = NULL;
}
static void
_entrance_conf_promote(Entrance_Conf_Module *conf)
{
elm_naviframe_item_promote(conf->item);
_entrance_conf->current = conf;
}
static void
_entrance_conf_control_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event)
{
Elm_Object_Item *it;
it = event;
_entrance_conf_promote(elm_object_item_data_get(it));
}
static void
_entrance_conf_ok_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
_entrance_conf_apply();
_entrance_conf_end(data);
}
static void
_entrance_conf_apply_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
_entrance_conf_apply();
entrance_conf_changed();
}
static void
_entrance_conf_close_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
_entrance_conf_end(data);
}
static char *
_entrance_conf_bg_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
@ -109,150 +153,160 @@ _entrance_conf_bg_del(void *data, Evas_Object *obj EINA_UNUSED)
free(cbg);
}
static void
_entrance_conf_bg_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
void
entrance_conf_init(void)
{
Entrance_Conf_Background *cbg;
cbg = elm_object_item_data_get(event_info);
if (!elm_layout_file_set(_entrance_int_conf->bg.preview,
cbg->path, cbg->group))
PT("conf init\n");
_entrance_conf = calloc(1, sizeof(Entrance_Int_Conf));
_entrance_conf->background_fill =
entrance_fill_new("default",
_entrance_conf_bg_text_get,
_entrance_conf_bg_content_get,
_entrance_conf_bg_state_get,
_entrance_conf_bg_del);
entrance_conf_main_init();
entrance_conf_user_init();
}
void
entrance_conf_shutdown(void)
{
Entrance_Conf_Module *conf;
PT("conf shutdown\n");
entrance_conf_user_shutdown();
entrance_conf_main_shutdown();
EINA_LIST_FREE(_entrance_conf->modules, conf)
{
PT("Error on loading ");
fprintf(stderr, "%s %s\n", cbg->path, cbg->group);
eina_stringshare_del(conf->label);
free(conf);
}
_entrance_int_conf->bg.path = cbg->path;
_entrance_int_conf->bg.group = cbg->group;
_entrance_conf_changed();
free(_entrance_conf);
}
static Eina_Bool
_entrance_conf_bg_fill_cb(void *data, Elm_Object_Item *it)
void
entrance_conf_module_register(const char *label, Entrance_Conf_Begin begin, Entrance_Conf_End end, Entrance_Conf_Build build, Entrance_Conf_Check check, Entrance_Conf_Apply apply)
{
Entrance_Conf_Background *cbg;
const char *bg_path, *bg_group;
cbg = data;
Entrance_Conf_Module *conf;
conf = calloc(1, sizeof(Entrance_Conf_Module));
conf->label = eina_stringshare_add(label);
conf->begin = begin;
conf->end = end;
conf->build = build;
conf->check = check;
conf->apply = apply;
_entrance_conf->modules = eina_list_append(_entrance_conf->modules, conf);
}
void
entrance_conf_begin(Evas_Object *obj, Evas_Object *parent)
{
PT("Build config panel\n");
Evas_Object *win, *bg, *bx, *hbx, *sc, *nf, *o;
Entrance_Conf_Module *conf;
Eina_List *l;
EINA_LIST_FOREACH(_entrance_conf->modules, l, conf)
conf->begin();
win = elm_hover_add(obj);
elm_hover_parent_set(win, parent);
// win = elm_popup_add(obj);
bg = elm_bg_add(win);
bx = elm_box_add(win);
evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_content_set(win, bx);
sc = elm_segment_control_add(bx);
evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, sc);
evas_object_smart_callback_add(sc, "changed",
_entrance_conf_control_changed, NULL);
evas_object_show(sc);
nf = elm_naviframe_add(bx);
evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, nf);
evas_object_show(nf);
/* Ok Apply Close */
hbx = elm_box_add(bx);
elm_box_horizontal_set(hbx, EINA_TRUE);
elm_box_homogeneous_set(hbx, EINA_TRUE);
evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, hbx);
evas_object_show(hbx);
o = elm_button_add(hbx);
elm_object_text_set(o, "Ok");
elm_object_disabled_set(o, EINA_TRUE);
evas_object_smart_callback_add(o, "clicked",
_entrance_conf_ok_clicked, win);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(hbx, o);
_entrance_conf->btn_ok = o;
evas_object_show(o);
o = elm_button_add(hbx);
elm_object_text_set(o, "Apply");
elm_object_disabled_set(o, EINA_TRUE);
evas_object_smart_callback_add(o, "clicked",
_entrance_conf_apply_clicked, NULL);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(hbx, o);
_entrance_conf->btn_apply = o;
evas_object_show(o);
o = elm_button_add(hbx);
elm_object_text_set(o, "Close");
evas_object_smart_callback_add(o, "clicked",
_entrance_conf_close_clicked, win);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(hbx, o);
evas_object_show(o);
/* Build configuration panel */
_entrance_conf_build(nf, sc);
entrance_gui_background_get(&bg_path, &bg_group);
if ((cbg->path)
&& (cbg->group)
&& (bg_path)
&& (bg_group)
&& (!strcmp(cbg->path, bg_path))
&& (!strcmp(cbg->group, bg_group)))
{
elm_genlist_item_selected_set(it, EINA_TRUE);
return EINA_TRUE;
Evas_Coord xx, yy, ww, hh, x, y, w, h;
evas_object_geometry_get(obj, &x, &y, &w, &h);
evas_object_geometry_get(bx, NULL, NULL, &ww, &hh);
xx = 50;//x + (w / 2) - (ww / 2);
yy = 50;//y + (y / 2) - (hh / 2);
evas_object_move(bg, xx, yy);
evas_object_resize(bg, w - 100, h - 100);
evas_object_move(bx, xx, yy);
evas_object_resize(bx, w - 100, h - 100);
}
return EINA_FALSE;
evas_object_show(bg);
evas_object_show(bx);
evas_object_show(win);
evas_object_freeze_events_set(win, EINA_TRUE);
}
static void
_entrance_conf_user_bg_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
void
entrance_conf_changed(void)
{
Entrance_Conf_Background *cbg;
cbg = elm_object_item_data_get(event_info);
if (!elm_layout_file_set(_entrance_int_conf->user.bg.preview,
cbg->path, cbg->group))
if (_entrance_conf->current && _entrance_conf->current->check())
{
PT("Error on loading ");
fprintf(stderr, "%s %s\n", cbg->path, cbg->group);
elm_object_disabled_set(_entrance_conf->btn_ok, EINA_FALSE);
elm_object_disabled_set(_entrance_conf->btn_apply, EINA_FALSE);
}
_entrance_int_conf->user.bg.path = cbg->path;
_entrance_int_conf->user.bg.group = cbg->group;
_entrance_conf_changed();
}
static Eina_Bool
_entrance_conf_user_bg_fill_cb(void *data, Elm_Object_Item *it)
{
Entrance_Conf_Background *cbg;
const char *bg_path, *bg_group;
cbg = data;
bg_path = _entrance_int_conf->user.orig->bg.path;
bg_group = _entrance_int_conf->user.orig->bg.group;
if ((cbg->path)
&& (cbg->group)
&& (bg_path)
&& (bg_group)
&& (!strcmp(cbg->path, bg_path))
&& (!strcmp(cbg->group, bg_group)))
else
{
elm_genlist_item_selected_set(it, EINA_TRUE);
return EINA_TRUE;
elm_object_disabled_set(_entrance_conf->btn_ok, EINA_TRUE);
elm_object_disabled_set(_entrance_conf->btn_apply, EINA_TRUE);
}
return EINA_FALSE;
}
static char *
_entrance_conf_session_text_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
{
return NULL;
}
static Evas_Object *
_entrance_conf_session_content_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
{
return NULL;
}
static Eina_Bool
_entrance_conf_session_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
{
return EINA_FALSE;
}
static void
_entrance_conf_session_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
{
}
/* vkbd */
static void
_entrance_conf_vkbd_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
{
Elm_Actionslider_Pos p;
PT("User change vkbd state\n");
p = elm_actionslider_indicator_pos_get(obj);
_entrance_int_conf->vkbd_enabled = !!(p == ELM_ACTIONSLIDER_RIGHT);
_entrance_conf_changed();
}
/* scale */
static void
_entrance_conf_scale_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
{
_entrance_int_conf->scale = elm_spinner_value_get(obj);
_entrance_conf_changed();
}
/* Buttons Cb */
static void
_entrance_conf_ok_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
_entrance_conf_apply();
evas_object_del(data);
_entrance_conf_shutdown();
}
static void
_entrance_conf_apply_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
_entrance_conf_apply();
_entrance_conf_changed();
}
static void
_entrance_conf_close_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
evas_object_del(data);
_entrance_conf_shutdown();
}
static Eina_List *
_entrance_conf_backgrounds_get(Evas_Object *obj, const char *user)
Eina_List *
entrance_conf_backgrounds_get(Evas_Object *obj, const char *user)
{
Evas_Object *o, *edj;
Eina_List *list, *l, *nl = NULL;
@ -316,520 +370,9 @@ _entrance_conf_backgrounds_get(Evas_Object *obj, const char *user)
return nl;
}
static void
_entrance_conf_apply(void)
Entrance_Fill *
entrance_conf_background_fill_get(void)
{
Entrance_Conf_Gui_Event conf;
conf.bg.path = _entrance_int_conf->bg.path;
conf.bg.group = _entrance_int_conf->bg.group;
conf.vkbd_enabled = _entrance_int_conf->vkbd_enabled;
if (_entrance_int_conf->update)
{
if (_entrance_int_conf->scale != elm_config_scale_get())
{
elm_config_scale_set(_entrance_int_conf->scale);
elm_config_all_flush();
elm_config_save();
}
if (_entrance_int_conf->theme != entrance_gui_theme_name_get())
{
entrance_gui_theme_name_set(_entrance_int_conf->theme);
}
entrance_gui_conf_set(&conf);
entrance_connect_conf_gui_send(&conf);
}
if (_entrance_int_conf->user.update)
{
Entrance_Login *eu;
eu = _entrance_int_conf->user.orig;
if (eu->bg.path != _entrance_int_conf->user.bg.path)
eina_stringshare_replace(&eu->bg.path,
_entrance_int_conf->user.bg.path);
if (eu->bg.group != _entrance_int_conf->user.bg.group)
eina_stringshare_replace(&eu->bg.group,
_entrance_int_conf->user.bg.group);
if (eu->image.path != _entrance_int_conf->user.image.path)
eina_stringshare_replace(&eu->image.path,
_entrance_int_conf->user.image.path);
if (eu->image.group != _entrance_int_conf->user.image.group)
eina_stringshare_replace(&eu->image.group,
_entrance_int_conf->user.image.group);
if (eu->remember_session != _entrance_int_conf->user.remember_session)
eu->remember_session = _entrance_int_conf->user.remember_session;
if (eu->lsess != _entrance_int_conf->user.lsess)
eina_stringshare_replace(&eu->lsess, _entrance_int_conf->user.lsess);
entrance_connect_conf_user_send(eu);
/*
printf("%s | %s\n%s | %s\n%s | %s\n%s | %s\n%d | %d\n%s | %s\n",
eu->bg.path, _entrance_int_conf->user.bg.path,
eu->bg.group, _entrance_int_conf->user.bg.group,
eu->image.path, _entrance_int_conf->user.image.path,
eu->image.group, _entrance_int_conf->user.image.group,
eu->remember_session, _entrance_int_conf->user.remember_session,
eu->lsess, _entrance_int_conf->user.lsess);
*/
}
}
/* Build it */
static Evas_Object *
_entrance_conf_build(Evas_Object *obj)
{
Evas_Object *t, *bx, *hbx, *o, *gl;
Eina_List *l;
int j = 0;
t = elm_table_add(obj);
elm_table_padding_set(t, 5 , 5);
evas_object_size_hint_weight_set(t, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
/* Background */
o = elm_label_add(t);
elm_object_text_set(o, "Background");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(t, o, 0, j, 1, 1);
evas_object_show(o);
++j;
hbx = elm_box_add(t);
elm_box_horizontal_set(hbx, EINA_TRUE);
elm_table_pack(t, hbx, 0, j, 2, 3);
evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL);
gl = elm_genlist_add(hbx);
elm_scroller_bounce_set(gl, EINA_FALSE, EINA_TRUE);
evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(hbx, gl);
evas_object_show(gl);
bx = elm_box_add(hbx);
elm_box_pack_end(hbx, bx);
evas_object_show(bx);
o = elm_layout_add(hbx);
_entrance_int_conf->bg.preview = o;
elm_box_pack_end(bx, o);
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_show(o);
o = evas_object_rectangle_add(hbx);
evas_object_color_set(o, 0, 0, 0, 0);
evas_object_size_hint_min_set(o, 256, 0);
elm_box_pack_end(bx, o);
evas_object_show(o);
evas_object_show(hbx);
j += 3;
l = _entrance_conf_backgrounds_get(gl, NULL);
entrance_fill(gl, _entrance_background_fill,
l, _entrance_conf_bg_fill_cb, _entrance_conf_bg_sel, o);
eina_list_free(l);
/* Touch Screen */
o = elm_label_add(t);
elm_object_text_set(o, "Use a virtual keyboard");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(t, o, 0, j, 1, 1);
evas_object_show(o);
o = elm_actionslider_add(t);
elm_object_style_set(o, "bar");
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_part_text_set(o, "left", "Disabled");
elm_object_part_text_set(o, "right", "Enabled");
elm_actionslider_magnet_pos_set(o, ELM_ACTIONSLIDER_LEFT);
elm_actionslider_enabled_pos_set(o, ELM_ACTIONSLIDER_LEFT |
ELM_ACTIONSLIDER_RIGHT);
evas_object_smart_callback_add(o, "selected",
_entrance_conf_vkbd_changed, NULL);
if (_entrance_int_conf->vkbd_enabled)
elm_actionslider_indicator_pos_set(o, ELM_ACTIONSLIDER_RIGHT);
else
elm_actionslider_indicator_pos_set(o, ELM_ACTIONSLIDER_LEFT);
elm_table_pack(t, o, 1, j, 1, 1);
evas_object_show(o);
++j;
/* Elementary Profile */
o = elm_label_add(t);
elm_object_text_set(o, "elementary profile");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(t, o, 0, j, 1, 1);
evas_object_show(o);
o = elm_hoversel_add(t);
elm_object_text_set(o, _entrance_int_conf->elm_profile);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(t, o, 1, j, 1, 1);
evas_object_show(o);
++j;
/* Scaling */
o = elm_label_add(t);
elm_object_text_set(o, "Scaling");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(t, o, 0, j, 1, 1);
evas_object_show(o);
o = elm_spinner_add(t);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(o, "changed",
_entrance_conf_scale_changed, NULL);
elm_spinner_value_set(o, _entrance_int_conf->scale);
elm_spinner_min_max_set(o, 0.25, 5.0);
elm_spinner_step_set(o, 0.15);
elm_spinner_label_format_set(o, "%.2f");
elm_table_pack(t, o, 1, j, 1, 1);
evas_object_show(o);
++j;
o = evas_object_rectangle_add(o);
evas_object_color_set(o, 0, 0, 0, 0);
evas_object_size_hint_min_set(o, 128, 0);
elm_table_pack(t, o, 1, j, 1, 1);
evas_object_show(t);
return t;
}
static void
_entrance_conf_user_auth(void *data, const char *user, Eina_Bool granted)
{
Evas_Object *t;
const Eina_List *users, *l;
Entrance_Login *eu;
if (granted)
{
t = elm_object_part_content_get(data, "entrance.conf");
users = entrance_gui_users_get();
EINA_LIST_FOREACH(users, l, eu)
{
if (!strcmp(eu->login, user))
{
_entrance_int_conf->user.orig = eu;
_entrance_int_conf->user.bg.path = eu->bg.path;
_entrance_int_conf->user.bg.group = eu->bg.group;
_entrance_int_conf->user.image.path = eu->image.path;
_entrance_int_conf->user.image.group = eu->image.group;
_entrance_int_conf->user.lsess = eu->lsess;
_entrance_int_conf->user.remember_session
= eu->remember_session;
/*
printf("init %s %s | %s %s | %s | %d\n",
_entrance_int_conf->user.bg.path,
_entrance_int_conf->user.bg.group,
_entrance_int_conf->user.image.path,
_entrance_int_conf->user.image.group,
_entrance_int_conf->user.lsess,
_entrance_int_conf->user.remember_session);
*/
break;
}
}
if (eu)
{
_entrance_conf_user_build_cb(t, eu);
elm_object_signal_emit(data, "entrance,conf_user,enabled", "");
}
}
}
static Evas_Object *
_entrance_conf_user_build(Evas_Object *obj)
{
Evas_Object *t, *o, *ly;
ly = entrance_gui_theme_get(obj, "entrance/conf/login");
evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(ly);
o = entrance_login_add(ly, _entrance_conf_user_auth, ly);
entrance_login_open_session_set(o, EINA_FALSE);
elm_object_part_content_set(ly, "entrance.login", o);
evas_object_show(o);
t = elm_table_add(obj);
elm_object_part_content_set(ly, "entrance.conf", t);
evas_object_size_hint_weight_set(t, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_table_padding_set(t, 5 , 5);
return ly;
}
static void
_entrance_conf_user_build_cb(Evas_Object *t, Entrance_Login *eu)
{
Evas_Object *o, *gl, *bx, *hbx;
Eina_List *l;
int j = 0;
/* Background */
o = elm_label_add(t);
elm_object_text_set(o, "Background");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(t, o, 0, j, 1, 1);
evas_object_show(o);
++j;
hbx = elm_box_add(t);
elm_box_horizontal_set(hbx, EINA_TRUE);
elm_table_pack(t, hbx, 0, j, 2, 1);
++j;
evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL);
gl = elm_genlist_add(hbx);
elm_scroller_bounce_set(gl, EINA_FALSE, EINA_TRUE);
evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(hbx, gl);
evas_object_show(gl);
bx = elm_box_add(hbx);
elm_box_pack_end(hbx, bx);
evas_object_show(bx);
o = elm_layout_add(hbx);
_entrance_int_conf->user.bg.preview = o;
elm_box_pack_end(bx, o);
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_show(o);
o = evas_object_rectangle_add(hbx);
evas_object_color_set(o, 0, 0, 0, 0);
evas_object_size_hint_min_set(o, 256, 0);
elm_box_pack_end(bx, o);
evas_object_show(o);
evas_object_show(hbx);
l = _entrance_conf_backgrounds_get(o, eu->login);
entrance_fill(gl, _entrance_background_fill,
l, _entrance_conf_user_bg_fill_cb,
_entrance_conf_user_bg_sel, o);
eina_list_free(l);
/* Icon */
/* Session to autoselect */
o = elm_label_add(t);
elm_object_text_set(o, "Session to use");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(t, o, 0, j, 1, 1);
evas_object_show(o);
o = elm_hoversel_add(t);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(o, "Session");
elm_table_pack(t, o, 1, j, 1, 1);
evas_object_show(o);
++j;
/* Remember last session */
o = elm_label_add(t);
elm_object_text_set(o, "Remember last session");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_table_pack(t, o, 0, j, 1, 1);
evas_object_show(o);
o = elm_actionslider_add(t);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_part_text_set(o, "left", "Enabled");
elm_object_part_text_set(o, "right", "Disabled");
elm_table_pack(t, o, 1, j, 1, 1);
evas_object_show(o);
++j;
evas_object_show(t);
}
static void
_entrance_conf_control_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event)
{
Elm_Object_Item *it;
it = event;
elm_naviframe_item_promote(elm_object_item_data_get(it));
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
static void
_entrance_conf_changed(void)
{
const char *bg_path;
const char *bg_group;
entrance_gui_background_get(&bg_path, &bg_group);
_entrance_int_conf->update =
!!((_entrance_int_conf->theme != entrance_gui_theme_name_get())
|| (_entrance_int_conf->bg.path != bg_path)
|| (_entrance_int_conf->bg.group != bg_group)
|| (_entrance_int_conf->scale != elm_config_scale_get())
|| (_entrance_int_conf->elm_profile != elm_config_profile_get())
|| (_entrance_int_conf->vkbd_enabled != entrance_gui_vkbd_enabled_get()));
if (_entrance_int_conf->user.orig)
_entrance_int_conf->user.update =
!!((_entrance_int_conf->user.orig->bg.path != _entrance_int_conf->user.bg.path)
|| (_entrance_int_conf->user.orig->bg.group != _entrance_int_conf->user.bg.group)
|| (_entrance_int_conf->user.orig->image.path != _entrance_int_conf->user.image.path)
|| (_entrance_int_conf->user.orig->image.group != _entrance_int_conf->user.image.group)
|| (_entrance_int_conf->user.orig->remember_session != _entrance_int_conf->user.remember_session)
|| (_entrance_int_conf->user.orig->lsess != _entrance_int_conf->user.lsess));
if (_entrance_int_conf->update || _entrance_int_conf->user.update)
{
elm_object_disabled_set(_entrance_int_conf->gui.btn_ok, EINA_FALSE);
elm_object_disabled_set(_entrance_int_conf->gui.btn_apply, EINA_FALSE);
}
else
{
elm_object_disabled_set(_entrance_int_conf->gui.btn_ok, EINA_TRUE);
elm_object_disabled_set(_entrance_int_conf->gui.btn_apply, EINA_TRUE);
}
}
static void
_entrance_conf_init(void)
{
PT("conf init\n");
_entrance_background_fill =
entrance_fill_new("default",
_entrance_conf_bg_text_get,
_entrance_conf_bg_content_get,
_entrance_conf_bg_state_get,
_entrance_conf_bg_del);
_entrance_session_fill =
entrance_fill_new("default",
_entrance_conf_session_text_get,
_entrance_conf_session_content_get,
_entrance_conf_session_state_get,
_entrance_conf_session_del);
_entrance_int_conf = calloc(1, sizeof(Entrance_Int_Conf));
_entrance_int_conf->theme = entrance_gui_theme_name_get();
entrance_gui_background_get(&(_entrance_int_conf->bg.path),
&(_entrance_int_conf->bg.group));
_entrance_int_conf->vkbd_enabled = entrance_gui_vkbd_enabled_get();
_entrance_int_conf->scale = elm_config_scale_get();
_entrance_int_conf->elm_profile = elm_config_profile_get();
}
static void
_entrance_conf_shutdown(void)
{
PT("conf shutdown\n");
entrance_fill_del(_entrance_background_fill);
entrance_fill_del(_entrance_session_fill);
free(_entrance_int_conf);
}
void
entrance_conf_begin(Evas_Object *obj, Evas_Object *parent)
{
PT("Build config panel\n");
Evas_Object *win, *bg, *bx, *hbx, *sc, *nf, *o;
Elm_Object_Item *it, *itc;
Elm_Object_Item *itu, *ituc;
_entrance_conf_init();
win = elm_hover_add(obj);
elm_hover_parent_set(win, parent);
// win = elm_popup_add(obj);
bg = elm_bg_add(win);
bx = elm_box_add(win);
evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_content_set(win, bx);
sc = elm_segment_control_add(bx);
evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, sc);
evas_object_smart_callback_add(sc, "changed",
_entrance_conf_control_changed, NULL);
evas_object_show(sc);
nf = elm_naviframe_add(bx);
evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, nf);
evas_object_show(nf);
/* Ok Apply Close */
hbx = elm_box_add(bx);
elm_box_horizontal_set(hbx, EINA_TRUE);
elm_box_homogeneous_set(hbx, EINA_TRUE);
evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, hbx);
evas_object_show(hbx);
o = elm_button_add(hbx);
elm_object_text_set(o, "Ok");
elm_object_disabled_set(o, EINA_TRUE);
evas_object_smart_callback_add(o, "clicked",
_entrance_conf_ok_clicked, win);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(hbx, o);
_entrance_int_conf->gui.btn_ok = o;
evas_object_show(o);
o = elm_button_add(hbx);
elm_object_text_set(o, "Apply");
elm_object_disabled_set(o, EINA_TRUE);
evas_object_smart_callback_add(o, "clicked",
_entrance_conf_apply_clicked, NULL);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(hbx, o);
_entrance_int_conf->gui.btn_apply = o;
evas_object_show(o);
o = elm_button_add(hbx);
elm_object_text_set(o, "Close");
evas_object_smart_callback_add(o, "clicked",
_entrance_conf_close_clicked, win);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(hbx, o);
evas_object_show(o);
/* Build configuration panel */
/* main */
o = _entrance_conf_build(nf);
it = elm_naviframe_item_simple_push(nf, o);
itc = elm_segment_control_item_add(sc, NULL, "General");
elm_object_item_data_set(itc, it);
/* user */
o = _entrance_conf_user_build(nf);
itu = elm_naviframe_item_simple_push(nf, o);
ituc = elm_segment_control_item_add(sc, NULL, "User");
elm_object_item_data_set(ituc, itu);
elm_segment_control_item_selected_set(itc, EINA_TRUE);
{
Evas_Coord xx, yy, ww, hh, x, y, w, h;
evas_object_geometry_get(obj, &x, &y, &w, &h);
evas_object_geometry_get(bx, NULL, NULL, &ww, &hh);
xx = 50;//x + (w / 2) - (ww / 2);
yy = 50;//y + (y / 2) - (hh / 2);
evas_object_move(bg, xx, yy);
evas_object_resize(bg, w - 100, h - 100);
evas_object_move(bx, xx, yy);
evas_object_resize(bx, w - 100, h - 100);
}
evas_object_show(bg);
evas_object_show(bx);
evas_object_show(win);
evas_object_freeze_events_set(win, EINA_TRUE);
return _entrance_conf->background_fill;
}