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);
1555 int_ret = !elm_widget_focus_get(obj);
1561 EOLIAN static Eina_Bool
1562 _elm_naviframe_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED)
1567 EOLIAN static Eina_Bool
1568 _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)
1572 Eina_List *l = NULL;
1573 Elm_Object_Item *eo_top_it;
1574 void *(*list_data_get)(const Eina_List *list);
1576 eo_top_it = elm_naviframe_top_item_get(obj);
1577 if (!eo_top_it) return EINA_FALSE;
1579 list_data_get = eina_list_data_get;
1581 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1582 l = eina_list_append(l, VIEW(top_it));
1584 int_ret = elm_widget_focus_list_direction_get
1585 (obj, base, l, list_data_get, degree, direction, direction_item, weight);
1592 //TIZEN_ONLY(20161208): add API elm_object_part_access_object_get
1593 EOLIAN static Evas_Object*
1594 _elm_naviframe_elm_widget_part_access_object_get(const Eo *obj, Elm_Naviframe_Data *_pd EINA_UNUSED, const char *part)
1596 Elm_Object_Item *eo_top_it = NULL;
1597 eo_do(obj, eo_top_it = elm_obj_naviframe_top_item_get());
1598 if (!eo_top_it) return NULL;
1600 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1601 return _access_object_get(top_it, part);
1606 _elm_naviframe_evas_object_smart_add(Eo *obj, Elm_Naviframe_Data *priv)
1608 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
1609 //TIZEN ONLY(20160829): Support tizen transition
1612 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
1613 elm_widget_sub_object_parent_add(obj);
1615 priv->dummy_edje = wd->resize_obj;
1616 evas_object_smart_member_add(priv->dummy_edje, obj);
1618 priv->auto_pushed = _elm_config->naviframe_prev_btn_auto_pushed;
1619 priv->freeze_events = EINA_TRUE;
1621 evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1622 _on_obj_size_hints_changed, obj);
1623 elm_widget_can_focus_set(obj, EINA_TRUE);
1627 _send_signal(Elm_Naviframe_Item_Data *it, const char *sig)
1630 elm_object_signal_emit(VIEW(it), sig, "elm");
1631 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1635 _deferred(void *data)
1637 Elm_Naviframe_Data *nfd = data;
1638 Elm_Naviframe_Op *nfo;
1640 EINA_LIST_FREE(nfd->ops, nfo)
1642 const char *signals_cur[] = {
1643 "elm,state,cur,popped,deferred",
1644 "elm,state,cur,pushed,deferred"
1646 const char *signals_prev = "elm,state,prev,popped,deferred";
1647 const char *signals_new = "elm,state,new,pushed,deferred";
1648 Elm_Naviframe_Item_Data *cur;
1649 Elm_Naviframe_Item_Data *other;
1651 cur = nfo->push ? nfo->related : nfo->self;
1652 other = nfo->push ? nfo->self : nfo->related;
1654 //TIZEN ONLY(20161208): Support tizen transition
1655 //_send_signal(cur, signals_cur[nfo->push]);
1656 //_send_signal(other, nfo->push ? signals_new : signals_prev);
1657 if (_tizen_effect_enabled_get(cur))
1661 if (nf_mod->tizen_push_deferred_effect)
1662 nf_mod->tizen_push_deferred_effect(WIDGET(cur), VIEW(cur),
1667 if (nf_mod->tizen_pop_deferred_effect)
1668 nf_mod->tizen_pop_deferred_effect(WIDGET(cur), VIEW(cur),
1673 _send_signal(cur, signals_cur[nfo->push]);
1675 if (_tizen_effect_enabled_get(other))
1679 if (nf_mod->tizen_push_deferred_effect)
1680 nf_mod->tizen_push_deferred_effect(WIDGET(other),
1681 VIEW(other), EINA_FALSE);
1685 if (nf_mod->tizen_pop_deferred_effect)
1686 nf_mod->tizen_pop_deferred_effect(WIDGET(other),
1687 VIEW(other), EINA_FALSE);
1691 _send_signal(other, nfo->push ? signals_new : signals_prev);
1697 nfd->animator = NULL;
1698 return ECORE_CALLBACK_CANCEL;
1702 _elm_naviframe_evas_object_smart_del(Eo *obj, Elm_Naviframe_Data *sd)
1704 Elm_Naviframe_Item_Data *it;
1705 Elm_Naviframe_Op *nfo;
1707 sd->on_deletion = EINA_TRUE;
1711 it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item_Data);
1712 eo_do(EO_OBJ(it), elm_wdg_item_del());
1715 //All popping items which are not called yet by animator.
1716 if (sd->animator) ecore_animator_del(sd->animator);
1717 EINA_LIST_FREE(sd->ops, nfo)
1719 EINA_LIST_FREE(sd->popping, it)
1720 eo_do(EO_OBJ(it), elm_wdg_item_del());
1722 evas_object_del(sd->dummy_edje);
1724 eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
1727 //Show only the top item view
1729 _elm_naviframe_evas_object_smart_show(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED)
1731 Elm_Object_Item *eo_top;
1733 eo_top = elm_naviframe_top_item_get(obj);
1734 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top, top);
1736 if (top && !top->delete_me)
1737 evas_object_show(VIEW(top));
1741 _key_action_top_item_get(Evas_Object *obj, const char *params EINA_UNUSED)
1743 Elm_Object_Item *eo_item = NULL;
1744 eo_do(obj, eo_item = elm_obj_naviframe_top_item_get());
1745 if (!eo_item) return EINA_FALSE;
1747 //FIXME: Replace this below code to elm_naviframe_item_pop() at elm 2.0.
1748 ///Leave for compatibility.
1749 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1750 if (it->title_prev_btn)
1751 eo_do(it->title_prev_btn, eo_event_callback_call(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL));
1757 _key_action_item_pop(Evas_Object *obj, const char *params EINA_UNUSED)
1759 Elm_Object_Item *eo_item = NULL;
1760 eo_item = elm_naviframe_top_item_get(obj);
1761 if (!eo_item) return EINA_FALSE;
1763 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1765 if (it->pushing || it->popping) return EINA_FALSE;
1767 elm_naviframe_item_pop(obj);
1772 EOLIAN static Eina_Bool
1773 _elm_naviframe_elm_widget_event(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, Evas_Object *src, Evas_Callback_Type type, void *event_info)
1776 Evas_Event_Key_Down *ev = event_info;
1778 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1779 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
1780 if (!_elm_config_key_binding_call(obj, ev, key_actions)) return EINA_FALSE;
1782 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1787 _elm_naviframe_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool is_access)
1789 Elm_Naviframe_Item_Data *it;
1791 EINA_INLIST_FOREACH(sd->stack, it)
1792 _access_obj_process(it, is_access);
1795 //TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
1796 //register/unregister access objects accordingly.
1797 // TIZEN_ONLY(20170516): connect to at-spi dbus based on org.a11y.Status.IsEnabled property
1799 _elm_naviframe_elm_widget_screen_reader(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool is_screen_reader)
1801 Elm_Naviframe_Item_Data *it;
1803 EINA_INLIST_FOREACH(sd->stack, it)
1804 _atspi_expose_title(it, is_screen_reader);
1806 //TIZEN_ONLY(20161213): apply screen_reader_changed callback
1807 evas_object_smart_callback_call(obj, SIG_ATSPI_SCREEN_READER_CHANGED, &is_screen_reader);
1814 _item_push_helper(Elm_Naviframe_Item_Data *item)
1816 Elm_Object_Item *eo_top_item;
1817 Evas_Object *obj = WIDGET(item);
1818 ELM_NAVIFRAME_DATA_GET(obj, sd);
1819 eo_top_item = elm_naviframe_top_item_get(obj);
1820 evas_object_show(VIEW(item));
1822 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_item, top_item);
1823 if (top_item) elm_widget_focused_object_clear(VIEW(top_item));
1824 _resize_object_reset(obj, item);
1827 Elm_Naviframe_Op *nfo = calloc(1, sizeof (Elm_Naviframe_Op));
1829 /* TIZEN_ONLY(20170811): Set focus to new item view immediately when new item is pushed to show keypad fast. */
1830 //elm_widget_tree_unfocusable_set(VIEW(item), EINA_TRUE);
1831 elm_widget_tree_unfocusable_set(VIEW(item), EINA_FALSE);
1833 elm_widget_tree_unfocusable_set(VIEW(top_item), EINA_TRUE);
1835 if (sd->freeze_events)
1837 evas_object_freeze_events_set(VIEW(item), EINA_TRUE);
1838 evas_object_freeze_events_set(VIEW(top_item), EINA_TRUE);
1841 //TIZEN ONLY(20161208): Support tizen transition
1842 //elm_object_signal_emit(VIEW(top_item), "elm,state,cur,pushed", "elm");
1843 //elm_object_signal_emit(VIEW(item), "elm,state,new,pushed", "elm");
1844 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(top_item)));
1845 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(item)));
1846 if (_tizen_effect_enabled_get(top_item))
1848 if (nf_mod->tizen_push_effect)
1849 nf_mod->tizen_push_effect(obj, VIEW(top_item), EINA_TRUE);
1853 elm_object_signal_emit(VIEW(top_item), "elm,state,cur,pushed", "elm");
1854 edje_object_message_signal_process(elm_layout_edje_get(VIEW(top_item)));
1857 if (_tizen_effect_enabled_get(item))
1859 if (nf_mod->tizen_push_effect)
1860 nf_mod->tizen_push_effect(obj, VIEW(item), EINA_FALSE);
1864 elm_object_signal_emit(VIEW(item), "elm,state,new,pushed", "elm");
1865 edje_object_message_signal_process(elm_layout_edje_get(VIEW(item)));
1870 nfo->related = top_item;
1871 nfo->push = EINA_TRUE;
1873 sd->ops = eina_list_append(sd->ops, nfo);
1874 if (!sd->animator) sd->animator = ecore_animator_add(_deferred, sd);
1876 if (top_item) top_item->pushing = EINA_FALSE;
1877 item->pushing = EINA_TRUE;
1881 if (elm_object_focus_allow_get(VIEW(item)))
1882 elm_object_focus_set(VIEW(item), EINA_TRUE);
1884 elm_object_focus_set(WIDGET(item), EINA_TRUE);
1887 sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(item));
1890 //TIZEN ONLY(20161208): Support tizen transition
1891 //elm_object_signal_emit(VIEW(item), "elm,state,visible", "elm");
1893 if (!_tizen_effect_enabled_get(item))
1894 elm_object_signal_emit(VIEW(item), "elm,state,visible", "elm");
1898 elm_layout_sizing_eval(obj);
1902 eo_do(obj, eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, EO_OBJ(item)));
1903 //TIZEN_ONLY(20170919): Handle default label object
1904 _elm_win_default_label_obj_append(VIEW(item));
1910 elm_naviframe_add(Evas_Object *parent)
1912 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1913 Evas_Object *obj = eo_add(MY_CLASS, parent);
1918 _elm_naviframe_eo_base_constructor(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED)
1920 obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
1922 evas_obj_type_set(MY_CLASS_NAME_LEGACY),
1923 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
1924 elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PAGE_TAB_LIST));
1929 EOLIAN static Elm_Object_Item*
1930 _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)
1932 Elm_Object_Item *top_item, *eo_item;
1934 top_item = elm_naviframe_top_item_get(obj);
1935 eo_item = _item_new(obj, top_item,
1936 title_label, prev_btn, next_btn, content, item_style);
1937 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, item);
1938 if (!item) return NULL;
1940 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
1941 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(item));
1944 _item_push_helper(item);
1948 EOLIAN static Elm_Object_Item*
1949 _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)
1951 Elm_Object_Item *eo_it;
1952 Elm_Naviframe_Item_Data *prev_it = NULL;
1954 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_before, NULL);
1955 ELM_NAVIFRAME_ITEM_DATA_GET(eo_before, before);
1957 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
1960 ELM_NAVIFRAME_ITEM_DATA_GET(eo_it, it);
1961 if (EINA_INLIST_GET(it)->prev)
1962 prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
1963 Elm_Naviframe_Item_Data);
1964 eo_it = _item_new(obj, EO_OBJ(prev_it),
1965 title_label, prev_btn, next_btn, content, item_style);
1966 if (!eo_it) return NULL;
1968 it = eo_data_scope_get(eo_it, ELM_NAVIFRAME_ITEM_CLASS);
1970 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
1971 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
1974 sd->stack = eina_inlist_prepend_relative
1975 (sd->stack, EINA_INLIST_GET(it),
1976 EINA_INLIST_GET(before));
1978 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1979 evas_object_hide(VIEW(it));
1980 //TIZEN ONLY(20161208): Support tizen transition
1981 //elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1982 if (!_tizen_effect_enabled_get(it))
1983 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1986 elm_layout_sizing_eval(obj);
1991 EOLIAN static Elm_Object_Item*
1992 _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)
1994 Elm_Object_Item *eo_item;
1995 Eina_Bool top_inserted = EINA_FALSE;
1997 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_after, NULL);
1998 ELM_NAVIFRAME_ITEM_DATA_GET(eo_after, after);
2000 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
2002 eo_item = _item_new(obj, eo_after,
2003 title_label, prev_btn, next_btn, content, item_style);
2004 if (!eo_item) return NULL;
2006 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
2008 /* TIZEN_ONLY(20160523): give the new item's view to decorate it */
2009 evas_object_smart_callback_call(obj, "item,pushed,internal", VIEW(it));
2012 if (elm_naviframe_top_item_get(obj) == eo_after) top_inserted = EINA_TRUE;
2014 sd->stack = eina_inlist_append_relative
2015 (sd->stack, EINA_INLIST_GET(it),
2016 EINA_INLIST_GET(after));
2021 elm_widget_focused_object_clear(VIEW(after));
2022 elm_widget_tree_unfocusable_set(VIEW(after), EINA_TRUE);
2023 _resize_object_reset(obj, it);
2024 evas_object_show(VIEW(it));
2025 evas_object_hide(VIEW(after));
2026 if (elm_object_focus_allow_get(VIEW(it)))
2027 elm_object_focus_set(VIEW(it), EINA_TRUE);
2029 elm_object_focus_set(WIDGET(it), EINA_TRUE);
2030 //TIZEN ONLY(20161208): Support tizen transition
2031 //elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
2032 //elm_object_signal_emit(VIEW(after), "elm,state,invisible", "elm");
2033 if (!_tizen_effect_enabled_get(it))
2034 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
2036 if (!_tizen_effect_enabled_get(after))
2037 elm_object_signal_emit(VIEW(after), "elm,state,invisible", "elm");
2041 //TIZEN ONLY(20161208): Support tizen transition
2042 //elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
2044 if (!_tizen_effect_enabled_get(it))
2045 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
2049 elm_layout_sizing_eval(obj);
2052 eo_do(obj, eo_event_callback_call(ELM_NAVIFRAME_EVENT_ITEM_ACTIVATED, eo_item));
2057 EOLIAN static Evas_Object*
2058 _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd)
2060 Elm_Object_Item *eo_item;
2061 Elm_Naviframe_Item_Data *prev_it = NULL;
2062 Evas_Object *content = NULL;
2064 if (sd->freeze_events && sd->popping) return NULL;
2066 eo_item = elm_naviframe_top_item_get(obj);
2067 if (!eo_item) return NULL;
2069 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
2071 if (it->pushing || it->popping) return NULL;
2072 it->popping = EINA_TRUE;
2074 evas_object_ref(obj);
2078 if (!it->pop_cb(it->pop_data, eo_item))
2082 eo_do(eo_item, elm_wdg_item_del());
2085 /* To avoid multiple item pops, the auto pushed button deletes
2086 its clicked callback once it is called.
2087 Since the item is not popped or deleted here, the deleted
2088 callback of the auto pushed button should be restored. */
2089 if (it->auto_pushed_btn)
2090 eo_do(it->auto_pushed_btn, eo_event_callback_add
2091 (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED,
2092 _on_item_back_btn_clicked, obj));
2093 it->popping = EINA_FALSE;
2095 evas_object_unref(obj);
2100 evas_object_unref(obj);
2103 content = it->content;
2105 evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
2107 if (sd->stack->last->prev)
2108 prev_it = EINA_INLIST_CONTAINER_GET
2109 (sd->stack->last->prev, Elm_Naviframe_Item_Data);
2111 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
2115 Elm_Naviframe_Op *nfo = calloc(1, sizeof (Elm_Naviframe_Op));
2117 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
2119 if (sd->freeze_events)
2121 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
2122 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
2125 // TIZEN_ONLY(20161229): resize prev item before raise.
2126 elm_widget_resize_object_set(obj, VIEW(prev_it), EINA_FALSE);
2129 //TIZEN ONLY(20161208): Support tizen transition
2130 /* these 2 signals MUST take place simultaneously */
2131 //elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
2132 //elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
2133 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
2134 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
2135 if (_tizen_effect_enabled_get(it))
2137 if (nf_mod->tizen_pop_effect)
2138 nf_mod->tizen_pop_effect(obj, VIEW(it), EINA_TRUE);
2142 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
2143 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
2146 if (_tizen_effect_enabled_get(prev_it))
2148 if (nf_mod->tizen_pop_effect)
2149 nf_mod->tizen_pop_effect(obj, VIEW(prev_it), EINA_FALSE);
2153 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
2154 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
2158 //Show hidden previous view when pop transition begins.
2159 evas_object_show(VIEW(prev_it));
2161 if (!nfo) goto on_error;
2164 nfo->related = prev_it;
2165 nfo->push = EINA_FALSE;
2167 sd->popping = eina_list_append(sd->popping, it);
2168 sd->ops = eina_list_append(sd->ops, nfo);
2169 if (!sd->animator) sd->animator = ecore_animator_add(_deferred, sd);
2172 eo_do(eo_item, elm_wdg_item_del());
2179 _elm_naviframe_item_pop_to(Eo *eo_it, Elm_Naviframe_Item_Data *it)
2183 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
2185 if (eo_it == elm_naviframe_top_item_get(WIDGET(it))) return;
2187 l = sd->stack->last->prev;
2189 sd->on_deletion = EINA_TRUE;
2193 Elm_Naviframe_Item_Data *iit = EINA_INLIST_CONTAINER_GET
2194 (l, Elm_Naviframe_Item_Data);
2196 if (iit == it) break;
2200 eo_do(EO_OBJ(iit), elm_wdg_item_del());
2203 sd->on_deletion = EINA_FALSE;
2205 elm_naviframe_item_pop(WIDGET(it));
2209 _elm_naviframe_item_promote(Eo *eo_it, Elm_Naviframe_Item_Data *it)
2211 Elm_Object_Item *eo_prev_top;
2212 Elm_Naviframe_Item_Data *nit = it;
2214 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
2216 eo_prev_top = elm_naviframe_top_item_get(WIDGET(nit));
2217 if (eo_it == eo_prev_top) return;
2219 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
2220 _item_push_helper(nit);
2224 _elm_naviframe_item_simple_promote(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Evas_Object *content)
2226 Elm_Naviframe_Item_Data *itr;
2228 EINA_INLIST_FOREACH(sd->stack, itr)
2230 if (elm_object_item_content_get(EO_OBJ(itr)) == content)
2232 elm_naviframe_item_promote(EO_OBJ(itr));
2239 _elm_naviframe_content_preserve_on_pop_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool preserve)
2241 sd->preserve = !!preserve;
2244 EOLIAN static Eina_Bool
2245 _elm_naviframe_content_preserve_on_pop_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2247 return sd->preserve;
2250 EOLIAN static Elm_Object_Item*
2251 _elm_naviframe_top_item_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2253 if (!sd->stack) return NULL;
2254 Elm_Naviframe_Item_Data *ret_it = EINA_INLIST_CONTAINER_GET
2255 (sd->stack->last, Elm_Naviframe_Item_Data);
2256 return EO_OBJ(ret_it);
2259 EOLIAN static Elm_Object_Item*
2260 _elm_naviframe_bottom_item_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2262 if (!sd->stack) return NULL;
2263 Elm_Naviframe_Item_Data *ret_it = EINA_INLIST_CONTAINER_GET
2264 (sd->stack, Elm_Naviframe_Item_Data);
2265 return EO_OBJ(ret_it);
2269 _elm_naviframe_item_style_set(Eo *eo_item EINA_UNUSED,
2270 Elm_Naviframe_Item_Data *nit,
2271 const char *item_style)
2273 if (item_style && !strcmp(item_style, nit->style)) return;
2276 if (!strcmp("basic", nit->style)) return;
2278 _item_style_set(nit, item_style);
2279 _item_signals_emit(nit);
2280 _item_title_enabled_update(nit, EINA_FALSE);
2283 EOLIAN static const char *
2284 _elm_naviframe_item_style_get(Eo *eo_item EINA_UNUSED,
2285 Elm_Naviframe_Item_Data *nit)
2290 EINA_DEPRECATED EAPI void
2291 elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
2294 elm_naviframe_item_title_enabled_set(it, visible, EINA_FALSE);
2297 EINA_DEPRECATED EAPI Eina_Bool
2298 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
2300 return elm_naviframe_item_title_enabled_get(it);
2304 _elm_naviframe_item_title_enabled_set(Eo *eo_item EINA_UNUSED,
2305 Elm_Naviframe_Item_Data *nit,
2307 Eina_Bool transition)
2309 enabled = !!enabled;
2310 if (nit->title_enabled == enabled) return;
2312 nit->title_enabled = enabled;
2314 transition = !!transition;
2315 _item_title_enabled_update(nit, transition);
2318 EOLIAN static Eina_Bool
2319 _elm_naviframe_item_title_enabled_get(const Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data *nit)
2321 return nit->title_enabled;
2325 _elm_naviframe_item_pop_cb_set(Eo *eo_item EINA_UNUSED,
2326 Elm_Naviframe_Item_Data *nit,
2327 Elm_Naviframe_Item_Pop_Cb func,
2331 nit->pop_data = data;
2335 _elm_naviframe_prev_btn_auto_pushed_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool auto_pushed)
2337 sd->auto_pushed = !!auto_pushed;
2340 EOLIAN static Eina_Bool
2341 _elm_naviframe_prev_btn_auto_pushed_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2343 return sd->auto_pushed;
2346 EOLIAN static Eina_List*
2347 _elm_naviframe_items_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2349 Eina_List *ret = NULL;
2350 Elm_Naviframe_Item_Data *itr;
2352 EINA_INLIST_FOREACH(sd->stack, itr)
2353 ret = eina_list_append(ret, EO_OBJ(itr));
2359 _elm_naviframe_event_enabled_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool enabled)
2361 enabled = !!enabled;
2362 if (sd->freeze_events == !enabled) return;
2363 sd->freeze_events = !enabled;
2366 EOLIAN static Eina_Bool
2367 _elm_naviframe_event_enabled_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2369 return !sd->freeze_events;
2372 EOLIAN static Eina_Bool
2373 _elm_naviframe_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED)
2379 _elm_naviframe_class_constructor(Eo_Class *klass)
2381 evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
2384 EOLIAN const Elm_Atspi_Action *
2385 _elm_naviframe_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *pd EINA_UNUSED)
2387 static Elm_Atspi_Action atspi_actions[] = {
2388 { "top_item_get", "top_item_get", NULL, _key_action_top_item_get },
2389 { "item_pop", "item_pop", NULL, _key_action_item_pop },
2390 { NULL, NULL, NULL, NULL }
2392 return &atspi_actions[0];
2395 //TIZEN_ONLY(20161213) Using VIEW(item) for naviframe, naviframe item accessible information
2397 _elm_naviframe_elm_interface_atspi_accessible_name_get(Eo *eo, Elm_Naviframe_Data *pd EINA_UNUSED)
2399 const char *ret = NULL;
2400 Elm_Object_Item *eo_top_it = NULL;
2402 eo_top_it = elm_naviframe_top_item_get(eo);
2405 eo_do(eo_top_it, ret = elm_interface_atspi_accessible_name_get());
2412 _elm_naviframe_elm_interface_atspi_accessible_description_get(Eo *eo, Elm_Naviframe_Data *pd EINA_UNUSED)
2414 const char *ret = NULL;
2415 Elm_Object_Item *eo_top_it = NULL;
2417 eo_top_it = elm_naviframe_top_item_get(eo);
2420 eo_do(eo_top_it, ret = elm_interface_atspi_accessible_description_get());
2427 _elm_naviframe_item_elm_interface_atspi_accessible_name_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, const char *name)
2429 eo_do(VIEW(nit), elm_interface_atspi_accessible_name_set(name));
2433 _elm_naviframe_item_elm_interface_atspi_accessible_name_get(Eo *eo_item, Elm_Naviframe_Item_Data *nit)
2435 const char *ret = NULL;
2436 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, ret = elm_interface_atspi_accessible_name_get());
2437 if (ret) return ret;
2439 eo_do(VIEW(nit), ret = elm_interface_atspi_accessible_name_get());
2444 _elm_naviframe_item_elm_interface_atspi_accessible_description_set(Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data* nit, const char *description)
2446 eo_do(VIEW(nit), elm_interface_atspi_accessible_description_set(description));
2450 _elm_naviframe_item_elm_interface_atspi_accessible_description_get(Eo *eo_item, Elm_Naviframe_Item_Data *nit)
2452 const char *ret = NULL;
2453 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, ret = elm_interface_atspi_accessible_description_get());
2454 if (ret) return ret;
2456 eo_do(VIEW(nit), ret = elm_interface_atspi_accessible_description_get());
2461 #include "elm_naviframe_item.eo.c"
2462 #include "elm_naviframe.eo.c"