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 eo_do(WIDGET(prev_it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, EO_OBJ(prev_it)));
694 // This should not happen, but just in case and by security
695 // make sure there is no more reference to this item.
696 EINA_LIST_FOREACH(sd->ops, l, nfo)
698 /* If an item is newly pushed and then deleted by elm_object_item_del()
699 * before item push transition is not started, then the item push
700 * transitions for both new item and current item should be cancelled.
701 * Otherwise, the current item becomes invisible due to the item push
703 if ((nit->pushing) && (nfo->self == nit))
710 if (nfo->self == nit)
712 if (nfo->related == nit)
719 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, eo_destructor());
723 _item_content_set(Elm_Naviframe_Item_Data *it,
724 Evas_Object *content)
726 if (it->content == content) return;
728 evas_object_del(it->content);
729 it->content = content;
731 if (!content) return;
733 elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
734 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
736 evas_object_event_callback_add
737 (content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
741 _item_title_prev_btn_set(Elm_Naviframe_Item_Data *it,
744 if (it->title_prev_btn == btn) return;
745 evas_object_del(it->title_prev_btn);
746 it->title_prev_btn = btn;
747 if (it->auto_pushed_btn && (it->auto_pushed_btn != btn))
748 it->auto_pushed_btn = NULL;
751 elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
752 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
753 evas_object_event_callback_add
754 (btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
756 //TIZEN ONLY(20161207): add reading text of back button
757 if (!elm_layout_text_get(btn, NULL))
759 if(_elm_config->atspi_mode)
760 eo_do(btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
764 //FIXME: set back button callback here after elm 2.0
768 _item_title_next_btn_set(Elm_Naviframe_Item_Data *it,
771 if (it->title_next_btn == btn) return;
772 evas_object_del(it->title_next_btn);
773 it->title_next_btn = btn;
776 elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
777 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
779 evas_object_event_callback_add
780 (btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
784 _item_title_icon_set(Elm_Naviframe_Item_Data *it,
787 if (it->title_icon == icon) return;
788 evas_object_del(it->title_icon);
789 it->title_icon = icon;
792 elm_object_part_content_set(VIEW(it), ICON_PART, icon);
793 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
795 evas_object_event_callback_add
796 (icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
800 _item_content_unset(Elm_Naviframe_Item_Data *it)
802 Evas_Object *content = it->content;
804 if (!content) return NULL;
806 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
807 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
809 evas_object_event_callback_del
810 (content, EVAS_CALLBACK_DEL, _item_content_del_cb);
817 _item_title_prev_btn_unset(Elm_Naviframe_Item_Data *it)
819 Evas_Object *content = it->title_prev_btn;
821 if (!content) return NULL;
823 elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
824 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
826 evas_object_event_callback_del
827 (content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
828 Eo* parent = eo_do_ret(content, parent, eo_parent_get());
829 eo_do(content, eo_event_callback_del(
830 EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked,
832 it->title_prev_btn = NULL;
833 if (it->auto_pushed_btn) it->auto_pushed_btn = NULL;
838 _item_title_next_btn_unset(Elm_Naviframe_Item_Data *it)
840 Evas_Object *content = it->title_next_btn;
842 if (!content) return NULL;
844 elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
845 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
847 evas_object_event_callback_del
848 (content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
850 it->title_next_btn = NULL;
855 _item_title_icon_unset(Elm_Naviframe_Item_Data *it)
857 Evas_Object *content = it->title_icon;
859 if (!content) return NULL;
861 elm_object_part_content_unset(VIEW(it), ICON_PART);
862 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
864 evas_object_event_callback_del
865 (content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
867 it->title_icon = NULL;
871 /* since we have each item as layout, we can't reusing the layout's
872 * aliasing, so let's do it ourselves */
874 _part_aliasing_eval(const char **part)
876 if (!*part || !strcmp(*part, "default"))
877 *part = CONTENT_PART;
878 else if (!strcmp(*part, "prev_btn"))
879 *part = PREV_BTN_PART;
880 else if (!strcmp(*part, "next_btn"))
881 *part = NEXT_BTN_PART;
882 else if (!strcmp(*part, "icon"))
887 _title_content_set(Elm_Naviframe_Item_Data *it,
889 Evas_Object *content)
891 Elm_Naviframe_Content_Item_Pair *pair = NULL;
894 EINA_INLIST_FOREACH(it->content_list, pair)
895 if (!strcmp(part, pair->part)) break;
898 if (pair->content == content) return;
900 evas_object_event_callback_del(pair->content,
903 if (content) elm_object_part_content_set(VIEW(it), part, content);
907 if (!content) return;
909 //Remove the pair if new content was swallowed into other part.
910 EINA_INLIST_FOREACH(it->content_list, pair)
912 if (pair->content == content)
914 eina_stringshare_del(pair->part);
915 it->content_list = eina_inlist_remove(it->content_list,
916 EINA_INLIST_GET(pair));
917 evas_object_event_callback_del(pair->content,
926 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
929 ERR("Failed to allocate new content part of the item! : naviframe=%p",
934 eina_stringshare_replace(&pair->part, part);
935 it->content_list = eina_inlist_append(it->content_list,
936 EINA_INLIST_GET(pair));
937 elm_object_part_content_set(VIEW(it), part, content);
938 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
939 elm_object_signal_emit(VIEW(it), buf, "elm");
941 pair->content = content;
942 evas_object_event_callback_add(content,
949 _elm_naviframe_item_elm_widget_item_part_content_set(Eo *eo_nit EINA_UNUSED,
950 Elm_Naviframe_Item_Data *nit,
952 Evas_Object *content)
954 _part_aliasing_eval(&part);
957 if (!strcmp(part, CONTENT_PART))
958 _item_content_set(nit, content);
959 else if (!strcmp(part, PREV_BTN_PART))
960 _item_title_prev_btn_set(nit, content);
961 else if (!strcmp(part, NEXT_BTN_PART))
962 _item_title_next_btn_set(nit, content);
963 else if (!strcmp(part, ICON_PART))
964 _item_title_icon_set(nit, content);
966 _title_content_set(nit, part, content);
968 elm_layout_sizing_eval(WIDGET(nit));
971 EOLIAN static Evas_Object *
972 _elm_naviframe_item_elm_widget_item_part_content_get(Eo *eo_nit EINA_UNUSED,
973 Elm_Naviframe_Item_Data *nit,
976 _part_aliasing_eval(&part);
979 if (!strcmp(part, CONTENT_PART))
981 else if (!strcmp(part, PREV_BTN_PART))
982 return nit->title_prev_btn;
983 else if (!strcmp(part, NEXT_BTN_PART))
984 return nit->title_next_btn;
985 else if (!strcmp(part, ICON_PART))
986 return nit->title_icon;
989 return elm_object_part_content_get(VIEW(nit), part);
993 _title_content_unset(Elm_Naviframe_Item_Data *it, const char *part)
995 Elm_Naviframe_Content_Item_Pair *pair = NULL;
997 Evas_Object *content = NULL;
999 EINA_INLIST_FOREACH(it->content_list, pair)
1001 if (!strcmp(part, pair->part))
1003 content = pair->content;
1004 eina_stringshare_del(pair->part);
1005 it->content_list = eina_inlist_remove(it->content_list,
1006 EINA_INLIST_GET(pair));
1012 if (!content) return NULL;
1014 elm_object_part_content_unset(VIEW(it), part);
1015 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
1016 elm_object_signal_emit(VIEW(it), buf, "elm");
1017 evas_object_event_callback_del(content,
1019 _title_content_del);
1023 EOLIAN static Evas_Object *
1024 _elm_naviframe_item_elm_widget_item_part_content_unset(Eo *eo_nit EINA_UNUSED,
1025 Elm_Naviframe_Item_Data *nit,
1028 Evas_Object *o = NULL;
1030 _part_aliasing_eval(&part);
1033 if (!strcmp(part, CONTENT_PART))
1034 o = _item_content_unset(nit);
1035 else if (!strcmp(part, PREV_BTN_PART))
1036 o = _item_title_prev_btn_unset(nit);
1037 else if (!strcmp(part, NEXT_BTN_PART))
1038 o = _item_title_next_btn_unset(nit);
1039 else if (!strcmp(part, ICON_PART))
1040 o = _item_title_icon_unset(nit);
1042 o = _title_content_unset(nit, part);
1044 elm_layout_sizing_eval(WIDGET(nit));
1050 _elm_naviframe_item_elm_widget_item_signal_emit(Eo *eo_it EINA_UNUSED,
1051 Elm_Naviframe_Item_Data *it,
1052 const char *emission,
1055 elm_object_signal_emit(VIEW(it), emission, source);
1059 _elm_naviframe_elm_layout_sizing_eval(Eo *obj, Elm_Naviframe_Data *sd)
1061 Evas_Coord minw = -1, minh = -1;
1062 Elm_Naviframe_Item_Data *it, *top;
1063 Evas_Coord x, y, w, h;
1065 if (sd->on_deletion) return;
1066 if (!sd->stack) return;
1068 top = (EINA_INLIST_CONTAINER_GET(sd->stack->last, Elm_Naviframe_Item_Data));
1069 evas_object_geometry_get(obj, &x, &y, &w, &h);
1070 EINA_INLIST_FOREACH(sd->stack, it)
1072 evas_object_move(VIEW(it), x, y);
1073 evas_object_resize(VIEW(it), w, h);
1077 edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
1078 &it->minw, &it->minh);
1084 evas_object_size_hint_min_set(obj, minw, minh);
1085 evas_object_size_hint_max_set(obj, -1, -1);
1089 _on_item_back_btn_clicked(void *data,
1090 Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
1092 /* Since edje has the event queue, clicked event could be happened
1093 multiple times on some heavy environment. This callback del will
1094 prevent those scenario and guarantee only one clicked for it's own
1096 eo_do(obj, eo_event_callback_del(
1097 EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked,
1099 elm_naviframe_item_pop(data);
1104 static Evas_Object *
1105 _back_btn_new(Evas_Object *obj, const char *title_label)
1107 Evas_Object *btn, *ed;
1110 btn = elm_button_add(obj);
1112 if (!btn) return NULL;
1113 eo_do(btn, eo_event_callback_add
1114 (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked, obj));
1116 (buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
1117 elm_object_style_set(btn, buf);
1119 elm_layout_text_set(btn, NULL, title_label);
1121 elm_object_domain_translatable_text_set(btn, PACKAGE, N_("Back"));
1123 /* HACK NOTE: this explicit check only exists to avoid an ERR()
1124 * message from elm_layout_content_set().
1126 * The button was ALWAYS supposed to support an elm.swallow.content, but
1127 * default naviframe/back_btn/default theme did not provide such, then
1128 * old themes would emit such error message.
1130 * Once we can break the theme API, remove this check and always
1133 ed = elm_layout_edje_get(btn);
1134 if (edje_object_part_exists(ed, CONTENT_PART))
1136 Evas_Object *ico = elm_icon_add(btn);
1137 elm_icon_standard_set(ico, "arrow_left");
1138 elm_layout_content_set(btn, CONTENT_PART, ico);
1141 if(_elm_config->atspi_mode)
1142 eo_do(btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
1148 _elm_naviframe_elm_layout_signal_emit(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *emission, const char *source)
1150 Elm_Object_Item *eo_top_it;
1152 eo_top_it = elm_naviframe_top_item_get(obj);
1153 if (!eo_top_it) return;
1154 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1156 eo_do(VIEW(top_it), elm_obj_layout_signal_emit(emission, source));
1159 /* content/text smart functions proxying things to the top item, which
1160 * is the resize object of the layout */
1161 EOLIAN static Eina_Bool
1162 _elm_naviframe_elm_layout_text_set(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part, const char *label)
1164 Elm_Object_Item *it;
1165 const char *text = NULL;
1167 it = elm_naviframe_top_item_get(obj);
1168 if (!it) return EINA_FALSE;
1170 elm_object_item_part_text_set(it, part, label);
1171 text = elm_object_item_part_text_get(it, part);
1172 if ((text) && !strcmp(text, label))
1177 EOLIAN static const char*
1178 _elm_naviframe_elm_layout_text_get(const Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1180 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1181 if (!it) return NULL;
1183 return elm_object_item_part_text_get(it, part);
1186 /* we have to keep a "manual" set here because of the callbacks on the
1188 EOLIAN static Eina_Bool
1189 _elm_naviframe_elm_container_content_set(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part, Evas_Object *content)
1191 Elm_Object_Item *it;
1193 it = elm_naviframe_top_item_get(obj);
1194 if (!it) return EINA_FALSE;
1196 elm_object_item_part_content_set(it, part, content);
1198 if (content == elm_object_item_part_content_get(it, part))
1204 EOLIAN static Evas_Object*
1205 _elm_naviframe_elm_container_content_get(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1207 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1209 if (!it) return NULL;
1211 return elm_object_item_part_content_get(it, part);
1214 EOLIAN static Evas_Object*
1215 _elm_naviframe_elm_container_content_unset(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1217 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1219 if (!it) return NULL;
1221 return elm_object_item_part_content_unset(it, part);
1225 _on_item_title_clicked(void *data,
1226 Evas_Object *obj EINA_UNUSED,
1227 const char *emission EINA_UNUSED,
1228 const char *source EINA_UNUSED)
1230 Elm_Naviframe_Item_Data *it = data;
1232 eo_do(WIDGET(it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_TITLE_CLICKED, EO_OBJ(it)));
1235 /* "elm,state,cur,pushed"
1238 _on_item_push_finished(void *data,
1239 Evas_Object *obj EINA_UNUSED,
1240 const char *emission EINA_UNUSED,
1241 const char *source EINA_UNUSED)
1243 Elm_Naviframe_Item_Data *it = data;
1247 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1249 evas_object_hide(VIEW(it));
1250 //TIZEN_ONLY(20161122): add state_notify api
1251 if (_elm_atspi_enabled())
1252 eo_do(VIEW(it), elm_interface_atspi_accessible_state_notify(
1253 ATSPI_STATE(ELM_ATSPI_STATE_SHOWING) | ATSPI_STATE(ELM_ATSPI_STATE_VISIBLE), EINA_TRUE));
1256 //TIZEN ONLY(20161208): Support tizen transition
1257 //elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1258 if (!_tizen_effect_enabled_get(it))
1259 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1262 if (sd->freeze_events)
1263 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1266 /* "elm,state,cur,popped"
1269 _on_item_pop_finished(void *data,
1270 Evas_Object *obj EINA_UNUSED,
1271 const char *emission EINA_UNUSED,
1272 const char *source EINA_UNUSED)
1274 Elm_Naviframe_Item_Data *it = data;
1275 Elm_Naviframe_Item_Data *prev_it = NULL;
1276 Eo *widget = WIDGET(it);
1278 ELM_NAVIFRAME_DATA_GET(widget, sd);
1280 if (sd->stack && sd->stack->last)
1282 prev_it = EINA_INLIST_CONTAINER_GET
1283 (sd->stack->last, Elm_Naviframe_Item_Data);
1284 /* TIZEN_ONLY(20161229): resize prev item before raise.
1285 _resize_object_reset(WIDGET(it), prev_it);
1287 evas_object_raise(VIEW(prev_it));
1292 elm_widget_tree_unfocusable_set(VIEW(it), EINA_FALSE);
1293 sd->popping = eina_list_remove(sd->popping, it);
1295 eo_do(EO_OBJ(it), elm_wdg_item_del());
1297 //TIZEN_ONLY(20161122): add state_notify api
1298 Eo *eo_top = elm_naviframe_top_item_get(widget);
1301 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top, top);
1302 _elm_win_default_label_obj_append(VIEW(top));
1304 if (_elm_atspi_enabled())
1306 eo_do(VIEW(top), elm_interface_atspi_accessible_state_notify(
1307 ATSPI_STATE(ELM_ATSPI_STATE_SHOWING) | ATSPI_STATE(ELM_ATSPI_STATE_VISIBLE), EINA_TRUE));
1313 /* "elm,state,new,pushed",
1314 * "elm,state,prev,popped
1317 _on_item_show_finished(void *data,
1318 Evas_Object *obj EINA_UNUSED,
1319 const char *emission EINA_UNUSED,
1320 const char *source EINA_UNUSED)
1322 Elm_Naviframe_Item_Data *it = data;
1324 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1326 //TIZEN ONLY(20161208): Support tizen transition
1327 //elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1328 if (!_tizen_effect_enabled_get(it))
1329 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1332 /* TIZEN_ONLY(20170811): Set focus to new item view immediately when new item is pushed to show keypad fast. */
1333 //elm_widget_tree_unfocusable_set(VIEW(it), EINA_FALSE);
1335 elm_widget_tree_unfocusable_set(VIEW(it), EINA_FALSE);
1337 _prev_page_focus_recover(it);
1339 if (sd->freeze_events)
1340 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1342 it->pushing = EINA_FALSE;
1344 eo_do(WIDGET(it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_TRANSITION_FINISHED, EO_OBJ(it)));
1346 if (EO_OBJ(it) == elm_naviframe_top_item_get(WIDGET(it)))
1348 eo_do(WIDGET(it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, EO_OBJ(it)));
1349 //TIZEN_ONLY(20170919): Handle default label object
1350 _elm_win_default_label_obj_append(VIEW(it));
1356 _on_item_size_hints_changed(void *data,
1357 Evas *e EINA_UNUSED,
1358 Evas_Object *obj EINA_UNUSED,
1359 void *event_info EINA_UNUSED)
1361 elm_layout_sizing_eval(data);
1365 _item_dispmode_set(Elm_Naviframe_Item_Data *it, Evas_Display_Mode dispmode)
1367 if (it->dispmode == dispmode) return;
1370 case EVAS_DISPLAY_MODE_COMPRESS:
1371 elm_object_signal_emit(VIEW(it), "elm,state,display,compress", "elm");
1374 elm_object_signal_emit(VIEW(it), "elm,state,display,default", "elm");
1377 it->dispmode = dispmode;
1381 _access_prev_btn_info_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
1383 return strdup(E_("Back"));
1387 _elm_naviframe_item_eo_base_constructor(Eo *eo_item, Elm_Naviframe_Item_Data *it)
1389 eo_item = eo_do_super_ret(eo_item, ELM_NAVIFRAME_ITEM_CLASS, eo_item, eo_constructor());
1390 it->base = eo_data_scope_get(eo_item, ELM_WIDGET_ITEM_CLASS);
1395 static Elm_Object_Item *
1396 _item_new(Evas_Object *obj,
1397 const Elm_Object_Item *eo_prev_it,
1398 const char *title_label,
1399 Evas_Object *prev_btn,
1400 Evas_Object *next_btn,
1401 Evas_Object *content,
1402 const char *item_style)
1406 ELM_NAVIFRAME_DATA_GET(obj, sd);
1408 eo_item = eo_add(ELM_NAVIFRAME_ITEM_CLASS, obj);
1412 ERR("Failed to allocate new item! : naviframe=%p", obj);
1416 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1419 VIEW(it) = elm_layout_add(obj);
1420 eo_do(VIEW(it), elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PAGE_TAB));
1421 char *plain_text = _elm_util_mkup_to_text((char*)title_label);
1422 eo_do(VIEW(it), elm_interface_atspi_accessible_name_set(plain_text));
1425 evas_object_smart_member_add(VIEW(it), obj);
1427 if (!elm_widget_sub_object_add(obj, VIEW(it)))
1428 ERR("could not add %p as sub object of %p", VIEW(it), obj);
1430 evas_object_event_callback_add
1431 (VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1432 _on_item_size_hints_changed, obj);
1434 elm_object_signal_callback_add
1435 (VIEW(it), "elm,action,show,finished", "*", _on_item_show_finished, it);
1436 elm_object_signal_callback_add
1437 (VIEW(it), "elm,action,pushed,finished", "*", _on_item_push_finished, it);
1438 elm_object_signal_callback_add
1439 (VIEW(it), "elm,action,popped,finished", "*", _on_item_pop_finished, it);
1440 elm_object_signal_callback_add
1441 (VIEW(it), "elm,action,title,transition,finished", "*", _on_item_title_transition_finished, it);
1442 elm_object_signal_callback_add
1443 (VIEW(it), "elm,action,title,clicked", "*", _on_item_title_clicked, it);
1445 _item_style_set(it, item_style);
1448 eo_do(eo_item, elm_wdg_item_part_text_set(TITLE_PART, title_label));
1451 if ((!prev_btn) && sd->auto_pushed && eo_prev_it)
1453 ELM_NAVIFRAME_ITEM_DATA_GET(eo_prev_it, prev_it);
1454 const char *prev_title = prev_it->title_label;
1455 prev_btn = _back_btn_new(obj, prev_title);
1456 it->auto_pushed_btn = prev_btn;
1457 /* TIZEN_ONLY(20161031): apply color_class parent-child relationship to all widgets */
1458 _elm_widget_color_class_parent_set(it->auto_pushed_btn, VIEW(it));
1464 eo_do(eo_item, elm_wdg_item_part_content_set(PREV_BTN_PART, prev_btn));
1465 if (!elm_layout_text_get(prev_btn, NULL))
1467 if (!_access_info_has(prev_btn, ELM_ACCESS_INFO))
1469 /* set access info */
1470 _elm_access_callback_set
1471 (_elm_access_info_get(prev_btn), ELM_ACCESS_INFO,
1472 _access_prev_btn_info_cb, it);
1475 //TIZEN ONLY(20161207): add reading text of back button
1476 if(_elm_config->atspi_mode)
1477 eo_do(prev_btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
1483 eo_do(eo_item, elm_wdg_item_part_content_set(NEXT_BTN_PART, next_btn));
1485 if (!elm_layout_text_get(next_btn, NULL))
1487 if (!_access_info_has(next_btn, ELM_ACCESS_INFO))
1489 /* set access info */
1490 _elm_access_text_set
1491 (_elm_access_info_get(next_btn), ELM_ACCESS_INFO, E_("Next"));
1496 _item_content_set(it, content);
1497 _item_dispmode_set(it, sd->dispmode);
1499 it->title_enabled = EINA_TRUE;
1505 _on_obj_size_hints_changed(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
1506 Evas_Object *obj, void *event_info EINA_UNUSED)
1508 Elm_Naviframe_Item_Data *it;
1509 Evas_Display_Mode dispmode;
1511 ELM_NAVIFRAME_DATA_GET(obj, sd);
1513 dispmode = evas_object_size_hint_display_mode_get(obj);
1514 if (sd->dispmode == dispmode) return;
1516 sd->dispmode = dispmode;
1518 EINA_INLIST_FOREACH(sd->stack, it)
1519 _item_dispmode_set(it, dispmode);
1522 EOLIAN static Eina_Bool
1523 _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)
1527 Eina_List *l = NULL;
1528 Elm_Object_Item *eo_top_it;
1529 void *(*list_data_get)(const Eina_List *list);
1531 Eina_Bool int_ret = EINA_FALSE;
1533 eo_top_it = elm_naviframe_top_item_get(obj);
1534 if (!eo_top_it) goto end;
1536 list_data_get = eina_list_data_get;
1538 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1539 l = eina_list_append(l, VIEW(top_it));
1542 if (_elm_config->access_mode)
1544 ao = _access_object_get(top_it, TITLE_ACCESS_PART);
1545 if (ao) l = eina_list_append(l, ao);
1548 int_ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next, next_item);
1553 (!(*next) || (*next == elm_object_focused_object_get(obj))))
1556 int_ret = !elm_widget_focus_get(obj);
1562 EOLIAN static Eina_Bool
1563 _elm_naviframe_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED)
1568 EOLIAN static Eina_Bool
1569 _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)
1573 Eina_List *l = NULL;
1574 Elm_Object_Item *eo_top_it;
1575 void *(*list_data_get)(const Eina_List *list);
1577 eo_top_it = elm_naviframe_top_item_get(obj);
1578 if (!eo_top_it) return EINA_FALSE;
1580 list_data_get = eina_list_data_get;
1582 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1583 l = eina_list_append(l, VIEW(top_it));
1585 int_ret = elm_widget_focus_list_direction_get
1586 (obj, base, l, list_data_get, degree, direction, direction_item, weight);
1593 //TIZEN_ONLY(20161208): add API elm_object_part_access_object_get
1594 EOLIAN static Evas_Object*
1595 _elm_naviframe_elm_widget_part_access_object_get(const Eo *obj, Elm_Naviframe_Data *_pd EINA_UNUSED, const char *part)
1597 Elm_Object_Item *eo_top_it = NULL;
1598 eo_do(obj, eo_top_it = elm_obj_naviframe_top_item_get());
1599 if (!eo_top_it) return NULL;
1601 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1602 return _access_object_get(top_it, part);
1607 _elm_naviframe_evas_object_smart_add(Eo *obj, Elm_Naviframe_Data *priv)
1609 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
1610 //TIZEN ONLY(20160829): Support tizen transition
1613 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
1614 elm_widget_sub_object_parent_add(obj);
1616 priv->dummy_edje = wd->resize_obj;
1617 evas_object_smart_member_add(priv->dummy_edje, obj);
1619 priv->auto_pushed = _elm_config->naviframe_prev_btn_auto_pushed;
1620 priv->freeze_events = EINA_TRUE;
1622 evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1623 _on_obj_size_hints_changed, obj);
1624 elm_widget_can_focus_set(obj, EINA_TRUE);
1628 _send_signal(Elm_Naviframe_Item_Data *it, const char *sig)
1631 elm_object_signal_emit(VIEW(it), sig, "elm");
1632 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1636 _deferred(void *data)
1638 Elm_Naviframe_Data *nfd = data;
1639 Elm_Naviframe_Op *nfo;
1641 EINA_LIST_FREE(nfd->ops, nfo)
1643 const char *signals_cur[] = {
1644 "elm,state,cur,popped,deferred",
1645 "elm,state,cur,pushed,deferred"
1647 const char *signals_prev = "elm,state,prev,popped,deferred";
1648 const char *signals_new = "elm,state,new,pushed,deferred";
1649 Elm_Naviframe_Item_Data *cur;
1650 Elm_Naviframe_Item_Data *other;
1652 cur = nfo->push ? nfo->related : nfo->self;
1653 other = nfo->push ? nfo->self : nfo->related;
1655 //TIZEN ONLY(20161208): Support tizen transition
1656 //_send_signal(cur, signals_cur[nfo->push]);
1657 //_send_signal(other, nfo->push ? signals_new : signals_prev);
1658 if (_tizen_effect_enabled_get(cur))
1662 if (nf_mod->tizen_push_deferred_effect)
1663 nf_mod->tizen_push_deferred_effect(WIDGET(cur), VIEW(cur),
1668 if (nf_mod->tizen_pop_deferred_effect)
1669 nf_mod->tizen_pop_deferred_effect(WIDGET(cur), VIEW(cur),
1674 _send_signal(cur, signals_cur[nfo->push]);
1676 if (_tizen_effect_enabled_get(other))
1680 if (nf_mod->tizen_push_deferred_effect)
1681 nf_mod->tizen_push_deferred_effect(WIDGET(other),
1682 VIEW(other), EINA_FALSE);
1686 if (nf_mod->tizen_pop_deferred_effect)
1687 nf_mod->tizen_pop_deferred_effect(WIDGET(other),
1688 VIEW(other), EINA_FALSE);
1692 _send_signal(other, nfo->push ? signals_new : signals_prev);
1698 nfd->animator = NULL;
1699 return ECORE_CALLBACK_CANCEL;
1703 _elm_naviframe_evas_object_smart_del(Eo *obj, Elm_Naviframe_Data *sd)
1705 Elm_Naviframe_Item_Data *it;
1706 Elm_Naviframe_Op *nfo;
1708 sd->on_deletion = EINA_TRUE;
1712 it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item_Data);
1713 eo_do(EO_OBJ(it), elm_wdg_item_del());
1716 //All popping items which are not called yet by animator.
1717 if (sd->animator) ecore_animator_del(sd->animator);
1718 EINA_LIST_FREE(sd->ops, nfo)
1720 EINA_LIST_FREE(sd->popping, it)
1721 eo_do(EO_OBJ(it), elm_wdg_item_del());
1723 evas_object_del(sd->dummy_edje);
1725 eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
1728 //Show only the top item view
1730 _elm_naviframe_evas_object_smart_show(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED)
1732 Elm_Object_Item *eo_top;
1734 eo_top = elm_naviframe_top_item_get(obj);
1735 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top, top);
1737 if (top && !top->delete_me)
1738 evas_object_show(VIEW(top));
1742 _key_action_top_item_get(Evas_Object *obj, const char *params EINA_UNUSED)
1744 Elm_Object_Item *eo_item = NULL;
1745 eo_do(obj, eo_item = elm_obj_naviframe_top_item_get());
1746 if (!eo_item) return EINA_FALSE;
1748 //FIXME: Replace this below code to elm_naviframe_item_pop() at elm 2.0.
1749 ///Leave for compatibility.
1750 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1751 if (it->title_prev_btn)
1752 eo_do(it->title_prev_btn, eo_event_callback_call(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL));
1758 _key_action_item_pop(Evas_Object *obj, const char *params EINA_UNUSED)
1760 Elm_Object_Item *eo_item = NULL;
1761 eo_item = elm_naviframe_top_item_get(obj);
1762 if (!eo_item) return EINA_FALSE;
1764 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1766 if (it->pushing || it->popping) return EINA_FALSE;
1768 elm_naviframe_item_pop(obj);
1773 EOLIAN static Eina_Bool
1774 _elm_naviframe_elm_widget_event(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, Evas_Object *src, Evas_Callback_Type type, void *event_info)
1777 Evas_Event_Key_Down *ev = event_info;
1779 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1780 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
1781 if (!_elm_config_key_binding_call(obj, ev, key_actions)) return EINA_FALSE;
1783 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1788 _elm_naviframe_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool is_access)
1790 Elm_Naviframe_Item_Data *it;
1792 EINA_INLIST_FOREACH(sd->stack, it)
1793 _access_obj_process(it, is_access);
1796 //TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
1797 //register/unregister access objects accordingly.
1798 // TIZEN_ONLY(20170516): connect to at-spi dbus based on org.a11y.Status.IsEnabled property
1800 _elm_naviframe_elm_widget_screen_reader(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool is_screen_reader)
1802 Elm_Naviframe_Item_Data *it;
1804 EINA_INLIST_FOREACH(sd->stack, it)
1805 _atspi_expose_title(it, is_screen_reader);
1807 //TIZEN_ONLY(20161213): apply screen_reader_changed callback
1808 evas_object_smart_callback_call(obj, SIG_ATSPI_SCREEN_READER_CHANGED, &is_screen_reader);
1815 _item_push_helper(Elm_Naviframe_Item_Data *item)
1817 Elm_Object_Item *eo_top_item;
1818 Evas_Object *obj = WIDGET(item);
1819 ELM_NAVIFRAME_DATA_GET(obj, sd);
1820 eo_top_item = elm_naviframe_top_item_get(obj);
1821 evas_object_show(VIEW(item));
1823 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_item, top_item);
1824 if (top_item) elm_widget_focused_object_clear(VIEW(top_item));
1825 _resize_object_reset(obj, item);
1828 Elm_Naviframe_Op *nfo = calloc(1, sizeof (Elm_Naviframe_Op));
1830 /* TIZEN_ONLY(20170811): Set focus to new item view immediately when new item is pushed to show keypad fast. */
1831 //elm_widget_tree_unfocusable_set(VIEW(item), EINA_TRUE);
1832 elm_widget_tree_unfocusable_set(VIEW(item), EINA_FALSE);
1834 elm_widget_tree_unfocusable_set(VIEW(top_item), EINA_TRUE);
1836 if (sd->freeze_events)
1838 evas_object_freeze_events_set(VIEW(item), EINA_TRUE);
1839 evas_object_freeze_events_set(VIEW(top_item), EINA_TRUE);
1842 //TIZEN ONLY(20161208): Support tizen transition
1843 //elm_object_signal_emit(VIEW(top_item), "elm,state,cur,pushed", "elm");
1844 //elm_object_signal_emit(VIEW(item), "elm,state,new,pushed", "elm");
1845 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(top_item)));
1846 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(item)));
1847 if (_tizen_effect_enabled_get(top_item))
1849 if (nf_mod->tizen_push_effect)
1850 nf_mod->tizen_push_effect(obj, VIEW(top_item), EINA_TRUE);
1854 elm_object_signal_emit(VIEW(top_item), "elm,state,cur,pushed", "elm");
1855 edje_object_message_signal_process(elm_layout_edje_get(VIEW(top_item)));
1858 if (_tizen_effect_enabled_get(item))
1860 if (nf_mod->tizen_push_effect)
1861 nf_mod->tizen_push_effect(obj, VIEW(item), EINA_FALSE);
1865 elm_object_signal_emit(VIEW(item), "elm,state,new,pushed", "elm");
1866 edje_object_message_signal_process(elm_layout_edje_get(VIEW(item)));
1871 nfo->related = top_item;
1872 nfo->push = EINA_TRUE;
1874 sd->ops = eina_list_append(sd->ops, nfo);
1875 if (!sd->animator) sd->animator = ecore_animator_add(_deferred, sd);
1877 if (top_item) top_item->pushing = EINA_FALSE;
1878 item->pushing = EINA_TRUE;
1882 if (elm_object_focus_allow_get(VIEW(item)))
1883 elm_object_focus_set(VIEW(item), EINA_TRUE);
1885 elm_object_focus_set(WIDGET(item), EINA_TRUE);
1888 sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(item));
1891 //TIZEN ONLY(20161208): Support tizen transition
1892 //elm_object_signal_emit(VIEW(item), "elm,state,visible", "elm");
1894 if (!_tizen_effect_enabled_get(item))
1895 elm_object_signal_emit(VIEW(item), "elm,state,visible", "elm");
1899 elm_layout_sizing_eval(obj);
1903 eo_do(obj, eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, EO_OBJ(item)));
1904 //TIZEN_ONLY(20170919): Handle default label object
1905 _elm_win_default_label_obj_append(VIEW(item));
1911 elm_naviframe_add(Evas_Object *parent)
1913 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1914 Evas_Object *obj = eo_add(MY_CLASS, parent);
1919 _elm_naviframe_eo_base_constructor(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED)
1921 obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
1923 evas_obj_type_set(MY_CLASS_NAME_LEGACY),
1924 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
1925 elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PAGE_TAB_LIST));
1930 EOLIAN static Elm_Object_Item*
1931 _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)
1933 Elm_Object_Item *top_item, *eo_item;
1935 top_item = elm_naviframe_top_item_get(obj);
1936 eo_item = _item_new(obj, top_item,
1937 title_label, prev_btn, next_btn, content, item_style);
1938 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, item);
1939 if (!item) return NULL;
1941 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
1942 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(item));
1945 _item_push_helper(item);
1949 EOLIAN static Elm_Object_Item*
1950 _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)
1952 Elm_Object_Item *eo_it;
1953 Elm_Naviframe_Item_Data *prev_it = NULL;
1955 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_before, NULL);
1956 ELM_NAVIFRAME_ITEM_DATA_GET(eo_before, before);
1958 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
1961 ELM_NAVIFRAME_ITEM_DATA_GET(eo_it, it);
1962 if (EINA_INLIST_GET(it)->prev)
1963 prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
1964 Elm_Naviframe_Item_Data);
1965 eo_it = _item_new(obj, EO_OBJ(prev_it),
1966 title_label, prev_btn, next_btn, content, item_style);
1967 if (!eo_it) return NULL;
1969 it = eo_data_scope_get(eo_it, ELM_NAVIFRAME_ITEM_CLASS);
1971 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
1972 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
1975 sd->stack = eina_inlist_prepend_relative
1976 (sd->stack, EINA_INLIST_GET(it),
1977 EINA_INLIST_GET(before));
1979 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1980 evas_object_hide(VIEW(it));
1981 //TIZEN ONLY(20161208): Support tizen transition
1982 //elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1983 if (!_tizen_effect_enabled_get(it))
1984 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1987 elm_layout_sizing_eval(obj);
1992 EOLIAN static Elm_Object_Item*
1993 _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)
1995 Elm_Object_Item *eo_item;
1996 Eina_Bool top_inserted = EINA_FALSE;
1998 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_after, NULL);
1999 ELM_NAVIFRAME_ITEM_DATA_GET(eo_after, after);
2001 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
2003 eo_item = _item_new(obj, eo_after,
2004 title_label, prev_btn, next_btn, content, item_style);
2005 if (!eo_item) return NULL;
2007 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
2009 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
2010 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
2013 if (elm_naviframe_top_item_get(obj) == eo_after) top_inserted = EINA_TRUE;
2015 sd->stack = eina_inlist_append_relative
2016 (sd->stack, EINA_INLIST_GET(it),
2017 EINA_INLIST_GET(after));
2022 elm_widget_focused_object_clear(VIEW(after));
2023 elm_widget_tree_unfocusable_set(VIEW(after), EINA_TRUE);
2024 _resize_object_reset(obj, it);
2025 evas_object_show(VIEW(it));
2026 evas_object_hide(VIEW(after));
2027 if (elm_object_focus_allow_get(VIEW(it)))
2028 elm_object_focus_set(VIEW(it), EINA_TRUE);
2030 elm_object_focus_set(WIDGET(it), EINA_TRUE);
2031 //TIZEN ONLY(20161208): Support tizen transition
2032 //elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
2033 //elm_object_signal_emit(VIEW(after), "elm,state,invisible", "elm");
2034 if (!_tizen_effect_enabled_get(it))
2035 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
2037 if (!_tizen_effect_enabled_get(after))
2038 elm_object_signal_emit(VIEW(after), "elm,state,invisible", "elm");
2042 //TIZEN ONLY(20161208): Support tizen transition
2043 //elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
2045 if (!_tizen_effect_enabled_get(it))
2046 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
2050 elm_layout_sizing_eval(obj);
2053 eo_do(obj, eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, eo_item));
2058 EOLIAN static Evas_Object*
2059 _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd)
2061 Elm_Object_Item *eo_item;
2062 Elm_Naviframe_Item_Data *prev_it = NULL;
2063 Evas_Object *content = NULL;
2065 if (sd->freeze_events && sd->popping) return NULL;
2067 eo_item = elm_naviframe_top_item_get(obj);
2068 if (!eo_item) return NULL;
2070 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
2072 if (it->pushing || it->popping) return NULL;
2073 it->popping = EINA_TRUE;
2075 evas_object_ref(obj);
2079 if (!it->pop_cb(it->pop_data, eo_item))
2083 eo_do(eo_item, elm_wdg_item_del());
2086 /* To avoid multiple item pops, the auto pushed button deletes
2087 its clicked callback once it is called.
2088 Since the item is not popped or deleted here, the deleted
2089 callback of the auto pushed button should be restored. */
2090 if (it->auto_pushed_btn)
2091 eo_do(it->auto_pushed_btn, eo_event_callback_add
2092 (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED,
2093 _on_item_back_btn_clicked, obj));
2094 it->popping = EINA_FALSE;
2096 evas_object_unref(obj);
2101 evas_object_unref(obj);
2104 content = it->content;
2106 evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
2108 if (sd->stack->last->prev)
2109 prev_it = EINA_INLIST_CONTAINER_GET
2110 (sd->stack->last->prev, Elm_Naviframe_Item_Data);
2112 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
2116 Elm_Naviframe_Op *nfo = calloc(1, sizeof (Elm_Naviframe_Op));
2118 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
2120 if (sd->freeze_events)
2122 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
2123 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
2126 // TIZEN_ONLY(20161229): resize prev item before raise.
2127 elm_widget_resize_object_set(obj, VIEW(prev_it), EINA_FALSE);
2130 //TIZEN ONLY(20161208): Support tizen transition
2131 /* these 2 signals MUST take place simultaneously */
2132 //elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
2133 //elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
2134 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
2135 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
2136 if (_tizen_effect_enabled_get(it))
2138 if (nf_mod->tizen_pop_effect)
2139 nf_mod->tizen_pop_effect(obj, VIEW(it), EINA_TRUE);
2143 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
2144 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
2147 if (_tizen_effect_enabled_get(prev_it))
2149 if (nf_mod->tizen_pop_effect)
2150 nf_mod->tizen_pop_effect(obj, VIEW(prev_it), EINA_FALSE);
2154 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
2155 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
2159 //Show hidden previous view when pop transition begins.
2160 evas_object_show(VIEW(prev_it));
2162 if (!nfo) goto on_error;
2165 nfo->related = prev_it;
2166 nfo->push = EINA_FALSE;
2168 sd->popping = eina_list_append(sd->popping, it);
2169 sd->ops = eina_list_append(sd->ops, nfo);
2170 if (!sd->animator) sd->animator = ecore_animator_add(_deferred, sd);
2173 eo_do(eo_item, elm_wdg_item_del());
2180 _elm_naviframe_item_pop_to(Eo *eo_it, Elm_Naviframe_Item_Data *it)
2184 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
2186 if (eo_it == elm_naviframe_top_item_get(WIDGET(it))) return;
2188 l = sd->stack->last->prev;
2190 sd->on_deletion = EINA_TRUE;
2194 Elm_Naviframe_Item_Data *iit = EINA_INLIST_CONTAINER_GET
2195 (l, Elm_Naviframe_Item_Data);
2197 if (iit == it) break;
2201 eo_do(EO_OBJ(iit), elm_wdg_item_del());
2204 sd->on_deletion = EINA_FALSE;
2206 elm_naviframe_item_pop(WIDGET(it));
2210 _elm_naviframe_item_promote(Eo *eo_it, Elm_Naviframe_Item_Data *it)
2212 Elm_Object_Item *eo_prev_top;
2213 Elm_Naviframe_Item_Data *nit = it;
2215 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
2217 eo_prev_top = elm_naviframe_top_item_get(WIDGET(nit));
2218 if (eo_it == eo_prev_top) return;
2220 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
2221 _item_push_helper(nit);
2225 _elm_naviframe_item_simple_promote(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Evas_Object *content)
2227 Elm_Naviframe_Item_Data *itr;
2229 EINA_INLIST_FOREACH(sd->stack, itr)
2231 if (elm_object_item_content_get(EO_OBJ(itr)) == content)
2233 elm_naviframe_item_promote(EO_OBJ(itr));
2240 _elm_naviframe_content_preserve_on_pop_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool preserve)
2242 sd->preserve = !!preserve;
2245 EOLIAN static Eina_Bool
2246 _elm_naviframe_content_preserve_on_pop_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2248 return sd->preserve;
2251 EOLIAN static Elm_Object_Item*
2252 _elm_naviframe_top_item_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2254 if (!sd->stack) return NULL;
2255 Elm_Naviframe_Item_Data *ret_it = EINA_INLIST_CONTAINER_GET
2256 (sd->stack->last, Elm_Naviframe_Item_Data);
2257 return EO_OBJ(ret_it);
2260 EOLIAN static Elm_Object_Item*
2261 _elm_naviframe_bottom_item_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2263 if (!sd->stack) return NULL;
2264 Elm_Naviframe_Item_Data *ret_it = EINA_INLIST_CONTAINER_GET
2265 (sd->stack, Elm_Naviframe_Item_Data);
2266 return EO_OBJ(ret_it);
2270 _elm_naviframe_item_style_set(Eo *eo_item EINA_UNUSED,
2271 Elm_Naviframe_Item_Data *nit,
2272 const char *item_style)
2274 if (item_style && !strcmp(item_style, nit->style)) return;
2277 if (!strcmp("basic", nit->style)) return;
2279 _item_style_set(nit, item_style);
2280 _item_signals_emit(nit);
2281 _item_title_enabled_update(nit, EINA_FALSE);
2284 EOLIAN static const char *
2285 _elm_naviframe_item_style_get(Eo *eo_item EINA_UNUSED,
2286 Elm_Naviframe_Item_Data *nit)
2291 EINA_DEPRECATED EAPI void
2292 elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
2295 elm_naviframe_item_title_enabled_set(it, visible, EINA_FALSE);
2298 EINA_DEPRECATED EAPI Eina_Bool
2299 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
2301 return elm_naviframe_item_title_enabled_get(it);
2305 _elm_naviframe_item_title_enabled_set(Eo *eo_item EINA_UNUSED,
2306 Elm_Naviframe_Item_Data *nit,
2308 Eina_Bool transition)
2310 enabled = !!enabled;
2311 if (nit->title_enabled == enabled) return;
2313 nit->title_enabled = enabled;
2315 transition = !!transition;
2316 _item_title_enabled_update(nit, transition);
2319 EOLIAN static Eina_Bool
2320 _elm_naviframe_item_title_enabled_get(const Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data *nit)
2322 return nit->title_enabled;
2326 _elm_naviframe_item_pop_cb_set(Eo *eo_item EINA_UNUSED,
2327 Elm_Naviframe_Item_Data *nit,
2328 Elm_Naviframe_Item_Pop_Cb func,
2332 nit->pop_data = data;
2336 _elm_naviframe_prev_btn_auto_pushed_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool auto_pushed)
2338 sd->auto_pushed = !!auto_pushed;
2341 EOLIAN static Eina_Bool
2342 _elm_naviframe_prev_btn_auto_pushed_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2344 return sd->auto_pushed;
2347 EOLIAN static Eina_List*
2348 _elm_naviframe_items_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2350 Eina_List *ret = NULL;
2351 Elm_Naviframe_Item_Data *itr;
2353 EINA_INLIST_FOREACH(sd->stack, itr)
2354 ret = eina_list_append(ret, EO_OBJ(itr));
2360 _elm_naviframe_event_enabled_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool enabled)
2362 enabled = !!enabled;
2363 if (sd->freeze_events == !enabled) return;
2364 sd->freeze_events = !enabled;
2367 EOLIAN static Eina_Bool
2368 _elm_naviframe_event_enabled_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2370 return !sd->freeze_events;
2373 EOLIAN static Eina_Bool
2374 _elm_naviframe_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED)
2380 _elm_naviframe_class_constructor(Eo_Class *klass)
2382 evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
2385 EOLIAN const Elm_Atspi_Action *
2386 _elm_naviframe_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *pd EINA_UNUSED)
2388 static Elm_Atspi_Action atspi_actions[] = {
2389 { "top_item_get", "top_item_get", NULL, _key_action_top_item_get },
2390 { "item_pop", "item_pop", NULL, _key_action_item_pop },
2391 { NULL, NULL, NULL, NULL }
2393 return &atspi_actions[0];
2396 //TIZEN_ONLY(20161213) Using VIEW(item) for naviframe, naviframe item accessible information
2398 _elm_naviframe_elm_interface_atspi_accessible_name_get(Eo *eo, Elm_Naviframe_Data *pd EINA_UNUSED)
2400 const char *ret = NULL;
2401 Elm_Object_Item *eo_top_it = NULL;
2403 eo_top_it = elm_naviframe_top_item_get(eo);
2406 eo_do(eo_top_it, ret = elm_interface_atspi_accessible_name_get());
2413 _elm_naviframe_elm_interface_atspi_accessible_description_get(Eo *eo, Elm_Naviframe_Data *pd EINA_UNUSED)
2415 const char *ret = NULL;
2416 Elm_Object_Item *eo_top_it = NULL;
2418 eo_top_it = elm_naviframe_top_item_get(eo);
2421 eo_do(eo_top_it, ret = elm_interface_atspi_accessible_description_get());
2428 _elm_naviframe_item_elm_interface_atspi_accessible_name_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, const char *name)
2430 eo_do(VIEW(nit), elm_interface_atspi_accessible_name_set(name));
2434 _elm_naviframe_item_elm_interface_atspi_accessible_name_get(Eo *eo_item, Elm_Naviframe_Item_Data *nit)
2436 const char *ret = NULL;
2437 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, ret = elm_interface_atspi_accessible_name_get());
2438 if (ret) return ret;
2440 eo_do(VIEW(nit), ret = elm_interface_atspi_accessible_name_get());
2445 _elm_naviframe_item_elm_interface_atspi_accessible_description_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, const char *description)
2447 eo_do(VIEW(nit), elm_interface_atspi_accessible_description_set(description));
2451 _elm_naviframe_item_elm_interface_atspi_accessible_description_get(Eo *eo_item, Elm_Naviframe_Item_Data *nit)
2453 const char *ret = NULL;
2454 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, ret = elm_interface_atspi_accessible_description_get());
2455 if (ret) return ret;
2457 eo_do(VIEW(nit), ret = elm_interface_atspi_accessible_description_get());
2462 #include "elm_naviframe_item.eo.c"
2463 #include "elm_naviframe.eo.c"