Only clear/populate the More list whenever it is completely empty.

SVN revision: 52215
This commit is contained in:
Leandro Pereira 2010-09-13 22:34:48 +00:00
parent 22bd79dd6a
commit 98f95f2b00
2 changed files with 61 additions and 32 deletions

View File

@ -215,8 +215,8 @@ collections {
description { state: "default" 0.0;
align: 1.0 0.5;
image.normal: "arrow_right.png";
min: 24 24;
max: 24 24;
min: 16 16;
max: 16 16;
}
}
}
@ -1002,6 +1002,7 @@ collections {
action: STATE_SET "hide-right" 0.0;
target: "more-list-swallow";
after: "list-animate-final";
action: SIGNAL_EMIT "list,completely,hidden" "";
}
program { name: "list-animate-right";
signal: "list,animate,right";
@ -1014,6 +1015,7 @@ collections {
action: STATE_SET "hide-left" 0.0;
target: "more-list-swallow";
after: "list-animate-final";
action: SIGNAL_EMIT "list,completely,hidden" "";
}
program { name: "list-animate-final";
action: STATE_SET "default" 0.0;

View File

@ -11,6 +11,7 @@
#define BOOKMARK_MENU_PREALLOC_SIZE 32
typedef struct _More_Menu_Item More_Menu_Item;
typedef struct _More_Menu_Set_Params More_Menu_Set_Params;
typedef struct _More_Menu_Filter_Context More_Menu_Filter_Context;
typedef struct _More_Menu_Preference More_Menu_Preference;
typedef struct _More_Menu_Preference_List More_Menu_Preference_List;
@ -99,6 +100,13 @@ struct _More_Menu_Preference_List {
const char *value;
};
struct _More_Menu_Set_Params {
Evas_Object *chrome;
Evas_Object *list;
More_Menu_Item *root;
const char *old_text;
};
static More_Menu_Item more_menu_history[] =
{
{ ITEM_TYPE_DYNAMIC_FOLDER, "Today", more_menu_history_today, NULL, ITEM_FLAG_ARROW },
@ -1047,59 +1055,50 @@ cb_pref_bool_changed(void *data, Evas_Object *obj, void *event_info __UNUSED__)
}
static void
more_menu_set(Evas_Object *chrome,
Evas_Object *list,
More_Menu_Item *root,
const char *old_text)
on_list_completely_hidden(void *data, Evas_Object *ed, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Browser_Window *win = evas_object_data_get(chrome, "win");
Evas_Object *ed = elm_layout_edje_get(chrome);
More_Menu_Set_Params *params = data;
Browser_Window *win = evas_object_data_get(params->chrome, "win");
int i;
if (!eina_list_data_find(win->list_history, root))
if (!eina_list_data_find(win->list_history, params->root))
{
if (root == more_menu_root || !root)
if (params->root == more_menu_root || !params->root)
win->list_history = eina_list_prepend(win->list_history, NULL);
else
win->list_history = eina_list_prepend(win->list_history, root);
win->list_history = eina_list_prepend(win->list_history, params->root);
}
elm_list_clear(list);
elm_list_clear(params->list);
if (!root || root == more_menu_root)
if (params->root != more_menu_root)
{
root = more_menu_root;
edje_object_part_text_set(ed, "more-list-title", "More");
edje_object_signal_emit(ed, "list,back,hide", "");
}
else
{
edje_object_part_text_set(ed, "more-list-back-button-text", eina_stringshare_add(old_text ? old_text : "More"));
edje_object_part_text_set(ed, "more-list-back-button-text", eina_stringshare_add(params->old_text ? params->old_text : "More"));
edje_object_signal_callback_del(ed, "list,back,clicked", "", on_more_item_back_click);
edje_object_signal_callback_add(ed, "list,back,clicked", "", on_more_item_back_click, list);
edje_object_signal_callback_add(ed, "list,back,clicked", "", on_more_item_back_click, params->list);
edje_object_signal_emit(ed, "list,back,show", "");
}
for (i = 0; root[i].type != ITEM_TYPE_LAST; i++)
for (i = 0; params->root[i].type != ITEM_TYPE_LAST; i++)
{
Evas_Object *icon = NULL, *end = NULL;
switch (root[i].type) {
switch (params->root[i].type) {
case ITEM_TYPE_SEPARATOR:
{
Elm_List_Item *item = elm_list_item_append(list, NULL, NULL, NULL, NULL, NULL);
Elm_List_Item *item = elm_list_item_append(params->list, NULL, NULL, NULL, NULL, NULL);
elm_list_item_separator_set(item, EINA_TRUE);
break;
}
case ITEM_TYPE_PREFERENCE:
{
More_Menu_Preference *pref = root[i].next;
More_Menu_Preference *pref = params->root[i].next;
if (!pref->pref_get) break;
if (pref->type == PREF_TYPE_CHECKBOX)
{
Eina_Bool (*pref_get)(Prefs *);
Evas_Object *toggle = elm_toggle_add(list);
Evas_Object *toggle = elm_toggle_add(params->list);
pref_get = pref->pref_get;
elm_toggle_state_set(toggle, pref_get(prefs));
@ -1110,22 +1109,50 @@ more_menu_set(Evas_Object *chrome,
}
/* fallthrough */
default:
if (!icon && root[i].flags & ITEM_FLAG_SELECTED)
if (!icon && params->root[i].flags & ITEM_FLAG_SELECTED)
{
icon = elm_icon_add(list);
icon = elm_icon_add(params->list);
elm_icon_file_set(icon, PACKAGE_DATA_DIR "/default.edj", "list-selected");
}
if (!end && root[i].flags & ITEM_FLAG_ARROW)
if (!end && params->root[i].flags & ITEM_FLAG_ARROW)
{
end = elm_icon_add(list);
end = elm_icon_add(params->list);
elm_icon_file_set(end, PACKAGE_DATA_DIR "/default.edj", "list-arrow");
}
elm_list_item_append(list, root[i].text, icon, end, on_more_item_click, &root[i]);
elm_list_item_append(params->list, params->root[i].text, icon, end, on_more_item_click, &(params->root[i]));
}
}
elm_list_go(list);
elm_list_go(params->list);
edje_object_signal_callback_del(ed, "list,completely,hidden", "", on_list_completely_hidden);
eina_stringshare_del(params->old_text);
free(params);
}
static void
more_menu_set(Evas_Object *chrome, Evas_Object *list, More_Menu_Item *root, const char *old_text)
{
Evas_Object *ed = elm_layout_edje_get(chrome);
More_Menu_Set_Params *params = calloc(1, sizeof(*params));
if (!params) return;
params->chrome = chrome;
params->list = list;
params->root = root ? root : more_menu_root;
params->old_text = eina_stringshare_add(old_text);
if (params->root == more_menu_root)
{
edje_object_part_text_set(ed, "more-list-title", "More");
edje_object_signal_emit(ed, "list,back,hide", "");
on_list_completely_hidden(params, NULL, NULL, NULL);
}
else
edje_object_signal_callback_add(ed, "list,completely,hidden", "", on_list_completely_hidden, params);
}
static void