2 # include "elementary_config.h"
5 #define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
6 #define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED
7 #define ELM_WIDGET_ITEM_PROTECTED
9 #include <Elementary.h>
11 #include "elm_widget_naviframe.h"
12 #include "elm_widget_container.h"
14 #define MY_CLASS ELM_NAVIFRAME_CLASS
16 #define MY_CLASS_NAME "Elm_Naviframe"
17 #define MY_CLASS_NAME_LEGACY "elm_naviframe"
19 static const char CONTENT_PART[] = "elm.swallow.content";
20 static const char PREV_BTN_PART[] = "elm.swallow.prev_btn";
21 static const char NEXT_BTN_PART[] = "elm.swallow.next_btn";
22 static const char ICON_PART[] = "elm.swallow.icon";
23 static const char TITLE_PART[] = "elm.text.title";
24 static const char SUBTITLE_PART[] = "elm.text.subtitle";
25 static const char TITLE_ACCESS_PART[] = "access.title";
27 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
28 static const char SIG_TITLE_TRANSITION_FINISHED[] = "title,transition,finished";
29 static const char SIG_TITLE_CLICKED[] = "title,clicked";
30 static const char SIG_ITEM_ACTIVATED[] = "item,activated";
31 //TIZEN_ONLY(20161213): apply screen_reader_changed callback
32 static const char SIG_ATSPI_SCREEN_READER_CHANGED[] = "atspi,screen,reader,changed";
34 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
35 {SIG_TRANSITION_FINISHED, ""},
36 {SIG_TITLE_TRANSITION_FINISHED, ""},
37 {SIG_TITLE_CLICKED, ""},
38 {SIG_WIDGET_LANG_CHANGED, ""}, /**< handled by elm_widget */
39 {SIG_WIDGET_ACCESS_CHANGED, ""}, /**< handled by elm_widget */
40 {SIG_LAYOUT_FOCUSED, ""}, /**< handled by elm_layout */
41 {SIG_LAYOUT_UNFOCUSED, ""}, /**< handled by elm_layout */
42 {SIG_ITEM_ACTIVATED, ""},
43 //TIZEN_ONLY(20161213): apply screen_reader_changed callback
44 {SIG_ATSPI_SCREEN_READER_CHANGED, ""},
49 //TIZEN ONLY(20160829): Support tizen transition
50 static int initted = 0;
51 static Elm_Naviframe_Mod_Api *nf_mod = NULL;
59 if (initted > 1) return;
60 if (!(mod = _elm_module_find_as("naviframe/api"))) return;
62 mod->api = malloc(sizeof(Elm_Naviframe_Mod_Api));
63 if (!mod->api) return;
65 ((Elm_Naviframe_Mod_Api *)(mod->api))->tizen_push_effect =
66 _elm_module_symbol_get(mod, "tizen_push_effect");
67 ((Elm_Naviframe_Mod_Api *)(mod->api))->tizen_pop_effect =
68 _elm_module_symbol_get(mod, "tizen_pop_effect");
69 ((Elm_Naviframe_Mod_Api *)(mod->api))->tizen_push_deferred_effect =
70 _elm_module_symbol_get(mod, "tizen_push_deferred_effect");
71 ((Elm_Naviframe_Mod_Api *)(mod->api))->tizen_pop_deferred_effect =
72 _elm_module_symbol_get(mod, "tizen_pop_deferred_effect");
73 ((Elm_Naviframe_Mod_Api *)(mod->api))->tizen_effect_enabled_get =
74 _elm_module_symbol_get(mod, "tizen_effect_enabled_get");
75 ((Elm_Naviframe_Mod_Api *)(mod->api))->tizen_effect_cancel =
76 _elm_module_symbol_get(mod, "tizen_effect_cancel");
82 //TIZEN ONLY(20161208): Support tizen transition
84 _tizen_effect_enabled_get(Elm_Naviframe_Item_Data *it)
86 if (!it) return EINA_FALSE;
88 nf_mod->tizen_effect_enabled_get &&
89 nf_mod->tizen_effect_enabled_get(VIEW(it)))
98 static Eina_Bool _on_item_back_btn_clicked(void *data,
99 Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED);
101 static Eina_Bool _key_action_top_item_get(Evas_Object *obj, const char *params);
102 static Eina_Bool _key_action_item_pop(Evas_Object *obj, const char *params);
104 static char *_access_info_cb(void *data, Evas_Object *obj EINA_UNUSED);
106 static const Elm_Action key_actions[] = {
107 {"top_item_get", _key_action_top_item_get},
108 {"item_pop", _key_action_item_pop},
113 _resize_object_reset(Evas_Object *obj, Elm_Naviframe_Item_Data *it)
117 elm_widget_resize_object_set(obj, VIEW(it), EINA_FALSE);
118 evas_object_raise(VIEW(it));
123 _prev_page_focus_recover(Elm_Naviframe_Item_Data *it)
126 unsigned int order = 0;
128 newest = elm_widget_newest_focus_order_get(VIEW(it), &order, EINA_TRUE);
130 elm_object_focus_set(newest, EINA_TRUE);
133 if (elm_object_focus_allow_get(VIEW(it)))
134 elm_object_focus_set(VIEW(it), EINA_TRUE);
136 elm_object_focus_set(WIDGET(it), EINA_TRUE);
140 EOLIAN static Eina_Bool
141 _elm_naviframe_elm_widget_translate(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
143 Elm_Naviframe_Item_Data *it;
145 EINA_INLIST_FOREACH(sd->stack, it)
146 eo_do(EO_OBJ(it), elm_wdg_item_translate());
148 eo_do_super(obj, MY_CLASS, elm_obj_widget_translate());
154 _item_content_del_cb(void *data,
156 Evas_Object *obj EINA_UNUSED,
157 void *event_info EINA_UNUSED)
159 Elm_Naviframe_Item_Data *it = data;
162 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
166 _item_title_prev_btn_del_cb(void *data,
168 Evas_Object *obj EINA_UNUSED,
169 void *event_info EINA_UNUSED)
171 Elm_Naviframe_Item_Data *it = data;
173 it->title_prev_btn = NULL;
174 if (it->auto_pushed_btn) it->auto_pushed_btn = NULL;
175 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
179 _item_title_next_btn_del_cb(void *data,
181 Evas_Object *obj EINA_UNUSED,
182 void *event_info EINA_UNUSED)
184 Elm_Naviframe_Item_Data *it = data;
186 it->title_next_btn = NULL;
187 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
191 _item_title_icon_del_cb(void *data,
193 Evas_Object *obj EINA_UNUSED,
194 void *event_info EINA_UNUSED)
196 Elm_Naviframe_Item_Data *it = data;
198 it->title_icon = NULL;
199 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
203 _title_content_del(void *data,
205 Evas_Object *obj EINA_UNUSED,
206 void *event_info EINA_UNUSED)
209 Elm_Naviframe_Content_Item_Pair *pair = data;
210 Elm_Naviframe_Item_Data *it = pair->it;
211 snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
212 elm_object_signal_emit(VIEW(it), buf, "elm");
213 it->content_list = eina_inlist_remove(it->content_list,
214 EINA_INLIST_GET(pair));
215 eina_stringshare_del(pair->part);
220 _item_free(Elm_Naviframe_Item_Data *it)
223 Elm_Naviframe_Content_Item_Pair *content_pair;
224 Elm_Naviframe_Text_Item_Pair *text_pair;
226 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
228 eina_stringshare_del(it->style);
229 eina_stringshare_del(it->title_label);
230 eina_stringshare_del(it->subtitle_label);
232 EINA_INLIST_FOREACH_SAFE(it->content_list, l, content_pair)
234 if (content_pair->content)
236 evas_object_event_callback_del(content_pair->content,
239 evas_object_del(content_pair->content);
241 eina_stringshare_del(content_pair->part);
244 EINA_INLIST_FOREACH_SAFE(it->text_list, l, text_pair)
246 eina_stringshare_del(text_pair->part);
252 if ((sd->preserve) && (!sd->on_deletion))
254 /* so that elm does not delete the contents with the item's
255 * view after the destructor */
256 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
257 evas_object_event_callback_del
258 (it->content, EVAS_CALLBACK_DEL, _item_content_del_cb);
259 evas_object_hide(it->content);
265 _item_content_signals_emit(Elm_Naviframe_Item_Data *it)
267 Elm_Naviframe_Content_Item_Pair *content_pair;
271 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
273 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
276 if (it->title_prev_btn)
277 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
279 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
282 if (it->title_next_btn)
283 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
285 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
288 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
290 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
292 EINA_INLIST_FOREACH(it->content_list, content_pair)
294 if (content_pair->content)
295 snprintf(buf, sizeof(buf), "elm,state,%s,show", content_pair->part);
297 snprintf(buf, sizeof(buf), "elm,state,%s,hide", content_pair->part);
298 elm_object_signal_emit(VIEW(it), buf, "elm");
303 _item_text_signals_emit(Elm_Naviframe_Item_Data *it)
305 Elm_Naviframe_Text_Item_Pair *text_pair;
308 if ((it->title_label) && (it->title_label[0]))
309 elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
311 elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
313 if ((it->subtitle_label) && (it->subtitle_label[0]))
314 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
316 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
318 EINA_INLIST_FOREACH(it->text_list, text_pair)
320 if (elm_object_part_text_get(VIEW(it), text_pair->part))
321 snprintf(buf, sizeof(buf), "elm,state,%s,show", text_pair->part);
323 snprintf(buf, sizeof(buf), "elm,state,%s,hide", text_pair->part);
324 elm_object_signal_emit(VIEW(it), buf, "elm");
329 _access_object_get(Elm_Naviframe_Item_Data *it, const char* part)
331 Evas_Object *po, *ao;
333 po = (Evas_Object *)edje_object_part_object_get
334 (elm_layout_edje_get(VIEW(it)), part);
335 ao = evas_object_data_get(po, "_part_access_obj");
341 _access_info_has(Evas_Object *obj, int type)
347 ac = _elm_access_info_get(obj);
348 if (!ac) return EINA_FALSE;
350 EINA_LIST_FOREACH(ac->items, l, ai)
352 if (ai->type == type)
354 if (ai->func || ai->data) return EINA_TRUE;
362 _item_signals_emit(Elm_Naviframe_Item_Data *it)
364 _item_text_signals_emit(it);
365 _item_content_signals_emit(it);
368 //TIZEN ONLY(20151012): expose title as at-spi object
370 _atspi_expose_title(Elm_Naviframe_Item_Data *it, Eina_Bool is_atspi)
372 Evas_Object *part = NULL;
373 Evas_Object *access = NULL;
374 part = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(VIEW(it)),
379 access = elm_access_object_register(part, VIEW(it));
380 _elm_access_callback_set(_elm_access_info_get(access),
381 ELM_ACCESS_INFO, _access_info_cb, it);
382 elm_atspi_accessible_role_set(access, ELM_ATSPI_ROLE_HEADING);
385 elm_access_object_unregister(part);
389 /* FIXME: we need to handle the case when this function is called
390 * during a transition */
392 _item_style_set(Elm_Naviframe_Item_Data *it,
393 const char *item_style)
397 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
401 strcpy(buf, "item/basic");
402 eina_stringshare_replace(&it->style, "basic");
406 snprintf(buf, sizeof(buf), "item/%s", item_style);
407 eina_stringshare_replace(&it->style, item_style);
410 if (!elm_layout_theme_set(VIEW(it), "naviframe", buf,
411 elm_widget_style_get(WIDGET(it))))
412 CRI("Failed to set layout!");
414 if (sd->freeze_events)
415 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
417 //TIZEN ONLY(20151012): expose title as at-spi object
418 if (elm_atspi_bridge_utils_is_screen_reader_enabled())
419 _atspi_expose_title(it, EINA_TRUE);
424 _on_item_title_transition_finished(void *data,
425 Evas_Object *obj EINA_UNUSED,
426 const char *emission EINA_UNUSED,
427 const char *source EINA_UNUSED)
429 Elm_Naviframe_Item_Data *it = data;
431 eo_do(WIDGET(it), eo_event_callback_call
432 (ELM_NAVIFRAME_EVENT_TITLE_TRANSITION_FINISHED, EO_OBJ(it)));
436 _item_title_enabled_update(Elm_Naviframe_Item_Data *nit, Eina_Bool transition)
438 transition = !!transition;
441 if (nit->title_enabled)
442 elm_object_signal_emit(VIEW(nit), "elm,action,title,show", "elm");
444 elm_object_signal_emit(VIEW(nit), "elm,action,title,hide", "elm");
448 if (nit->title_enabled)
449 elm_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
451 elm_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
453 edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
456 EOLIAN static Elm_Theme_Apply
457 _elm_naviframe_elm_widget_theme_apply(Eo *obj, Elm_Naviframe_Data *sd)
459 Elm_Naviframe_Item_Data *it;
460 const char *style = NULL, *sstyle = NULL;
462 eo_do(obj, style = elm_obj_widget_style_get());
464 EINA_INLIST_FOREACH(sd->stack, it)
466 eo_do(VIEW(it), sstyle = elm_obj_widget_style_get());
467 if ((style && sstyle) && strcmp(style, sstyle))
468 _item_style_set(it, it->style);
469 _item_signals_emit(it);
470 _item_title_enabled_update(it, EINA_FALSE);
473 elm_layout_sizing_eval(obj);
474 return ELM_THEME_APPLY_SUCCESS;
478 _access_info_cb(void *data, Evas_Object *obj EINA_UNUSED)
480 Elm_Naviframe_Item_Data *nit;
487 if (!nit->title_enabled) return NULL;
490 info = elm_object_part_text_get(layout, TITLE_PART);
491 if (!info) return NULL;
493 buf = eina_strbuf_new();
494 eina_strbuf_append(buf, info);
495 //TIZEN ONLY(20160530): Read title after reading actual title
496 eina_strbuf_append_printf(buf, ", %s", N_("Title"));
499 info = elm_object_part_text_get(layout, SUBTITLE_PART);
501 //TIZEN ONLY(20160530): do not read subtitle even if text is empty
502 if (!strcmp(info, "")) goto end;
505 eina_strbuf_append_printf(buf, ", %s", info);
506 //TIZEN ONLY(20160530): Read subtitle after reading actual subtitle
507 eina_strbuf_append_printf(buf, ", %s", N_("Subtitle"));
511 ret = eina_strbuf_string_steal(buf);
512 eina_strbuf_free(buf);
517 _access_obj_process(Elm_Naviframe_Item_Data *it, Eina_Bool is_access)
519 Evas_Object *ao, *eo;
521 if (is_access && (it->title_label || it->subtitle_label))
523 if (!_access_object_get(it, TITLE_ACCESS_PART))
525 eo = elm_layout_edje_get(VIEW(it));
526 ao =_elm_access_edje_object_part_object_register(WIDGET(it), eo,
528 _elm_access_text_set(_elm_access_info_get(ao),
529 ELM_ACCESS_TYPE, E_("Title"));
530 _elm_access_callback_set(_elm_access_info_get(ao),
531 ELM_ACCESS_INFO, _access_info_cb, it);
532 /* to access title access object, any idea? */
533 it->base->access_obj = ao;
538 /* to access title access object, any idea? */
539 ao = it->base->access_obj;
542 if (it->title_label || it->subtitle_label)
543 _elm_access_edje_object_part_object_unregister
544 (WIDGET(it), elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
550 _elm_naviframe_item_elm_widget_item_part_text_set(Eo *eo_it EINA_UNUSED,
551 Elm_Naviframe_Item_Data *it,
555 Elm_Naviframe_Item_Data *nit = it;
556 Elm_Naviframe_Text_Item_Pair *pair = NULL;
559 if ((!part) || (!strcmp(part, "default")) ||
560 (!strcmp(part, TITLE_PART)))
562 eina_stringshare_replace(&nit->title_label, label);
564 elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
566 elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
567 elm_object_part_text_set(VIEW(it), TITLE_PART, label);
569 else if ((!strcmp(part, "subtitle")) || (!strcmp(part, SUBTITLE_PART)))
571 eina_stringshare_replace(&nit->subtitle_label, label);
573 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
575 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
576 elm_object_part_text_set(VIEW(it), SUBTITLE_PART, label);
580 EINA_INLIST_FOREACH(nit->text_list, pair)
581 if (!strcmp(part, pair->part)) break;
585 pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
588 ERR("Failed to allocate new text part of the item! : naviframe=%p",
592 eina_stringshare_replace(&pair->part, part);
593 nit->text_list = eina_inlist_append(nit->text_list,
594 EINA_INLIST_GET(pair));
597 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
599 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
600 elm_object_signal_emit(VIEW(it), buf, "elm");
601 elm_object_part_text_set(VIEW(it), part, label);
605 if (_elm_config->access_mode)
606 _access_obj_process(nit, EINA_TRUE);
608 memset(buf, 0x0, sizeof(buf));
609 if (nit->title_label)
610 strncat(buf, nit->title_label, sizeof(buf) - 1);
611 if (nit->subtitle_label)
613 if (nit->title_label) strncat(buf, " ", 1);
614 strncat(buf, nit->subtitle_label, sizeof(buf) - strlen(buf) - 2);
616 char *plain_text = _elm_util_mkup_to_text(buf);
617 eo_do(VIEW(it), elm_interface_atspi_accessible_name_set(plain_text));
620 elm_layout_sizing_eval(WIDGET(nit));
623 EOLIAN static const char *
624 _elm_naviframe_item_elm_widget_item_part_text_get(Eo *nit EINA_UNUSED,
625 Elm_Naviframe_Item_Data *it,
630 if (!part || !strcmp(part, "default"))
631 snprintf(buf, sizeof(buf), TITLE_PART);
632 else if (!strcmp("subtitle", part))
633 snprintf(buf, sizeof(buf), SUBTITLE_PART);
635 snprintf(buf, sizeof(buf), "%s", part);
637 return elm_object_part_text_get(VIEW(it), buf);
641 _elm_naviframe_item_eo_base_destructor(Eo *eo_item, Elm_Naviframe_Item_Data *it)
644 Elm_Naviframe_Op *nfo;
645 Elm_Naviframe_Item_Data *nit = it, *prev_it = NULL;
648 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
650 nit->delete_me = EINA_TRUE;
652 top = (eo_item == elm_naviframe_top_item_get(WIDGET(nit)));
653 if (evas_object_data_get(VIEW(nit), "out_of_list"))
656 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
658 if (top && !sd->on_deletion) /* must raise another one */
660 if (sd->stack && sd->stack->last)
661 prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last,
662 Elm_Naviframe_Item_Data);
665 elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE);
669 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_FALSE);
670 elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE);
672 if (sd->freeze_events)
673 evas_object_freeze_events_set(VIEW(prev_it), EINA_FALSE);
674 _resize_object_reset(WIDGET(prev_it), prev_it);
675 evas_object_show(VIEW(prev_it));
677 _prev_page_focus_recover(prev_it);
679 //TIZEN ONLY(20161208): Support tizen transition
680 //elm_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
681 if (_tizen_effect_enabled_get(nit))
682 nf_mod->tizen_effect_cancel(VIEW(nit));
684 if (_tizen_effect_enabled_get(prev_it))
685 nf_mod->tizen_effect_cancel(VIEW(prev_it));
687 elm_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
690 //TIZEN_ONLY(20171019): add state_notify api
691 if (_elm_atspi_enabled())
692 eo_do(VIEW(prev_it), elm_interface_atspi_accessible_state_notify(
693 ATSPI_STATE(ELM_ATSPI_STATE_SHOWING) | ATSPI_STATE(ELM_ATSPI_STATE_VISIBLE), EINA_TRUE));
696 eo_do(WIDGET(prev_it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, EO_OBJ(prev_it)));
700 // This should not happen, but just in case and by security
701 // make sure there is no more reference to this item.
702 EINA_LIST_FOREACH(sd->ops, l, nfo)
704 /* If an item is newly pushed and then deleted by elm_object_item_del()
705 * before item push transition is not started, then the item push
706 * transitions for both new item and current item should be cancelled.
707 * Otherwise, the current item becomes invisible due to the item push
709 if ((nit->pushing) && (nfo->self == nit))
716 if (nfo->self == nit)
718 if (nfo->related == nit)
725 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, eo_destructor());
729 _item_content_set(Elm_Naviframe_Item_Data *it,
730 Evas_Object *content)
732 if (it->content == content) return;
734 evas_object_del(it->content);
735 it->content = content;
737 if (!content) return;
739 elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
740 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
742 evas_object_event_callback_add
743 (content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
747 _item_title_prev_btn_set(Elm_Naviframe_Item_Data *it,
750 if (it->title_prev_btn == btn) return;
751 evas_object_del(it->title_prev_btn);
752 it->title_prev_btn = btn;
753 if (it->auto_pushed_btn && (it->auto_pushed_btn != btn))
754 it->auto_pushed_btn = NULL;
757 elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
758 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
759 evas_object_event_callback_add
760 (btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
762 //TIZEN ONLY(20161207): add reading text of back button
763 if (!elm_layout_text_get(btn, NULL))
765 if(_elm_config->atspi_mode)
766 eo_do(btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
770 //FIXME: set back button callback here after elm 2.0
774 _item_title_next_btn_set(Elm_Naviframe_Item_Data *it,
777 if (it->title_next_btn == btn) return;
778 evas_object_del(it->title_next_btn);
779 it->title_next_btn = btn;
782 elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
783 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
785 evas_object_event_callback_add
786 (btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
790 _item_title_icon_set(Elm_Naviframe_Item_Data *it,
793 if (it->title_icon == icon) return;
794 evas_object_del(it->title_icon);
795 it->title_icon = icon;
798 elm_object_part_content_set(VIEW(it), ICON_PART, icon);
799 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
801 evas_object_event_callback_add
802 (icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
806 _item_content_unset(Elm_Naviframe_Item_Data *it)
808 Evas_Object *content = it->content;
810 if (!content) return NULL;
812 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
813 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
815 evas_object_event_callback_del
816 (content, EVAS_CALLBACK_DEL, _item_content_del_cb);
823 _item_title_prev_btn_unset(Elm_Naviframe_Item_Data *it)
825 Evas_Object *content = it->title_prev_btn;
827 if (!content) return NULL;
829 elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
830 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
832 evas_object_event_callback_del
833 (content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
834 Eo* parent = eo_do_ret(content, parent, eo_parent_get());
835 eo_do(content, eo_event_callback_del(
836 EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked,
838 it->title_prev_btn = NULL;
839 if (it->auto_pushed_btn) it->auto_pushed_btn = NULL;
844 _item_title_next_btn_unset(Elm_Naviframe_Item_Data *it)
846 Evas_Object *content = it->title_next_btn;
848 if (!content) return NULL;
850 elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
851 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
853 evas_object_event_callback_del
854 (content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
856 it->title_next_btn = NULL;
861 _item_title_icon_unset(Elm_Naviframe_Item_Data *it)
863 Evas_Object *content = it->title_icon;
865 if (!content) return NULL;
867 elm_object_part_content_unset(VIEW(it), ICON_PART);
868 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
870 evas_object_event_callback_del
871 (content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
873 it->title_icon = NULL;
877 /* since we have each item as layout, we can't reusing the layout's
878 * aliasing, so let's do it ourselves */
880 _part_aliasing_eval(const char **part)
882 if (!*part || !strcmp(*part, "default"))
883 *part = CONTENT_PART;
884 else if (!strcmp(*part, "prev_btn"))
885 *part = PREV_BTN_PART;
886 else if (!strcmp(*part, "next_btn"))
887 *part = NEXT_BTN_PART;
888 else if (!strcmp(*part, "icon"))
893 _title_content_set(Elm_Naviframe_Item_Data *it,
895 Evas_Object *content)
897 Elm_Naviframe_Content_Item_Pair *pair = NULL;
900 EINA_INLIST_FOREACH(it->content_list, pair)
901 if (!strcmp(part, pair->part)) break;
904 if (pair->content == content) return;
906 evas_object_event_callback_del(pair->content,
909 if (content) elm_object_part_content_set(VIEW(it), part, content);
913 if (!content) return;
915 //Remove the pair if new content was swallowed into other part.
916 EINA_INLIST_FOREACH(it->content_list, pair)
918 if (pair->content == content)
920 eina_stringshare_del(pair->part);
921 it->content_list = eina_inlist_remove(it->content_list,
922 EINA_INLIST_GET(pair));
923 evas_object_event_callback_del(pair->content,
932 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
935 ERR("Failed to allocate new content part of the item! : naviframe=%p",
940 eina_stringshare_replace(&pair->part, part);
941 it->content_list = eina_inlist_append(it->content_list,
942 EINA_INLIST_GET(pair));
943 elm_object_part_content_set(VIEW(it), part, content);
944 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
945 elm_object_signal_emit(VIEW(it), buf, "elm");
947 pair->content = content;
948 evas_object_event_callback_add(content,
955 _elm_naviframe_item_elm_widget_item_part_content_set(Eo *eo_nit EINA_UNUSED,
956 Elm_Naviframe_Item_Data *nit,
958 Evas_Object *content)
960 _part_aliasing_eval(&part);
963 if (!strcmp(part, CONTENT_PART))
964 _item_content_set(nit, content);
965 else if (!strcmp(part, PREV_BTN_PART))
966 _item_title_prev_btn_set(nit, content);
967 else if (!strcmp(part, NEXT_BTN_PART))
968 _item_title_next_btn_set(nit, content);
969 else if (!strcmp(part, ICON_PART))
970 _item_title_icon_set(nit, content);
972 _title_content_set(nit, part, content);
974 elm_layout_sizing_eval(WIDGET(nit));
977 EOLIAN static Evas_Object *
978 _elm_naviframe_item_elm_widget_item_part_content_get(Eo *eo_nit EINA_UNUSED,
979 Elm_Naviframe_Item_Data *nit,
982 _part_aliasing_eval(&part);
985 if (!strcmp(part, CONTENT_PART))
987 else if (!strcmp(part, PREV_BTN_PART))
988 return nit->title_prev_btn;
989 else if (!strcmp(part, NEXT_BTN_PART))
990 return nit->title_next_btn;
991 else if (!strcmp(part, ICON_PART))
992 return nit->title_icon;
995 return elm_object_part_content_get(VIEW(nit), part);
999 _title_content_unset(Elm_Naviframe_Item_Data *it, const char *part)
1001 Elm_Naviframe_Content_Item_Pair *pair = NULL;
1003 Evas_Object *content = NULL;
1005 EINA_INLIST_FOREACH(it->content_list, pair)
1007 if (!strcmp(part, pair->part))
1009 content = pair->content;
1010 eina_stringshare_del(pair->part);
1011 it->content_list = eina_inlist_remove(it->content_list,
1012 EINA_INLIST_GET(pair));
1018 if (!content) return NULL;
1020 elm_object_part_content_unset(VIEW(it), part);
1021 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
1022 elm_object_signal_emit(VIEW(it), buf, "elm");
1023 evas_object_event_callback_del(content,
1025 _title_content_del);
1029 EOLIAN static Evas_Object *
1030 _elm_naviframe_item_elm_widget_item_part_content_unset(Eo *eo_nit EINA_UNUSED,
1031 Elm_Naviframe_Item_Data *nit,
1034 Evas_Object *o = NULL;
1036 _part_aliasing_eval(&part);
1039 if (!strcmp(part, CONTENT_PART))
1040 o = _item_content_unset(nit);
1041 else if (!strcmp(part, PREV_BTN_PART))
1042 o = _item_title_prev_btn_unset(nit);
1043 else if (!strcmp(part, NEXT_BTN_PART))
1044 o = _item_title_next_btn_unset(nit);
1045 else if (!strcmp(part, ICON_PART))
1046 o = _item_title_icon_unset(nit);
1048 o = _title_content_unset(nit, part);
1050 elm_layout_sizing_eval(WIDGET(nit));
1056 _elm_naviframe_item_elm_widget_item_signal_emit(Eo *eo_it EINA_UNUSED,
1057 Elm_Naviframe_Item_Data *it,
1058 const char *emission,
1061 elm_object_signal_emit(VIEW(it), emission, source);
1065 _elm_naviframe_elm_layout_sizing_eval(Eo *obj, Elm_Naviframe_Data *sd)
1067 Evas_Coord minw = -1, minh = -1;
1068 Elm_Naviframe_Item_Data *it, *top;
1069 Evas_Coord x, y, w, h;
1071 if (sd->on_deletion) return;
1072 if (!sd->stack) return;
1074 top = (EINA_INLIST_CONTAINER_GET(sd->stack->last, Elm_Naviframe_Item_Data));
1075 evas_object_geometry_get(obj, &x, &y, &w, &h);
1076 EINA_INLIST_FOREACH(sd->stack, it)
1078 evas_object_move(VIEW(it), x, y);
1079 evas_object_resize(VIEW(it), w, h);
1083 edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
1084 &it->minw, &it->minh);
1090 evas_object_size_hint_min_set(obj, minw, minh);
1091 evas_object_size_hint_max_set(obj, -1, -1);
1095 _on_item_back_btn_clicked(void *data,
1096 Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
1098 /* Since edje has the event queue, clicked event could be happened
1099 multiple times on some heavy environment. This callback del will
1100 prevent those scenario and guarantee only one clicked for it's own
1102 eo_do(obj, eo_event_callback_del(
1103 EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked,
1105 elm_naviframe_item_pop(data);
1110 static Evas_Object *
1111 _back_btn_new(Evas_Object *obj, const char *title_label)
1113 Evas_Object *btn, *ed;
1116 btn = elm_button_add(obj);
1118 if (!btn) return NULL;
1119 eo_do(btn, eo_event_callback_add
1120 (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked, obj));
1122 (buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
1123 elm_object_style_set(btn, buf);
1125 elm_layout_text_set(btn, NULL, title_label);
1127 elm_object_domain_translatable_text_set(btn, PACKAGE, N_("Back"));
1129 /* HACK NOTE: this explicit check only exists to avoid an ERR()
1130 * message from elm_layout_content_set().
1132 * The button was ALWAYS supposed to support an elm.swallow.content, but
1133 * default naviframe/back_btn/default theme did not provide such, then
1134 * old themes would emit such error message.
1136 * Once we can break the theme API, remove this check and always
1139 ed = elm_layout_edje_get(btn);
1140 if (edje_object_part_exists(ed, CONTENT_PART))
1142 Evas_Object *ico = elm_icon_add(btn);
1143 elm_icon_standard_set(ico, "arrow_left");
1144 elm_layout_content_set(btn, CONTENT_PART, ico);
1147 if(_elm_config->atspi_mode)
1148 eo_do(btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
1154 _elm_naviframe_elm_layout_signal_emit(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *emission, const char *source)
1156 Elm_Object_Item *eo_top_it;
1158 eo_top_it = elm_naviframe_top_item_get(obj);
1159 if (!eo_top_it) return;
1160 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1162 eo_do(VIEW(top_it), elm_obj_layout_signal_emit(emission, source));
1165 /* content/text smart functions proxying things to the top item, which
1166 * is the resize object of the layout */
1167 EOLIAN static Eina_Bool
1168 _elm_naviframe_elm_layout_text_set(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part, const char *label)
1170 Elm_Object_Item *it;
1171 const char *text = NULL;
1173 it = elm_naviframe_top_item_get(obj);
1174 if (!it) return EINA_FALSE;
1176 elm_object_item_part_text_set(it, part, label);
1177 text = elm_object_item_part_text_get(it, part);
1178 if ((text) && !strcmp(text, label))
1183 EOLIAN static const char*
1184 _elm_naviframe_elm_layout_text_get(const Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1186 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1187 if (!it) return NULL;
1189 return elm_object_item_part_text_get(it, part);
1192 /* we have to keep a "manual" set here because of the callbacks on the
1194 EOLIAN static Eina_Bool
1195 _elm_naviframe_elm_container_content_set(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part, Evas_Object *content)
1197 Elm_Object_Item *it;
1199 it = elm_naviframe_top_item_get(obj);
1200 if (!it) return EINA_FALSE;
1202 elm_object_item_part_content_set(it, part, content);
1204 if (content == elm_object_item_part_content_get(it, part))
1210 EOLIAN static Evas_Object*
1211 _elm_naviframe_elm_container_content_get(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1213 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1215 if (!it) return NULL;
1217 return elm_object_item_part_content_get(it, part);
1220 EOLIAN static Evas_Object*
1221 _elm_naviframe_elm_container_content_unset(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1223 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1225 if (!it) return NULL;
1227 return elm_object_item_part_content_unset(it, part);
1231 _on_item_title_clicked(void *data,
1232 Evas_Object *obj EINA_UNUSED,
1233 const char *emission EINA_UNUSED,
1234 const char *source EINA_UNUSED)
1236 Elm_Naviframe_Item_Data *it = data;
1238 eo_do(WIDGET(it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_TITLE_CLICKED, EO_OBJ(it)));
1241 /* "elm,state,cur,pushed"
1244 _on_item_push_finished(void *data,
1245 Evas_Object *obj EINA_UNUSED,
1246 const char *emission EINA_UNUSED,
1247 const char *source EINA_UNUSED)
1249 Elm_Naviframe_Item_Data *it = data;
1253 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1255 evas_object_hide(VIEW(it));
1256 //TIZEN_ONLY(20161122): add state_notify api
1257 if (_elm_atspi_enabled())
1258 eo_do(VIEW(it), elm_interface_atspi_accessible_state_notify(
1259 ATSPI_STATE(ELM_ATSPI_STATE_SHOWING) | ATSPI_STATE(ELM_ATSPI_STATE_VISIBLE), EINA_TRUE));
1262 //TIZEN ONLY(20161208): Support tizen transition
1263 //elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1264 if (!_tizen_effect_enabled_get(it))
1265 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1268 if (sd->freeze_events)
1269 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1272 /* "elm,state,cur,popped"
1275 _on_item_pop_finished(void *data,
1276 Evas_Object *obj EINA_UNUSED,
1277 const char *emission EINA_UNUSED,
1278 const char *source EINA_UNUSED)
1280 Elm_Naviframe_Item_Data *it = data;
1281 Elm_Naviframe_Item_Data *prev_it = NULL;
1282 Eo *widget = WIDGET(it);
1284 ELM_NAVIFRAME_DATA_GET(widget, sd);
1286 if (sd->stack && sd->stack->last)
1288 prev_it = EINA_INLIST_CONTAINER_GET
1289 (sd->stack->last, Elm_Naviframe_Item_Data);
1290 /* TIZEN_ONLY(20161229): resize prev item before raise.
1291 _resize_object_reset(WIDGET(it), prev_it);
1293 evas_object_raise(VIEW(prev_it));
1298 elm_widget_tree_unfocusable_set(VIEW(it), EINA_FALSE);
1299 sd->popping = eina_list_remove(sd->popping, it);
1301 eo_do(EO_OBJ(it), elm_wdg_item_del());
1304 /* "elm,state,new,pushed",
1305 * "elm,state,prev,popped
1308 _on_item_show_finished(void *data,
1309 Evas_Object *obj EINA_UNUSED,
1310 const char *emission EINA_UNUSED,
1311 const char *source EINA_UNUSED)
1313 Elm_Naviframe_Item_Data *it = data;
1315 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1317 //TIZEN ONLY(20161208): Support tizen transition
1318 //elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1319 if (!_tizen_effect_enabled_get(it))
1320 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1323 /* TIZEN_ONLY(20170811): Set focus to new item view immediately when new item is pushed to show keypad fast. */
1324 //elm_widget_tree_unfocusable_set(VIEW(it), EINA_FALSE);
1326 elm_widget_tree_unfocusable_set(VIEW(it), EINA_FALSE);
1328 _prev_page_focus_recover(it);
1330 if (sd->freeze_events)
1331 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1333 it->pushing = EINA_FALSE;
1334 //TIZEN_ONLY(20161122): add state_notify api
1335 if (EO_OBJ(it) == elm_naviframe_top_item_get(WIDGET(it)))
1337 _elm_win_default_label_obj_append(VIEW(it));
1339 if (_elm_atspi_enabled())
1341 eo_do(VIEW(it), elm_interface_atspi_accessible_state_notify(
1342 ATSPI_STATE(ELM_ATSPI_STATE_SHOWING) | ATSPI_STATE(ELM_ATSPI_STATE_VISIBLE), EINA_TRUE));
1347 eo_do(WIDGET(it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_TRANSITION_FINISHED, EO_OBJ(it)));
1349 if (EO_OBJ(it) == elm_naviframe_top_item_get(WIDGET(it)))
1350 eo_do(WIDGET(it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, EO_OBJ(it)));
1354 _on_item_size_hints_changed(void *data,
1355 Evas *e EINA_UNUSED,
1356 Evas_Object *obj EINA_UNUSED,
1357 void *event_info EINA_UNUSED)
1359 elm_layout_sizing_eval(data);
1363 _item_dispmode_set(Elm_Naviframe_Item_Data *it, Evas_Display_Mode dispmode)
1365 if (it->dispmode == dispmode) return;
1368 case EVAS_DISPLAY_MODE_COMPRESS:
1369 elm_object_signal_emit(VIEW(it), "elm,state,display,compress", "elm");
1372 elm_object_signal_emit(VIEW(it), "elm,state,display,default", "elm");
1375 it->dispmode = dispmode;
1379 _access_prev_btn_info_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
1381 return strdup(E_("Back"));
1385 _elm_naviframe_item_eo_base_constructor(Eo *eo_item, Elm_Naviframe_Item_Data *it)
1387 eo_item = eo_do_super_ret(eo_item, ELM_NAVIFRAME_ITEM_CLASS, eo_item, eo_constructor());
1388 it->base = eo_data_scope_get(eo_item, ELM_WIDGET_ITEM_CLASS);
1393 static Elm_Object_Item *
1394 _item_new(Evas_Object *obj,
1395 const Elm_Object_Item *eo_prev_it,
1396 const char *title_label,
1397 Evas_Object *prev_btn,
1398 Evas_Object *next_btn,
1399 Evas_Object *content,
1400 const char *item_style)
1404 ELM_NAVIFRAME_DATA_GET(obj, sd);
1406 eo_item = eo_add(ELM_NAVIFRAME_ITEM_CLASS, obj);
1410 ERR("Failed to allocate new item! : naviframe=%p", obj);
1414 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1417 VIEW(it) = elm_layout_add(obj);
1418 eo_do(VIEW(it), elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PAGE_TAB));
1419 char *plain_text = _elm_util_mkup_to_text((char*)title_label);
1420 eo_do(VIEW(it), elm_interface_atspi_accessible_name_set(plain_text));
1423 evas_object_smart_member_add(VIEW(it), obj);
1425 if (!elm_widget_sub_object_add(obj, VIEW(it)))
1426 ERR("could not add %p as sub object of %p", VIEW(it), obj);
1428 evas_object_event_callback_add
1429 (VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1430 _on_item_size_hints_changed, obj);
1432 elm_object_signal_callback_add
1433 (VIEW(it), "elm,action,show,finished", "*", _on_item_show_finished, it);
1434 elm_object_signal_callback_add
1435 (VIEW(it), "elm,action,pushed,finished", "*", _on_item_push_finished, it);
1436 elm_object_signal_callback_add
1437 (VIEW(it), "elm,action,popped,finished", "*", _on_item_pop_finished, it);
1438 elm_object_signal_callback_add
1439 (VIEW(it), "elm,action,title,transition,finished", "*", _on_item_title_transition_finished, it);
1440 elm_object_signal_callback_add
1441 (VIEW(it), "elm,action,title,clicked", "*", _on_item_title_clicked, it);
1443 _item_style_set(it, item_style);
1446 eo_do(eo_item, elm_wdg_item_part_text_set(TITLE_PART, title_label));
1449 if ((!prev_btn) && sd->auto_pushed && eo_prev_it)
1451 ELM_NAVIFRAME_ITEM_DATA_GET(eo_prev_it, prev_it);
1452 const char *prev_title = prev_it->title_label;
1453 prev_btn = _back_btn_new(obj, prev_title);
1454 it->auto_pushed_btn = prev_btn;
1455 /* TIZEN_ONLY(20161031): apply color_class parent-child relationship to all widgets */
1456 _elm_widget_color_class_parent_set(it->auto_pushed_btn, VIEW(it));
1462 eo_do(eo_item, elm_wdg_item_part_content_set(PREV_BTN_PART, prev_btn));
1463 if (!elm_layout_text_get(prev_btn, NULL))
1465 if (!_access_info_has(prev_btn, ELM_ACCESS_INFO))
1467 /* set access info */
1468 _elm_access_callback_set
1469 (_elm_access_info_get(prev_btn), ELM_ACCESS_INFO,
1470 _access_prev_btn_info_cb, it);
1473 //TIZEN ONLY(20161207): add reading text of back button
1474 if(_elm_config->atspi_mode)
1475 eo_do(prev_btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
1481 eo_do(eo_item, elm_wdg_item_part_content_set(NEXT_BTN_PART, next_btn));
1483 if (!elm_layout_text_get(next_btn, NULL))
1485 if (!_access_info_has(next_btn, ELM_ACCESS_INFO))
1487 /* set access info */
1488 _elm_access_text_set
1489 (_elm_access_info_get(next_btn), ELM_ACCESS_INFO, E_("Next"));
1494 _item_content_set(it, content);
1495 _item_dispmode_set(it, sd->dispmode);
1497 it->title_enabled = EINA_TRUE;
1503 _on_obj_size_hints_changed(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
1504 Evas_Object *obj, void *event_info EINA_UNUSED)
1506 Elm_Naviframe_Item_Data *it;
1507 Evas_Display_Mode dispmode;
1509 ELM_NAVIFRAME_DATA_GET(obj, sd);
1511 dispmode = evas_object_size_hint_display_mode_get(obj);
1512 if (sd->dispmode == dispmode) return;
1514 sd->dispmode = dispmode;
1516 EINA_INLIST_FOREACH(sd->stack, it)
1517 _item_dispmode_set(it, dispmode);
1520 EOLIAN static Eina_Bool
1521 _elm_naviframe_elm_widget_focus_next(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
1525 Eina_List *l = NULL;
1526 Elm_Object_Item *eo_top_it;
1527 void *(*list_data_get)(const Eina_List *list);
1529 Eina_Bool int_ret = EINA_FALSE;
1531 eo_top_it = elm_naviframe_top_item_get(obj);
1532 if (!eo_top_it) goto end;
1534 list_data_get = eina_list_data_get;
1536 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1537 l = eina_list_append(l, VIEW(top_it));
1540 if (_elm_config->access_mode)
1542 ao = _access_object_get(top_it, TITLE_ACCESS_PART);
1543 if (ao) l = eina_list_append(l, ao);
1546 int_ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next, next_item);
1553 int_ret = !elm_widget_focus_get(obj);
1559 EOLIAN static Eina_Bool
1560 _elm_naviframe_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED)
1565 EOLIAN static Eina_Bool
1566 _elm_naviframe_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
1570 Eina_List *l = NULL;
1571 Elm_Object_Item *eo_top_it;
1572 void *(*list_data_get)(const Eina_List *list);
1574 eo_top_it = elm_naviframe_top_item_get(obj);
1575 if (!eo_top_it) return EINA_FALSE;
1577 list_data_get = eina_list_data_get;
1579 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1580 l = eina_list_append(l, VIEW(top_it));
1582 int_ret = elm_widget_focus_list_direction_get
1583 (obj, base, l, list_data_get, degree, direction, direction_item, weight);
1590 //TIZEN_ONLY(20161208): add API elm_object_part_access_object_get
1591 EOLIAN static Evas_Object*
1592 _elm_naviframe_elm_widget_part_access_object_get(const Eo *obj, Elm_Naviframe_Data *_pd EINA_UNUSED, const char *part)
1594 Elm_Object_Item *eo_top_it = NULL;
1595 eo_do(obj, eo_top_it = elm_obj_naviframe_top_item_get());
1596 if (!eo_top_it) return NULL;
1598 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1599 return _access_object_get(top_it, part);
1604 _elm_naviframe_evas_object_smart_add(Eo *obj, Elm_Naviframe_Data *priv)
1606 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
1607 //TIZEN ONLY(20160829): Support tizen transition
1610 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
1611 elm_widget_sub_object_parent_add(obj);
1613 priv->dummy_edje = wd->resize_obj;
1614 evas_object_smart_member_add(priv->dummy_edje, obj);
1616 priv->auto_pushed = _elm_config->naviframe_prev_btn_auto_pushed;
1617 priv->freeze_events = EINA_TRUE;
1619 evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1620 _on_obj_size_hints_changed, obj);
1621 elm_widget_can_focus_set(obj, EINA_TRUE);
1625 _send_signal(Elm_Naviframe_Item_Data *it, const char *sig)
1628 elm_object_signal_emit(VIEW(it), sig, "elm");
1629 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1633 _deferred(void *data)
1635 Elm_Naviframe_Data *nfd = data;
1636 Elm_Naviframe_Op *nfo;
1638 EINA_LIST_FREE(nfd->ops, nfo)
1640 const char *signals_cur[] = {
1641 "elm,state,cur,popped,deferred",
1642 "elm,state,cur,pushed,deferred"
1644 const char *signals_prev = "elm,state,prev,popped,deferred";
1645 const char *signals_new = "elm,state,new,pushed,deferred";
1646 Elm_Naviframe_Item_Data *cur;
1647 Elm_Naviframe_Item_Data *other;
1649 cur = nfo->push ? nfo->related : nfo->self;
1650 other = nfo->push ? nfo->self : nfo->related;
1652 //TIZEN ONLY(20161208): Support tizen transition
1653 //_send_signal(cur, signals_cur[nfo->push]);
1654 //_send_signal(other, nfo->push ? signals_new : signals_prev);
1655 if (_tizen_effect_enabled_get(cur))
1659 if (nf_mod->tizen_push_deferred_effect)
1660 nf_mod->tizen_push_deferred_effect(WIDGET(cur), VIEW(cur),
1665 if (nf_mod->tizen_pop_deferred_effect)
1666 nf_mod->tizen_pop_deferred_effect(WIDGET(cur), VIEW(cur),
1671 _send_signal(cur, signals_cur[nfo->push]);
1673 if (_tizen_effect_enabled_get(other))
1677 if (nf_mod->tizen_push_deferred_effect)
1678 nf_mod->tizen_push_deferred_effect(WIDGET(other),
1679 VIEW(other), EINA_FALSE);
1683 if (nf_mod->tizen_pop_deferred_effect)
1684 nf_mod->tizen_pop_deferred_effect(WIDGET(other),
1685 VIEW(other), EINA_FALSE);
1689 _send_signal(other, nfo->push ? signals_new : signals_prev);
1695 nfd->animator = NULL;
1696 return ECORE_CALLBACK_CANCEL;
1700 _elm_naviframe_evas_object_smart_del(Eo *obj, Elm_Naviframe_Data *sd)
1702 Elm_Naviframe_Item_Data *it;
1703 Elm_Naviframe_Op *nfo;
1705 sd->on_deletion = EINA_TRUE;
1709 it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item_Data);
1710 eo_do(EO_OBJ(it), elm_wdg_item_del());
1713 //All popping items which are not called yet by animator.
1714 if (sd->animator) ecore_animator_del(sd->animator);
1715 EINA_LIST_FREE(sd->ops, nfo)
1717 EINA_LIST_FREE(sd->popping, it)
1718 eo_do(EO_OBJ(it), elm_wdg_item_del());
1720 evas_object_del(sd->dummy_edje);
1722 eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
1725 //Show only the top item view
1727 _elm_naviframe_evas_object_smart_show(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED)
1729 Elm_Object_Item *eo_top;
1731 eo_top = elm_naviframe_top_item_get(obj);
1732 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top, top);
1734 if (top && !top->delete_me)
1735 evas_object_show(VIEW(top));
1739 _key_action_top_item_get(Evas_Object *obj, const char *params EINA_UNUSED)
1741 Elm_Object_Item *eo_item = NULL;
1742 eo_do(obj, eo_item = elm_obj_naviframe_top_item_get());
1743 if (!eo_item) return EINA_FALSE;
1745 //FIXME: Replace this below code to elm_naviframe_item_pop() at elm 2.0.
1746 ///Leave for compatibility.
1747 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1748 if (it->title_prev_btn)
1749 eo_do(it->title_prev_btn, eo_event_callback_call(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL));
1755 _key_action_item_pop(Evas_Object *obj, const char *params EINA_UNUSED)
1757 Elm_Object_Item *eo_item = NULL;
1758 eo_item = elm_naviframe_top_item_get(obj);
1759 if (!eo_item) return EINA_FALSE;
1761 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1763 if (it->pushing || it->popping) return EINA_FALSE;
1765 elm_naviframe_item_pop(obj);
1770 EOLIAN static Eina_Bool
1771 _elm_naviframe_elm_widget_event(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, Evas_Object *src, Evas_Callback_Type type, void *event_info)
1774 Evas_Event_Key_Down *ev = event_info;
1776 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1777 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
1778 if (!_elm_config_key_binding_call(obj, ev, key_actions)) return EINA_FALSE;
1780 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1785 _elm_naviframe_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool is_access)
1787 Elm_Naviframe_Item_Data *it;
1789 EINA_INLIST_FOREACH(sd->stack, it)
1790 _access_obj_process(it, is_access);
1793 //TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
1794 //register/unregister access objects accordingly.
1795 // TIZEN_ONLY(20170516): connect to at-spi dbus based on org.a11y.Status.IsEnabled property
1797 _elm_naviframe_elm_widget_screen_reader(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool is_screen_reader)
1799 Elm_Naviframe_Item_Data *it;
1801 EINA_INLIST_FOREACH(sd->stack, it)
1802 _atspi_expose_title(it, is_screen_reader);
1804 //TIZEN_ONLY(20161213): apply screen_reader_changed callback
1805 evas_object_smart_callback_call(obj, SIG_ATSPI_SCREEN_READER_CHANGED, &is_screen_reader);
1812 _item_push_helper(Elm_Naviframe_Item_Data *item)
1814 Elm_Object_Item *eo_top_item;
1815 Evas_Object *obj = WIDGET(item);
1816 ELM_NAVIFRAME_DATA_GET(obj, sd);
1817 eo_top_item = elm_naviframe_top_item_get(obj);
1818 evas_object_show(VIEW(item));
1820 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_item, top_item);
1821 if (top_item) elm_widget_focused_object_clear(VIEW(top_item));
1822 _resize_object_reset(obj, item);
1825 Elm_Naviframe_Op *nfo = calloc(1, sizeof (Elm_Naviframe_Op));
1827 /* TIZEN_ONLY(20170811): Set focus to new item view immediately when new item is pushed to show keypad fast. */
1828 //elm_widget_tree_unfocusable_set(VIEW(item), EINA_TRUE);
1829 elm_widget_tree_unfocusable_set(VIEW(item), EINA_FALSE);
1831 elm_widget_tree_unfocusable_set(VIEW(top_item), EINA_TRUE);
1833 if (sd->freeze_events)
1835 evas_object_freeze_events_set(VIEW(item), EINA_TRUE);
1836 evas_object_freeze_events_set(VIEW(top_item), EINA_TRUE);
1839 //TIZEN ONLY(20161208): Support tizen transition
1840 //elm_object_signal_emit(VIEW(top_item), "elm,state,cur,pushed", "elm");
1841 //elm_object_signal_emit(VIEW(item), "elm,state,new,pushed", "elm");
1842 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(top_item)));
1843 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(item)));
1844 if (_tizen_effect_enabled_get(top_item))
1846 if (nf_mod->tizen_push_effect)
1847 nf_mod->tizen_push_effect(obj, VIEW(top_item), EINA_TRUE);
1851 elm_object_signal_emit(VIEW(top_item), "elm,state,cur,pushed", "elm");
1852 edje_object_message_signal_process(elm_layout_edje_get(VIEW(top_item)));
1855 if (_tizen_effect_enabled_get(item))
1857 if (nf_mod->tizen_push_effect)
1858 nf_mod->tizen_push_effect(obj, VIEW(item), EINA_FALSE);
1862 elm_object_signal_emit(VIEW(item), "elm,state,new,pushed", "elm");
1863 edje_object_message_signal_process(elm_layout_edje_get(VIEW(item)));
1868 nfo->related = top_item;
1869 nfo->push = EINA_TRUE;
1871 sd->ops = eina_list_append(sd->ops, nfo);
1872 if (!sd->animator) sd->animator = ecore_animator_add(_deferred, sd);
1874 if (top_item) top_item->pushing = EINA_FALSE;
1875 item->pushing = EINA_TRUE;
1879 if (elm_object_focus_allow_get(VIEW(item)))
1880 elm_object_focus_set(VIEW(item), EINA_TRUE);
1882 elm_object_focus_set(WIDGET(item), EINA_TRUE);
1885 sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(item));
1888 //TIZEN ONLY(20161208): Support tizen transition
1889 //elm_object_signal_emit(VIEW(item), "elm,state,visible", "elm");
1891 if (!_tizen_effect_enabled_get(item))
1892 elm_object_signal_emit(VIEW(item), "elm,state,visible", "elm");
1896 elm_layout_sizing_eval(obj);
1900 //TIZEN_ONLY(20170919): Handle default label object
1901 _elm_win_default_label_obj_append(VIEW(item));
1903 eo_do(obj, eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, EO_OBJ(item)));
1908 elm_naviframe_add(Evas_Object *parent)
1910 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1911 Evas_Object *obj = eo_add(MY_CLASS, parent);
1916 _elm_naviframe_eo_base_constructor(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED)
1918 obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
1920 evas_obj_type_set(MY_CLASS_NAME_LEGACY),
1921 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
1922 elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PAGE_TAB_LIST));
1927 EOLIAN static Elm_Object_Item*
1928 _elm_naviframe_item_push(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *title_label, Evas_Object *prev_btn, Evas_Object *next_btn, Evas_Object *content, const char *item_style)
1930 Elm_Object_Item *top_item, *eo_item;
1932 top_item = elm_naviframe_top_item_get(obj);
1933 eo_item = _item_new(obj, top_item,
1934 title_label, prev_btn, next_btn, content, item_style);
1935 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, item);
1936 if (!item) return NULL;
1938 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
1939 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(item));
1942 _item_push_helper(item);
1946 EOLIAN static Elm_Object_Item*
1947 _elm_naviframe_item_insert_before(Eo *obj, Elm_Naviframe_Data *sd, Elm_Object_Item *eo_before, const char *title_label, Evas_Object *prev_btn, Evas_Object *next_btn, Evas_Object *content, const char *item_style)
1949 Elm_Object_Item *eo_it;
1950 Elm_Naviframe_Item_Data *prev_it = NULL;
1952 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_before, NULL);
1953 ELM_NAVIFRAME_ITEM_DATA_GET(eo_before, before);
1955 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
1958 ELM_NAVIFRAME_ITEM_DATA_GET(eo_it, it);
1959 if (EINA_INLIST_GET(it)->prev)
1960 prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
1961 Elm_Naviframe_Item_Data);
1962 eo_it = _item_new(obj, EO_OBJ(prev_it),
1963 title_label, prev_btn, next_btn, content, item_style);
1964 if (!eo_it) return NULL;
1966 it = eo_data_scope_get(eo_it, ELM_NAVIFRAME_ITEM_CLASS);
1968 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
1969 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
1972 sd->stack = eina_inlist_prepend_relative
1973 (sd->stack, EINA_INLIST_GET(it),
1974 EINA_INLIST_GET(before));
1976 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1977 evas_object_hide(VIEW(it));
1978 //TIZEN ONLY(20161208): Support tizen transition
1979 //elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1980 if (!_tizen_effect_enabled_get(it))
1981 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1984 elm_layout_sizing_eval(obj);
1989 EOLIAN static Elm_Object_Item*
1990 _elm_naviframe_item_insert_after(Eo *obj, Elm_Naviframe_Data *sd, Elm_Object_Item *eo_after, const char *title_label, Evas_Object *prev_btn, Evas_Object *next_btn, Evas_Object *content, const char *item_style)
1992 Elm_Object_Item *eo_item;
1993 Eina_Bool top_inserted = EINA_FALSE;
1995 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_after, NULL);
1996 ELM_NAVIFRAME_ITEM_DATA_GET(eo_after, after);
1998 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
2000 eo_item = _item_new(obj, eo_after,
2001 title_label, prev_btn, next_btn, content, item_style);
2002 if (!eo_item) return NULL;
2004 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
2006 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
2007 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
2010 if (elm_naviframe_top_item_get(obj) == eo_after) top_inserted = EINA_TRUE;
2012 sd->stack = eina_inlist_append_relative
2013 (sd->stack, EINA_INLIST_GET(it),
2014 EINA_INLIST_GET(after));
2019 elm_widget_focused_object_clear(VIEW(after));
2020 elm_widget_tree_unfocusable_set(VIEW(after), EINA_TRUE);
2021 _resize_object_reset(obj, it);
2022 evas_object_show(VIEW(it));
2023 evas_object_hide(VIEW(after));
2024 //TIZEN_ONLY(20171019): add state_notify api
2025 if (_elm_atspi_enabled())
2026 eo_do(VIEW(after), elm_interface_atspi_accessible_state_notify(
2027 ATSPI_STATE(ELM_ATSPI_STATE_SHOWING) | ATSPI_STATE(ELM_ATSPI_STATE_VISIBLE), EINA_TRUE));
2029 if (elm_object_focus_allow_get(VIEW(it)))
2030 elm_object_focus_set(VIEW(it), EINA_TRUE);
2032 elm_object_focus_set(WIDGET(it), EINA_TRUE);
2033 //TIZEN ONLY(20161208): Support tizen transition
2034 //elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
2035 //elm_object_signal_emit(VIEW(after), "elm,state,invisible", "elm");
2036 if (!_tizen_effect_enabled_get(it))
2037 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
2039 if (!_tizen_effect_enabled_get(after))
2040 elm_object_signal_emit(VIEW(after), "elm,state,invisible", "elm");
2044 //TIZEN ONLY(20161208): Support tizen transition
2045 //elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
2047 if (!_tizen_effect_enabled_get(it))
2048 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
2052 elm_layout_sizing_eval(obj);
2056 //TIZEN_ONLY(20171019): Handle default label object
2057 _elm_win_default_label_obj_append(VIEW(it));
2058 if (_elm_atspi_enabled())
2059 eo_do(VIEW(it), elm_interface_atspi_accessible_state_notify(
2060 ATSPI_STATE(ELM_ATSPI_STATE_SHOWING) | ATSPI_STATE(ELM_ATSPI_STATE_VISIBLE), EINA_TRUE));
2062 eo_do(obj, eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, eo_item));
2068 EOLIAN static Evas_Object*
2069 _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd)
2071 Elm_Object_Item *eo_item;
2072 Elm_Naviframe_Item_Data *prev_it = NULL;
2073 Evas_Object *content = NULL;
2075 if (sd->freeze_events && sd->popping) return NULL;
2077 eo_item = elm_naviframe_top_item_get(obj);
2078 if (!eo_item) return NULL;
2080 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
2082 if (it->pushing || it->popping) return NULL;
2083 it->popping = EINA_TRUE;
2085 evas_object_ref(obj);
2089 if (!it->pop_cb(it->pop_data, eo_item))
2093 eo_do(eo_item, elm_wdg_item_del());
2096 /* To avoid multiple item pops, the auto pushed button deletes
2097 its clicked callback once it is called.
2098 Since the item is not popped or deleted here, the deleted
2099 callback of the auto pushed button should be restored. */
2100 if (it->auto_pushed_btn)
2101 eo_do(it->auto_pushed_btn, eo_event_callback_add
2102 (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED,
2103 _on_item_back_btn_clicked, obj));
2104 it->popping = EINA_FALSE;
2106 evas_object_unref(obj);
2111 evas_object_unref(obj);
2114 content = it->content;
2116 evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
2118 if (sd->stack->last->prev)
2119 prev_it = EINA_INLIST_CONTAINER_GET
2120 (sd->stack->last->prev, Elm_Naviframe_Item_Data);
2122 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
2126 Elm_Naviframe_Op *nfo = calloc(1, sizeof (Elm_Naviframe_Op));
2128 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
2130 if (sd->freeze_events)
2132 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
2133 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
2136 // TIZEN_ONLY(20161229): resize prev item before raise.
2137 elm_widget_resize_object_set(obj, VIEW(prev_it), EINA_FALSE);
2140 //TIZEN ONLY(20161208): Support tizen transition
2141 /* these 2 signals MUST take place simultaneously */
2142 //elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
2143 //elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
2144 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
2145 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
2146 if (_tizen_effect_enabled_get(it))
2148 if (nf_mod->tizen_pop_effect)
2149 nf_mod->tizen_pop_effect(obj, VIEW(it), EINA_TRUE);
2153 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
2154 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
2157 if (_tizen_effect_enabled_get(prev_it))
2159 if (nf_mod->tizen_pop_effect)
2160 nf_mod->tizen_pop_effect(obj, VIEW(prev_it), EINA_FALSE);
2164 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
2165 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
2169 //Show hidden previous view when pop transition begins.
2170 evas_object_show(VIEW(prev_it));
2172 if (!nfo) goto on_error;
2175 nfo->related = prev_it;
2176 nfo->push = EINA_FALSE;
2178 sd->popping = eina_list_append(sd->popping, it);
2179 sd->ops = eina_list_append(sd->ops, nfo);
2180 if (!sd->animator) sd->animator = ecore_animator_add(_deferred, sd);
2183 eo_do(eo_item, elm_wdg_item_del());
2190 _elm_naviframe_item_pop_to(Eo *eo_it, Elm_Naviframe_Item_Data *it)
2194 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
2196 if (eo_it == elm_naviframe_top_item_get(WIDGET(it))) return;
2198 l = sd->stack->last->prev;
2200 sd->on_deletion = EINA_TRUE;
2204 Elm_Naviframe_Item_Data *iit = EINA_INLIST_CONTAINER_GET
2205 (l, Elm_Naviframe_Item_Data);
2207 if (iit == it) break;
2211 eo_do(EO_OBJ(iit), elm_wdg_item_del());
2214 sd->on_deletion = EINA_FALSE;
2216 elm_naviframe_item_pop(WIDGET(it));
2220 _elm_naviframe_item_promote(Eo *eo_it, Elm_Naviframe_Item_Data *it)
2222 Elm_Object_Item *eo_prev_top;
2223 Elm_Naviframe_Item_Data *nit = it;
2225 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
2227 eo_prev_top = elm_naviframe_top_item_get(WIDGET(nit));
2228 if (eo_it == eo_prev_top) return;
2230 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
2231 _item_push_helper(nit);
2235 _elm_naviframe_item_simple_promote(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Evas_Object *content)
2237 Elm_Naviframe_Item_Data *itr;
2239 EINA_INLIST_FOREACH(sd->stack, itr)
2241 if (elm_object_item_content_get(EO_OBJ(itr)) == content)
2243 elm_naviframe_item_promote(EO_OBJ(itr));
2250 _elm_naviframe_content_preserve_on_pop_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool preserve)
2252 sd->preserve = !!preserve;
2255 EOLIAN static Eina_Bool
2256 _elm_naviframe_content_preserve_on_pop_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2258 return sd->preserve;
2261 EOLIAN static Elm_Object_Item*
2262 _elm_naviframe_top_item_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2264 if (!sd->stack) return NULL;
2265 Elm_Naviframe_Item_Data *ret_it = EINA_INLIST_CONTAINER_GET
2266 (sd->stack->last, Elm_Naviframe_Item_Data);
2267 return EO_OBJ(ret_it);
2270 EOLIAN static Elm_Object_Item*
2271 _elm_naviframe_bottom_item_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2273 if (!sd->stack) return NULL;
2274 Elm_Naviframe_Item_Data *ret_it = EINA_INLIST_CONTAINER_GET
2275 (sd->stack, Elm_Naviframe_Item_Data);
2276 return EO_OBJ(ret_it);
2280 _elm_naviframe_item_style_set(Eo *eo_item EINA_UNUSED,
2281 Elm_Naviframe_Item_Data *nit,
2282 const char *item_style)
2284 if (item_style && !strcmp(item_style, nit->style)) return;
2287 if (!strcmp("basic", nit->style)) return;
2289 _item_style_set(nit, item_style);
2290 _item_signals_emit(nit);
2291 _item_title_enabled_update(nit, EINA_FALSE);
2294 EOLIAN static const char *
2295 _elm_naviframe_item_style_get(Eo *eo_item EINA_UNUSED,
2296 Elm_Naviframe_Item_Data *nit)
2301 EINA_DEPRECATED EAPI void
2302 elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
2305 elm_naviframe_item_title_enabled_set(it, visible, EINA_FALSE);
2308 EINA_DEPRECATED EAPI Eina_Bool
2309 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
2311 return elm_naviframe_item_title_enabled_get(it);
2315 _elm_naviframe_item_title_enabled_set(Eo *eo_item EINA_UNUSED,
2316 Elm_Naviframe_Item_Data *nit,
2318 Eina_Bool transition)
2320 enabled = !!enabled;
2321 if (nit->title_enabled == enabled) return;
2323 nit->title_enabled = enabled;
2325 transition = !!transition;
2326 _item_title_enabled_update(nit, transition);
2329 EOLIAN static Eina_Bool
2330 _elm_naviframe_item_title_enabled_get(const Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data *nit)
2332 return nit->title_enabled;
2336 _elm_naviframe_item_pop_cb_set(Eo *eo_item EINA_UNUSED,
2337 Elm_Naviframe_Item_Data *nit,
2338 Elm_Naviframe_Item_Pop_Cb func,
2342 nit->pop_data = data;
2346 _elm_naviframe_prev_btn_auto_pushed_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool auto_pushed)
2348 sd->auto_pushed = !!auto_pushed;
2351 EOLIAN static Eina_Bool
2352 _elm_naviframe_prev_btn_auto_pushed_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2354 return sd->auto_pushed;
2357 EOLIAN static Eina_List*
2358 _elm_naviframe_items_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2360 Eina_List *ret = NULL;
2361 Elm_Naviframe_Item_Data *itr;
2363 EINA_INLIST_FOREACH(sd->stack, itr)
2364 ret = eina_list_append(ret, EO_OBJ(itr));
2370 _elm_naviframe_event_enabled_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool enabled)
2372 enabled = !!enabled;
2373 if (sd->freeze_events == !enabled) return;
2374 sd->freeze_events = !enabled;
2377 EOLIAN static Eina_Bool
2378 _elm_naviframe_event_enabled_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2380 return !sd->freeze_events;
2383 EOLIAN static Eina_Bool
2384 _elm_naviframe_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED)
2390 _elm_naviframe_class_constructor(Eo_Class *klass)
2392 evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
2395 EOLIAN const Elm_Atspi_Action *
2396 _elm_naviframe_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *pd EINA_UNUSED)
2398 static Elm_Atspi_Action atspi_actions[] = {
2399 { "top_item_get", "top_item_get", NULL, _key_action_top_item_get },
2400 { "item_pop", "item_pop", NULL, _key_action_item_pop },
2401 { NULL, NULL, NULL, NULL }
2403 return &atspi_actions[0];
2406 //TIZEN_ONLY(20161213) Using VIEW(item) for naviframe, naviframe item accessible information
2408 _elm_naviframe_elm_interface_atspi_accessible_name_get(Eo *eo, Elm_Naviframe_Data *pd EINA_UNUSED)
2410 const char *ret = NULL;
2411 Elm_Object_Item *eo_top_it = NULL;
2413 eo_top_it = elm_naviframe_top_item_get(eo);
2416 eo_do(eo_top_it, ret = elm_interface_atspi_accessible_name_get());
2423 _elm_naviframe_elm_interface_atspi_accessible_description_get(Eo *eo, Elm_Naviframe_Data *pd EINA_UNUSED)
2425 const char *ret = NULL;
2426 Elm_Object_Item *eo_top_it = NULL;
2428 eo_top_it = elm_naviframe_top_item_get(eo);
2431 eo_do(eo_top_it, ret = elm_interface_atspi_accessible_description_get());
2438 _elm_naviframe_item_elm_interface_atspi_accessible_name_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, const char *name)
2440 eo_do(VIEW(nit), elm_interface_atspi_accessible_name_set(name));
2444 _elm_naviframe_item_elm_interface_atspi_accessible_name_get(Eo *eo_item, Elm_Naviframe_Item_Data *nit)
2446 const char *ret = NULL;
2447 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, ret = elm_interface_atspi_accessible_name_get());
2448 if (ret) return ret;
2450 eo_do(VIEW(nit), ret = elm_interface_atspi_accessible_name_get());
2455 _elm_naviframe_item_elm_interface_atspi_accessible_description_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, const char *description)
2457 eo_do(VIEW(nit), elm_interface_atspi_accessible_description_set(description));
2461 _elm_naviframe_item_elm_interface_atspi_accessible_description_get(Eo *eo_item, Elm_Naviframe_Item_Data *nit)
2463 const char *ret = NULL;
2464 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, ret = elm_interface_atspi_accessible_description_get());
2465 if (ret) return ret;
2467 eo_do(VIEW(nit), ret = elm_interface_atspi_accessible_description_get());
2472 _elm_naviframe_item_elm_interface_atspi_accessible_translation_domain_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, const char *domain)
2474 eo_do(VIEW(nit), elm_interface_atspi_accessible_translation_domain_set(domain));
2477 EOLIAN static const char*
2478 _elm_naviframe_item_elm_interface_atspi_accessible_translation_domain_get(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit)
2480 const char *ret = NULL;
2481 eo_do(VIEW(nit), ret = elm_interface_atspi_accessible_translation_domain_get());
2486 _elm_naviframe_item_elm_interface_atspi_accessible_name_cb_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, Elm_Atspi_Reading_Info_Cb name_cb, const void *data)
2488 eo_do(VIEW(nit), elm_interface_atspi_accessible_name_cb_set(name_cb, data));
2492 _elm_naviframe_item_elm_interface_atspi_accessible_description_cb_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, Elm_Atspi_Reading_Info_Cb description_cb, const void *data)
2494 eo_do(VIEW(nit), elm_interface_atspi_accessible_description_cb_set(description_cb, data));
2498 #include "elm_naviframe_item.eo.c"
2499 #include "elm_naviframe.eo.c"