struct _Widget_Data\r
{\r
Eina_List *stack, *to_delete;\r
- Elm_Navigationbar_ex_Item *top;\r
+ Elm_Navigationbar_ex_Item *top, *oldtop;\r
Evas_Object *rect, *clip;\r
Eina_Bool del_on_pop : 1;\r
+ Eina_Bool disable_animation: 1;\r
};\r
\r
struct _Elm_Navigationbar_ex_Item\r
{\r
Evas_Object *obj, *base, *content;\r
+ Evas_Object *t_base, *ct_base;\r
Evas_Coord minw, minh;\r
const char *title;\r
const char *subtitle;\r
if(!item->content) return NULL; \r
content = item->content;\r
elm_widget_sub_object_del(item->obj,item->content);\r
- edje_object_part_unswallow(item->base,item->content); \r
+ edje_object_part_unswallow(item->ct_base,item->content); \r
item->content = NULL;\r
evas_object_hide(content);\r
return content;\r
static void\r
_theme_hook(Evas_Object *obj)\r
{\r
- Widget_Data *wd = elm_widget_data_get(obj);\r
- Eina_List *l;\r
- char buf_fn[1024];\r
- Elm_Navigationbar_ex_Item *it;\r
- if (!wd) return;\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ Eina_List *l;\r
+ char buf_fn[1024];\r
+ char buf[1024];\r
+ Elm_Navigationbar_ex_Item *it;\r
+ if (!wd) return;\r
EINA_LIST_FOREACH(wd->stack, l, it)\r
{\r
Eina_List *bl;\r
fn_button *btn;\r
- edje_object_scale_set(it->base, elm_widget_scale_get(obj) * \r
+ edje_object_scale_set(it->base, elm_widget_scale_get(obj) * \r
_elm_config->scale);\r
+\r
+ strncpy(buf, "item/", sizeof(buf));\r
+ strncat(buf, it->item_style, sizeof(buf) - strlen(buf));\r
+ _elm_theme_object_set(obj, it->t_base, "navigationbar_ex", buf, elm_widget_style_get(obj));\r
+\r
+ _elm_theme_object_set(obj, it->ct_base, "navigationbar_ex", "content", elm_widget_style_get(obj));\r
+ _elm_theme_object_set(obj, it->base, "navigationbar_ex", "base", elm_widget_style_get(obj));\r
+\r
EINA_LIST_FOREACH(it->fnbtn_list, bl, btn)\r
{\r
if(btn->btn_id == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)\r
evas_object_size_hint_min_get(it->content, &minw, &minh);\r
// FIXME: why is this needed? how does edje get this unswallowed or\r
// lose its callbacks to edje\r
- edje_object_part_swallow(it->base, "elm.swallow.content", it->content);\r
+ edje_object_part_swallow(it->ct_base, "elm.swallow.content", it->content);\r
edje_object_size_min_calc(it->base, &it->minw, &it->minh);\r
_sizing_eval(it->obj);\r
}\r
\r
static void\r
-_eval_top(Evas_Object *obj, Eina_Bool push)\r
+_eval_top(Evas_Object *obj)\r
{\r
Widget_Data *wd = elm_widget_data_get(obj);\r
- Eina_Bool animate=EINA_TRUE;\r
- Elm_Navigationbar_ex_Item *ittop;\r
+ Eina_Bool animate = EINA_TRUE;\r
+ Elm_Navigationbar_ex_Item *ittop = NULL;\r
if (!wd) return;\r
if (!wd->stack) return;\r
ittop = eina_list_last(wd->stack)->data;\r
if (ittop != wd->top)\r
{\r
- Evas_Object *o;\r
+ Evas_Object *o, *o1, *o2;\r
const char *onshow, *onhide;\r
\r
if (wd->top)\r
{\r
o = wd->top->base;\r
- edje_object_signal_emit(o, "elm,action,hide", "elm");\r
- onhide = edje_object_data_get(o, "onhide");\r
+ o1 = wd->top->ct_base;\r
+ o2 = wd->top->t_base;/*make use of the signals sent for animation*/\r
+\r
+ /*issue to fix, hide signal does not come for t_base, increasing time helps \r
+ in getting correct events in pop*/\r
+ if(wd->disable_animation)\r
+ {\r
+ edje_object_signal_emit(o2, "elm,action,hide,noanimate", "elm");\r
+ edje_object_signal_emit(o1, "elm,action,hide,noanimate", "elm"); \r
+ }\r
+ else if (wd->top->popme)\r
+ { \r
+ edje_object_signal_emit(o2, "elm,action,pop", "elm");\r
+ edje_object_signal_emit(o1, "elm,action,pop", "elm");\r
+ }\r
+ else\r
+ {\r
+ edje_object_signal_emit(o2, "elm,action,hide", "elm");\r
+ edje_object_signal_emit(o1, "elm,action,hide", "elm");\r
+ }\r
+ onhide = edje_object_data_get(o1, "onhide");\r
if (onhide)\r
{\r
- if (!strcmp(onhide, "raise")) evas_object_raise(o);\r
- else if (!strcmp(onhide, "lower")) evas_object_lower(o);\r
+ if (!strcmp(onhide, "raise")) {\r
+ evas_object_raise(o2);\r
+ evas_object_raise(o1);\r
+ }\r
+ else if (!strcmp(onhide, "lower")) \r
+ {\r
+ evas_object_lower(o2);\r
+ evas_object_lower(o1); \r
+ }\r
}\r
}\r
else\r
{\r
animate = EINA_FALSE;\r
}\r
+ wd->oldtop = wd->top;\r
wd->top = ittop;\r
o = wd->top->base;\r
+ o1 = wd->top->ct_base;\r
+ o2 = wd->top->t_base;\r
evas_object_show(o);\r
- if(animate)\r
- {\r
- if(push)\r
- edje_object_signal_emit(o, "elm,action,show,push", "elm");\r
- else\r
- edje_object_signal_emit(o, "elm,action,show,pop", "elm");\r
+ evas_object_show(o2);\r
+ evas_object_show(o1);\r
+\r
+ if ((!animate)||(wd->disable_animation))\r
+ { \r
+ edje_object_signal_emit(o2, "elm,action,show,noanimate", "elm");\r
+ edje_object_signal_emit(o1, "elm,action,show,noanimate", "elm"); \r
}\r
+ else if (wd->oldtop)\r
+ {\r
+ if (elm_object_focus_get(wd->oldtop->content))\r
+ elm_object_focus(wd->top->content);\r
+ if (wd->oldtop->popme)\r
+ {\r
+ edje_object_signal_emit(o2, "elm,action,show", "elm");\r
+ edje_object_signal_emit(o1, "elm,action,show", "elm"); \r
+ }\r
+ else\r
+ {\r
+ edje_object_signal_emit(o2, "elm,action,push", "elm");\r
+ edje_object_signal_emit(o1, "elm,action,push", "elm");\r
+ }\r
+ }\r
else\r
- edje_object_signal_emit(o, "elm,action,show,noanimate", "elm");\r
- onshow = edje_object_data_get(o, "onshow");\r
+ {\r
+ edje_object_signal_emit(o2, "elm,action,push", "elm");\r
+ edje_object_signal_emit(o1, "elm,action,push", "elm");\r
+ }\r
+ onshow = edje_object_data_get(o1, "onshow");\r
if (onshow)\r
{\r
- if (!strcmp(onshow, "raise")) evas_object_raise(o);\r
- else if (!strcmp(onshow, "lower")) evas_object_lower(o); \r
+ if (!strcmp(onshow, "raise")) {\r
+ evas_object_raise(o2);\r
+ evas_object_raise(o1);\r
+ }\r
+ else if (!strcmp(onshow, "lower")) {\r
+ evas_object_lower(o2);\r
+ evas_object_lower(o1);\r
+ }\r
}\r
- }\r
+ }\r
}\r
\r
+\r
static void\r
_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)\r
{\r
}\r
if(it->item_style) eina_stringshare_del(it->item_style);\r
if(it->title_obj) evas_object_del(it->title_obj);\r
- evas_object_del(it->base);\r
- _eval_top(it->obj, EINA_FALSE);\r
- free(it);\r
- return;\r
+ if(it->icon) evas_object_del(it->icon);\r
+ evas_object_del(it->t_base);\r
+ evas_object_del(it->ct_base);\r
+ evas_object_del(it->base);\r
+ _eval_top(it->obj);\r
+ free(it);\r
+ return;\r
}\r
}\r
}\r
Elm_Navigationbar_ex_Item *it = data;\r
Evas_Object *obj2 = it->obj;\r
Widget_Data *wd = elm_widget_data_get(it->obj);\r
+ evas_object_hide(it->t_base);\r
+ evas_object_hide(it->ct_base);\r
evas_object_hide(it->base);\r
- edje_object_signal_emit(it->base, "elm,action,reset", "elm");\r
+ edje_object_signal_emit(it->t_base, "elm,action,reset", "elm");\r
+ edje_object_signal_emit(it->ct_base, "elm,action,reset", "elm");\r
evas_object_smart_callback_call(obj2, "hide,finished", it->content);\r
- edje_object_message_signal_process(it->base);\r
+ edje_object_message_signal_process(it->t_base); \r
+ edje_object_message_signal_process(it->ct_base);\r
if(it->popme)\r
{\r
if(wd->del_on_pop)\r
{\r
wd->stack = eina_list_remove_list(wd->stack, l);\r
wd->stack = eina_list_append(wd->stack, it);\r
- _eval_top(it->obj, EINA_FALSE);\r
+ _eval_top(it->obj);\r
return;\r
}\r
}\r
}\r
if(it->title_obj) evas_object_del(it->title_obj); \r
if(it->content) evas_object_del(it->content);\r
+ if(it->icon) evas_object_del(it->icon);\r
+ evas_object_del(it->t_base);\r
+ evas_object_del(it->ct_base);\r
evas_object_del(it->base);\r
- _eval_top(it->obj, EINA_FALSE);\r
+ _eval_top(it->obj);\r
free(it);\r
it = NULL;\r
} \r
elm_widget_data_set(obj, wd);\r
elm_widget_del_hook_set(obj, _del_hook);\r
elm_widget_theme_hook_set(obj, _theme_hook);\r
-\r
+ elm_widget_can_focus_set(obj, EINA_FALSE);\r
wd->clip = evas_object_rectangle_add(e);\r
elm_widget_resize_object_set(obj, wd->clip);\r
elm_widget_sub_object_add(obj, wd->clip);\r
it->obj = obj;\r
it->content = content;\r
it->base = edje_object_add(evas_object_evas_get(obj));\r
+ it->ct_base = edje_object_add(evas_object_evas_get(obj));\r
+ it->t_base = edje_object_add(evas_object_evas_get(obj));\r
+\r
evas_object_smart_member_add(it->base, obj);\r
+ evas_object_smart_member_add(it->ct_base, obj);\r
+ evas_object_smart_member_add(it->t_base, obj);\r
+ \r
evas_object_geometry_get(obj, &x, &y, &w, &h);\r
evas_object_move(it->base, x, y);\r
evas_object_resize(it->base, w, h);\r
evas_object_clip_set(it->base, wd->clip);\r
- elm_widget_sub_object_add(obj, it->base);\r
- elm_widget_sub_object_add(obj, it->content);\r
- strncpy(buf, "item/", sizeof(buf));\r
+ \r
+ elm_widget_sub_object_add(obj, it->base);\r
+ elm_widget_sub_object_add(obj, it->ct_base);\r
+ elm_widget_sub_object_add(obj, it->t_base);\r
+\r
+ elm_widget_sub_object_add(obj, it->content);\r
+\r
+ _elm_theme_object_set(obj, it->base, "navigationbar_ex", "base", elm_widget_style_get(obj));\r
+ _elm_theme_object_set(obj, it->ct_base, "navigationbar_ex", "content", elm_widget_style_get(obj));\r
+\r
+ strncpy(buf, "item/", sizeof(buf));\r
strncat(buf, item_style, sizeof(buf) - strlen(buf));\r
if (!eina_stringshare_replace(&it->item_style, item_style)) return NULL;\r
- \r
- _elm_theme_object_set(obj, it->base, "navigationbar_ex", buf, elm_widget_style_get(obj));\r
- edje_object_signal_callback_add(it->base, "elm,action,hide,finished", "", \r
- _signal_hide_finished, it);\r
- evas_object_event_callback_add(it->content,\r
- EVAS_CALLBACK_CHANGED_SIZE_HINTS,\r
- _changed_size_hints, it);\r
- edje_object_part_swallow(it->base, "elm.swallow.content", it->content);\r
+ _elm_theme_object_set(obj, it->t_base, "navigationbar_ex", buf, elm_widget_style_get(obj));\r
+\r
+\r
+ edje_object_part_swallow(it->base, "elm.swallow.title", it->t_base);\r
+ edje_object_part_swallow(it->base, "elm.swallow.content", it->ct_base);\r
+\r
+ edje_object_signal_callback_add(it->ct_base, "elm,action,hide,finished", "", \r
+ _signal_hide_finished, it);\r
+ evas_object_event_callback_add(it->content,\r
+ EVAS_CALLBACK_CHANGED_SIZE_HINTS,\r
+ _changed_size_hints, it);\r
+ edje_object_part_swallow(it->ct_base, "elm.swallow.content", it->content);\r
edje_object_size_min_calc(it->base, &it->minw, &it->minh);\r
evas_object_data_set(it->base, "_elm_leaveme", obj);\r
evas_object_show(it->content);\r
wd->stack = eina_list_append(wd->stack, it);\r
- _eval_top(obj, EINA_TRUE);\r
+ _eval_top(obj);\r
_sizing_eval(obj);\r
return it;\r
}\r
{\r
if(!item) return;\r
if (!eina_stringshare_replace(&item->title, title)) return;\r
- if (item->base)\r
- edje_object_part_text_set(item->base, "elm.text", item->title); \r
+ if (item->t_base)\r
+ {\r
+ if((item->title_obj)&&(item->title))\r
+ {\r
+ edje_object_signal_emit(item->base, "elm,state,extend,title", "elm");\r
+ } \r
+ edje_object_part_text_set(item->t_base, "elm.text", item->title); \r
+ }\r
}\r
\r
/**\r
{\r
if(!item) return;\r
if (!eina_stringshare_replace(&item->subtitle, subtitle)) return;\r
- if (item->base)\r
- edje_object_part_text_set(item->base, "elm.text.sub", item->subtitle); \r
+ if (item->t_base)\r
+ edje_object_part_text_set(item->t_base, "elm.text.sub", item->subtitle); \r
}\r
\r
/**\r
elm_navigationbar_ex_item_icon_set(Elm_Navigationbar_ex_Item* item, Evas_Object *icon)\r
{\r
if(!item) return; \r
- edje_object_part_swallow(item->base, "elm.swallow.icon", icon);\r
+ edje_object_part_swallow(item->t_base, "elm.swallow.icon", icon);\r
elm_widget_sub_object_add(item->obj, icon);\r
- edje_object_signal_emit(item->base, "elm,state,icon,visible", "elm");\r
+ edje_object_signal_emit(item->t_base, "elm,state,icon,visible", "elm");\r
item->icon = icon;\r
}\r
\r
elm_button_icon_set(btn, icon);\r
elm_object_focus_allow_set(btn, EINA_FALSE); \r
evas_object_smart_callback_add(btn, "clicked", func, data);\r
- edje_object_part_swallow(item->base, buf, btn);\r
+ edje_object_part_swallow(item->t_base, buf, btn);\r
elm_widget_sub_object_add(item->obj, btn);\r
btn_det->btn = btn;\r
btn_det->btn_id = button_type;\r
{\r
btn_ret = btn_det->btn;\r
elm_widget_sub_object_del(item->obj,btn_det->btn);\r
- edje_object_part_unswallow(item->base,btn_det->btn); \r
+ edje_object_part_unswallow(item->t_base,btn_det->btn); \r
item->fnbtn_list = eina_list_remove_list(item->fnbtn_list, bl);\r
btn_det->btn = NULL;\r
return btn_ret;\r
item->title_obj = title_obj;\r
if(title_obj)\r
{\r
+ if((item->title_obj)&&(item->title))\r
+ {\r
+ edje_object_signal_emit(item->base, "elm,state,extend,title", "elm");\r
+ } \r
elm_widget_sub_object_add(item->obj,title_obj);\r
- edje_object_part_swallow(item->base, "elm.swallow.title", title_obj);\r
+ edje_object_part_swallow(item->t_base, "elm.swallow.title", title_obj);\r
}\r
_sizing_eval(item->obj);\r
}\r
if(!item->title_obj) return NULL; \r
title_obj = item->title_obj;\r
elm_widget_sub_object_del(item->obj,item->title_obj);\r
- edje_object_part_unswallow(item->base,item->title_obj); \r
+ edje_object_part_unswallow(item->t_base,item->title_obj); \r
item->title_obj = NULL;\r
return title_obj;\r
}\r
strncpy(buf, "item/", sizeof(buf));\r
strncat(buf, item_style, sizeof(buf) - strlen(buf));\r
if (!eina_stringshare_replace(&item->item_style, item_style)) return;\r
- _elm_theme_object_set(item->obj, item->base, "navigationbar_ex", buf, elm_widget_style_get(item->obj));\r
+ _elm_theme_object_set(item->obj, item->t_base, "navigationbar_ex", buf, elm_widget_style_get(item->obj));\r
if(item->title)\r
- edje_object_part_text_set(item->base, "elm.text", item->title);\r
+ edje_object_part_text_set(item->t_base, "elm.text", item->title);\r
if(item->subtitle)\r
- edje_object_part_text_set(item->base, "elm.text.sub", item->subtitle);\r
+ edje_object_part_text_set(item->t_base, "elm.text.sub", item->subtitle);\r
if(item->fnbtn_list)\r
{\r
EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)\r
Eina_List *list;\r
if (!wd) return;\r
if (!wd->stack) return;\r
- list = eina_list_last(wd->stack);\r
+ it = eina_list_last(wd->stack)->data;\r
+ it->popme = EINA_TRUE;\r
+ list = eina_list_last(wd->stack);\r
if(list)\r
{\r
while(list)\r
list = list->prev;\r
}\r
} \r
- _eval_top(it->obj, EINA_FALSE);\r
+ _eval_top(it->obj);\r
if(wd->to_delete)\r
_process_deletions(wd);\r
}\r
if (!ll)\r
{\r
\r
- Evas_Object *o;\r
+ Evas_Object *o, *o2;\r
const char *onhide;\r
\r
wd->top = it;\r
- o = wd->top->base;\r
- \r
- edje_object_signal_emit(o, "elm,action,hide", "elm");\r
+ o = wd->top->ct_base;\r
+ o2 = wd->top->t_base; \r
+\r
+ edje_object_signal_emit(o2, "elm,action,pop", "elm");\r
+ edje_object_signal_emit(o, "elm,action,pop", "elm");\r
onhide = edje_object_data_get(o, "onhide");\r
if (onhide)\r
{\r
- if (!strcmp(onhide, "raise")) evas_object_raise(o);\r
- else if (!strcmp(onhide, "lower")) evas_object_lower(o);\r
+ if (!strcmp(onhide, "raise")) \r
+ {\r
+ evas_object_raise(o2);\r
+ evas_object_raise(o);\r
+ }\r
+ else if (!strcmp(onhide, "lower")) \r
+ {\r
+ evas_object_lower(o2);\r
+ evas_object_lower(o);\r
+ }\r
}\r
wd->top = NULL;\r
}\r
return it;\r
}\r
\r
+/**\r
+ * This disables content animation on push/pop.\r
+ *\r
+ * @param obj The navigationbar_ex object\r
+ * @param disable if EINA_TRUE animation is disabled.\r
+ *\r
+ * @ingroup Navigationbar_ex\r
+ */\r
+EAPI void\r
+elm_navigationbar_ex_animation_disable_set(Evas_Object *obj, \r
+ Eina_Bool disable)\r
+{\r
+ ELM_CHECK_WIDTYPE(obj, widtype)NULL;\r
+ Widget_Data *wd = elm_widget_data_get(obj);\r
+ wd->disable_animation = disable;\r
+}\r
+\r
\r