yoz pushed a commit to branch master. http://git.enlightenment.org/misc/entrance.git/commit/?id=7607e486adb9dee02f5aaefd2ba36398504efe01
commit 7607e486adb9dee02f5aaefd2ba36398504efe01 Author: Michael Bouchaud <y...@efl.so> Date: Thu Mar 20 00:40:12 2014 +0000 entrance: first step to split configuration panel code, create a generic interface to build config panel --- src/bin/entrance_conf.c | 877 ++++++++++++------------------------------------ 1 file changed, 210 insertions(+), 667 deletions(-) diff --git a/src/bin/entrance_conf.c b/src/bin/entrance_conf.c index 56e49be..4d0623f 100644 --- a/src/bin/entrance_conf.c +++ b/src/bin/entrance_conf.c @@ -1,745 +1,215 @@ #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 Entrance_Fill *_entrance_background_fill = NULL; -static Entrance_Fill *_entrance_session_fill = NULL; -static Entrance_Int_Conf *_entrance_int_conf = NULL; +static void _entrance_conf_bg_del(void *data, Evas_Object *obj); -static char * -_entrance_conf_bg_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) -{ - Entrance_Conf_Background *cbg; - cbg = data; - return strdup(cbg->name); -} -static Evas_Object * -_entrance_conf_bg_content_get(void *data, Evas_Object *obj, const char *part) -{ - Entrance_Conf_Background *cbg; - Evas_Object *o = NULL; - cbg = data; - if (part && !strcmp("elm.swallow.icon", part)) - { - o = elm_image_add(obj); - elm_image_file_set(o, cbg->path, cbg->group); - elm_image_smooth_set(o, EINA_FALSE); - evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - evas_object_show(o); - } - return o; -} -static Eina_Bool -_entrance_conf_bg_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) -{ - return EINA_FALSE; -} +static Entrance_Int_Conf *_entrance_conf = NULL; static void -_entrance_conf_bg_del(void *data, Evas_Object *obj EINA_UNUSED) +_entrance_conf_build(Evas_Object *naviframe, Evas_Object *segment) { - Entrance_Conf_Background *cbg; - cbg = data; - eina_stringshare_del(cbg->name); - eina_stringshare_del(cbg->path); - eina_stringshare_del(cbg->group); - free(cbg); -} - -static void -_entrance_conf_bg_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) -{ - 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("Error on loading "); - fprintf(stderr, "%s %s\n", cbg->path, cbg->group); - } - _entrance_int_conf->bg.path = cbg->path; - _entrance_int_conf->bg.group = cbg->group; - _entrance_conf_changed(); -} - -static Eina_Bool -_entrance_conf_bg_fill_cb(void *data, Elm_Object_Item *it) -{ - Entrance_Conf_Background *cbg; - const char *bg_path, *bg_group; - cbg = data; + Entrance_Conf_Module *conf; + Eina_List *l; + Evas_Object *o; + Elm_Object_Item *it, *itc; - 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))) + EINA_LIST_FOREACH(_entrance_conf->modules, l, conf) { - elm_genlist_item_selected_set(it, EINA_TRUE); - return EINA_TRUE; + 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); } - return EINA_FALSE; } static void -_entrance_conf_user_bg_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) -{ - 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)) - { - PT("Error on loading "); - fprintf(stderr, "%s %s\n", cbg->path, cbg->group); - } - _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))) - { - elm_genlist_item_selected_set(it, EINA_TRUE); - return 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) +_entrance_conf_apply(void) { - return EINA_FALSE; + _entrance_conf->current->apply(); } static void -_entrance_conf_session_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) +_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; } -/* vkbd */ static void -_entrance_conf_vkbd_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED) +_entrance_conf_promote(Entrance_Conf_Module *conf) { - 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(); + elm_naviframe_item_promote(conf->item); + _entrance_conf->current = conf; } - -/* scale */ static void -_entrance_conf_scale_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED) +_entrance_conf_control_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) { - _entrance_int_conf->scale = elm_spinner_value_get(obj); - _entrance_conf_changed(); + Elm_Object_Item *it; + it = event; + _entrance_conf_promote(elm_object_item_data_get(it)); } -/* 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(); + _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(); + 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(); + _entrance_conf_end(data); } - -static Eina_List * -_entrance_conf_backgrounds_get(Evas_Object *obj, const char *user) +static char * +_entrance_conf_bg_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { - Evas_Object *o, *edj; - Eina_List *list, *l, *nl = NULL; Entrance_Conf_Background *cbg; - const char *str; - const char *path; - char buf[PATH_MAX]; - Eina_Iterator *it; - - o = entrance_gui_theme_get(obj, "entrance/background"); - edj = elm_layout_edje_get(o); - edje_object_file_get(edj, &path, NULL); - list = entrance_gui_stringlist_get(edje_object_data_get(edj, "items")); - EINA_LIST_FOREACH(list, l, str) - { - cbg = calloc(1, sizeof(Entrance_Conf_Background)); - snprintf(buf, sizeof(buf), - "entrance/background/%s", str); - - cbg->path = eina_stringshare_add(path); - cbg->group = eina_stringshare_add(buf); - cbg->name = eina_stringshare_add(str); - nl = eina_list_append(nl, cbg); - } - entrance_gui_stringlist_free(list); - evas_object_del(o); - - it = eina_file_ls(PACKAGE_DATA_DIR"/backgrounds"); - EINA_ITERATOR_FOREACH(it, str) - { - int len; - len = strlen(str); - if (len < 4) continue; - if (!strcmp(&str[len-4], ".edj")) - { - cbg = calloc(1, sizeof(Entrance_Conf_Background)); - snprintf(buf, sizeof(buf), - "entrance/background/%s", str); - cbg->path = str; - /* TODO use entrance/desktop/background or e/desktop/background */ - cbg->group = eina_stringshare_add("e/desktop/background"); - { - char *name, *p; - name = strrchr(str, '/'); - if (name) - { - name++; - name = strdupa(name); - p = strrchr(name, '.'); - if (p) *p = '\0'; - } - cbg->name = eina_stringshare_add(name); - } - nl = eina_list_append(nl, cbg); - } - else - eina_stringshare_del(str); - } - eina_iterator_free(it); - - return nl; -} - -static void -_entrance_conf_apply(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); - */ - } + cbg = data; + return strdup(cbg->name); } -/* 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) +_entrance_conf_bg_content_get(void *data, Evas_Object *obj, const char *part) { - Evas_Object *t; - const Eina_List *users, *l; - Entrance_Login *eu; - - if (granted) + Entrance_Conf_Background *cbg; + Evas_Object *o = NULL; + cbg = data; + if (part && !strcmp("elm.swallow.icon", part)) { - 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", ""); - } + o = elm_image_add(obj); + elm_image_file_set(o, cbg->path, cbg->group); + elm_image_smooth_set(o, EINA_FALSE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_show(o); } + return o; } - -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) +static Eina_Bool +_entrance_conf_bg_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) { - Elm_Object_Item *it; - it = event; - elm_naviframe_item_promote(elm_object_item_data_get(it)); + return EINA_FALSE; } - -//////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// static void -_entrance_conf_changed(void) +_entrance_conf_bg_del(void *data, Evas_Object *obj EINA_UNUSED) { - 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); - } + Entrance_Conf_Background *cbg; + cbg = data; + eina_stringshare_del(cbg->name); + eina_stringshare_del(cbg->path); + eina_stringshare_del(cbg->group); + free(cbg); } -static void -_entrance_conf_init(void) +void +entrance_conf_init(void) { PT("conf init\n"); - _entrance_background_fill = + _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_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(); + + entrance_conf_main_init(); + entrance_conf_user_init(); } -static void -_entrance_conf_shutdown(void) +void +entrance_conf_shutdown(void) { + Entrance_Conf_Module *conf; + PT("conf shutdown\n"); - entrance_fill_del(_entrance_background_fill); - entrance_fill_del(_entrance_session_fill); - free(_entrance_int_conf); + entrance_conf_user_shutdown(); + entrance_conf_main_shutdown(); + EINA_LIST_FREE(_entrance_conf->modules, conf) + { + eina_stringshare_del(conf->label); + free(conf); + } + free(_entrance_conf); } +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_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; - Elm_Object_Item *it, *itc; - Elm_Object_Item *itu, *ituc; - - _entrance_conf_init(); + 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); @@ -779,7 +249,7 @@ entrance_conf_begin(Evas_Object *obj, Evas_Object *parent) _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; + _entrance_conf->btn_ok = o; evas_object_show(o); o = elm_button_add(hbx); @@ -789,7 +259,7 @@ entrance_conf_begin(Evas_Object *obj, Evas_Object *parent) _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; + _entrance_conf->btn_apply = o; evas_object_show(o); o = elm_button_add(hbx); @@ -801,20 +271,7 @@ entrance_conf_begin(Evas_Object *obj, Evas_Object *parent) 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); + _entrance_conf_build(nf, sc); { Evas_Coord xx, yy, ww, hh, x, y, w, h; @@ -833,3 +290,89 @@ entrance_conf_begin(Evas_Object *obj, Evas_Object *parent) evas_object_freeze_events_set(win, EINA_TRUE); } +void +entrance_conf_changed(void) +{ + if (_entrance_conf->current && _entrance_conf->current->check()) + { + elm_object_disabled_set(_entrance_conf->btn_ok, EINA_FALSE); + elm_object_disabled_set(_entrance_conf->btn_apply, EINA_FALSE); + } + else + { + elm_object_disabled_set(_entrance_conf->btn_ok, EINA_TRUE); + elm_object_disabled_set(_entrance_conf->btn_apply, EINA_TRUE); + } +} + +Eina_List * +entrance_conf_backgrounds_get(Evas_Object *obj, const char *user) +{ + Evas_Object *o, *edj; + Eina_List *list, *l, *nl = NULL; + Entrance_Conf_Background *cbg; + const char *str; + const char *path; + char buf[PATH_MAX]; + Eina_Iterator *it; + + o = entrance_gui_theme_get(obj, "entrance/background"); + edj = elm_layout_edje_get(o); + edje_object_file_get(edj, &path, NULL); + list = entrance_gui_stringlist_get(edje_object_data_get(edj, "items")); + EINA_LIST_FOREACH(list, l, str) + { + cbg = calloc(1, sizeof(Entrance_Conf_Background)); + snprintf(buf, sizeof(buf), + "entrance/background/%s", str); + + cbg->path = eina_stringshare_add(path); + cbg->group = eina_stringshare_add(buf); + cbg->name = eina_stringshare_add(str); + nl = eina_list_append(nl, cbg); + } + entrance_gui_stringlist_free(list); + evas_object_del(o); + + it = eina_file_ls(PACKAGE_DATA_DIR"/backgrounds"); + EINA_ITERATOR_FOREACH(it, str) + { + int len; + len = strlen(str); + if (len < 4) continue; + if (!strcmp(&str[len-4], ".edj")) + { + cbg = calloc(1, sizeof(Entrance_Conf_Background)); + snprintf(buf, sizeof(buf), + "entrance/background/%s", str); + cbg->path = str; + /* TODO use entrance/desktop/background or e/desktop/background */ + cbg->group = eina_stringshare_add("e/desktop/background"); + { + char *name, *p; + name = strrchr(str, '/'); + if (name) + { + name++; + name = strdupa(name); + p = strrchr(name, '.'); + if (p) *p = '\0'; + } + cbg->name = eina_stringshare_add(name); + } + nl = eina_list_append(nl, cbg); + } + else + eina_stringshare_del(str); + } + eina_iterator_free(it); + + return nl; +} + +Entrance_Fill * +entrance_conf_background_fill_get(void) +{ + return _entrance_conf->background_fill; +} + --