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";
31 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
32 {SIG_TRANSITION_FINISHED, ""},
33 {SIG_TITLE_TRANSITION_FINISHED, ""},
34 {SIG_TITLE_CLICKED, ""},
35 {SIG_WIDGET_LANG_CHANGED, ""}, /**< handled by elm_widget */
36 {SIG_WIDGET_ACCESS_CHANGED, ""}, /**< handled by elm_widget */
37 {SIG_LAYOUT_FOCUSED, ""}, /**< handled by elm_layout */
38 {SIG_LAYOUT_UNFOCUSED, ""}, /**< handled by elm_layout */
42 static Eina_Bool _on_item_back_btn_clicked(void *data,
43 Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED);
45 static Eina_Bool _key_action_top_item_get(Evas_Object *obj, const char *params);
47 static char *_access_info_cb(void *data, Evas_Object *obj EINA_UNUSED);
49 static const Elm_Action key_actions[] = {
50 {"top_item_get", _key_action_top_item_get},
55 _resize_object_reset(Evas_Object *obj, Elm_Naviframe_Item_Data *it)
59 elm_widget_resize_object_set(obj, VIEW(it), EINA_FALSE);
60 evas_object_raise(VIEW(it));
65 _prev_page_focus_recover(Elm_Naviframe_Item_Data *it)
68 unsigned int order = 0;
70 newest = elm_widget_newest_focus_order_get(VIEW(it), &order, EINA_TRUE);
72 elm_object_focus_set(newest, EINA_TRUE);
75 if (elm_object_focus_allow_get(VIEW(it)))
76 elm_object_focus_set(VIEW(it), EINA_TRUE);
78 elm_object_focus_set(WIDGET(it), EINA_TRUE);
82 EOLIAN static Eina_Bool
83 _elm_naviframe_elm_widget_translate(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
85 Elm_Naviframe_Item_Data *it;
87 EINA_INLIST_FOREACH(sd->stack, it)
88 eo_do(EO_OBJ(it), elm_wdg_item_translate());
90 eo_do_super(obj, MY_CLASS, elm_obj_widget_translate());
96 _item_content_del_cb(void *data,
98 Evas_Object *obj EINA_UNUSED,
99 void *event_info EINA_UNUSED)
101 Elm_Naviframe_Item_Data *it = data;
104 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
108 _item_title_prev_btn_del_cb(void *data,
110 Evas_Object *obj EINA_UNUSED,
111 void *event_info EINA_UNUSED)
113 Elm_Naviframe_Item_Data *it = data;
115 it->title_prev_btn = NULL;
116 if (it->auto_pushed_btn) it->auto_pushed_btn = NULL;
117 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
121 _item_title_next_btn_del_cb(void *data,
123 Evas_Object *obj EINA_UNUSED,
124 void *event_info EINA_UNUSED)
126 Elm_Naviframe_Item_Data *it = data;
128 it->title_next_btn = NULL;
129 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
133 _item_title_icon_del_cb(void *data,
135 Evas_Object *obj EINA_UNUSED,
136 void *event_info EINA_UNUSED)
138 Elm_Naviframe_Item_Data *it = data;
140 it->title_icon = NULL;
141 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
145 _title_content_del(void *data,
147 Evas_Object *obj EINA_UNUSED,
148 void *event_info EINA_UNUSED)
151 Elm_Naviframe_Content_Item_Pair *pair = data;
152 Elm_Naviframe_Item_Data *it = pair->it;
153 snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
154 elm_object_signal_emit(VIEW(it), buf, "elm");
155 it->content_list = eina_inlist_remove(it->content_list,
156 EINA_INLIST_GET(pair));
157 eina_stringshare_del(pair->part);
162 _item_free(Elm_Naviframe_Item_Data *it)
165 Elm_Naviframe_Content_Item_Pair *content_pair;
166 Elm_Naviframe_Text_Item_Pair *text_pair;
168 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
170 eina_stringshare_del(it->style);
171 eina_stringshare_del(it->title_label);
172 eina_stringshare_del(it->subtitle_label);
174 EINA_INLIST_FOREACH_SAFE(it->content_list, l, content_pair)
176 if (content_pair->content)
178 evas_object_event_callback_del(content_pair->content,
181 evas_object_del(content_pair->content);
183 eina_stringshare_del(content_pair->part);
186 EINA_INLIST_FOREACH_SAFE(it->text_list, l, text_pair)
188 eina_stringshare_del(text_pair->part);
194 if ((sd->preserve) && (!sd->on_deletion))
196 /* so that elm does not delete the contents with the item's
197 * view after the destructor */
198 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
199 evas_object_event_callback_del
200 (it->content, EVAS_CALLBACK_DEL, _item_content_del_cb);
206 _item_content_signals_emit(Elm_Naviframe_Item_Data *it)
208 Elm_Naviframe_Content_Item_Pair *content_pair;
212 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
214 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
217 if (it->title_prev_btn)
218 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
220 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
223 if (it->title_next_btn)
224 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
226 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
229 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
231 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
233 EINA_INLIST_FOREACH(it->content_list, content_pair)
235 if (content_pair->content)
236 snprintf(buf, sizeof(buf), "elm,state,%s,show", content_pair->part);
238 snprintf(buf, sizeof(buf), "elm,state,%s,hide", content_pair->part);
239 elm_object_signal_emit(VIEW(it), buf, "elm");
244 _item_text_signals_emit(Elm_Naviframe_Item_Data *it)
246 Elm_Naviframe_Text_Item_Pair *text_pair;
249 if ((it->title_label) && (it->title_label[0]))
250 elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
252 elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
254 if ((it->subtitle_label) && (it->subtitle_label[0]))
255 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
257 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
259 EINA_INLIST_FOREACH(it->text_list, text_pair)
261 if (elm_object_part_text_get(VIEW(it), text_pair->part))
262 snprintf(buf, sizeof(buf), "elm,state,%s,show", text_pair->part);
264 snprintf(buf, sizeof(buf), "elm,state,%s,hide", text_pair->part);
265 elm_object_signal_emit(VIEW(it), buf, "elm");
270 _access_object_get(Elm_Naviframe_Item_Data *it, const char* part)
272 Evas_Object *po, *ao;
274 po = (Evas_Object *)edje_object_part_object_get
275 (elm_layout_edje_get(VIEW(it)), part);
276 ao = evas_object_data_get(po, "_part_access_obj");
282 _access_info_has(Evas_Object *obj, int type)
288 ac = _elm_access_info_get(obj);
289 if (!ac) return EINA_FALSE;
291 EINA_LIST_FOREACH(ac->items, l, ai)
293 if (ai->type == type)
295 if (ai->func || ai->data) return EINA_TRUE;
303 _item_signals_emit(Elm_Naviframe_Item_Data *it)
305 _item_text_signals_emit(it);
306 _item_content_signals_emit(it);
309 /* FIXME: we need to handle the case when this function is called
310 * during a transition */
312 _item_style_set(Elm_Naviframe_Item_Data *it,
313 const char *item_style)
317 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
321 strcpy(buf, "item/basic");
322 eina_stringshare_replace(&it->style, "basic");
326 snprintf(buf, sizeof(buf), "item/%s", item_style);
327 eina_stringshare_replace(&it->style, item_style);
330 if (!elm_layout_theme_set(VIEW(it), "naviframe", buf,
331 elm_widget_style_get(WIDGET(it))))
332 CRI("Failed to set layout!");
334 if (sd->freeze_events)
335 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
337 //TIZEN ONLY(20150707): expose title as at-spi object
338 if (_elm_config->atspi_mode)
340 Evas_Object *part = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
343 Evas_Object *access = elm_access_object_register(part, VIEW(it));
344 _elm_access_callback_set(_elm_access_info_get(access),
345 ELM_ACCESS_INFO, _access_info_cb, it);
346 elm_atspi_accessible_role_set(access, ELM_ATSPI_ROLE_HEADING);
353 _on_item_title_transition_finished(void *data,
354 Evas_Object *obj EINA_UNUSED,
355 const char *emission EINA_UNUSED,
356 const char *source EINA_UNUSED)
358 Elm_Naviframe_Item_Data *it = data;
360 eo_do(WIDGET(it), eo_event_callback_call
361 (ELM_NAVIFRAME_EVENT_TITLE_TRANSITION_FINISHED, EO_OBJ(it)));
365 _item_title_enabled_update(Elm_Naviframe_Item_Data *nit, Eina_Bool transition)
367 transition = !!transition;
370 if (nit->title_enabled)
371 elm_object_signal_emit(VIEW(nit), "elm,action,title,show", "elm");
373 elm_object_signal_emit(VIEW(nit), "elm,action,title,hide", "elm");
377 if (nit->title_enabled)
378 elm_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
380 elm_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
384 EOLIAN static Eina_Bool
385 _elm_naviframe_elm_widget_theme_apply(Eo *obj, Elm_Naviframe_Data *sd)
387 Elm_Naviframe_Item_Data *it;
388 const char *style = NULL, *sstyle = NULL;
390 eo_do(obj, style = elm_obj_widget_style_get());
392 EINA_INLIST_FOREACH(sd->stack, it)
394 eo_do(VIEW(it), sstyle = elm_obj_widget_style_get());
395 if ((style && sstyle) && strcmp(style, sstyle))
396 _item_style_set(it, it->style);
397 _item_signals_emit(it);
398 _item_title_enabled_update(it, EINA_FALSE);
401 elm_layout_sizing_eval(obj);
406 _access_info_cb(void *data, Evas_Object *obj EINA_UNUSED)
408 Elm_Naviframe_Item_Data *nit;
415 if (!nit->title_enabled) return NULL;
418 info = elm_object_part_text_get(layout, TITLE_PART);
419 if (!info) return NULL;
421 buf = eina_strbuf_new();
422 eina_strbuf_append(buf, info);
424 info = elm_object_part_text_get(layout, SUBTITLE_PART);
427 eina_strbuf_append_printf(buf, ", %s", info);
430 ret = eina_strbuf_string_steal(buf);
431 eina_strbuf_free(buf);
436 _access_obj_process(Elm_Naviframe_Item_Data *it, Eina_Bool is_access)
438 Evas_Object *ao, *eo;
440 if (is_access && (it->title_label || it->subtitle_label))
442 if (!_access_object_get(it, TITLE_ACCESS_PART))
444 eo = elm_layout_edje_get(VIEW(it));
445 ao =_elm_access_edje_object_part_object_register(WIDGET(it), eo,
447 _elm_access_text_set(_elm_access_info_get(ao),
448 ELM_ACCESS_TYPE, E_("Title"));
449 _elm_access_callback_set(_elm_access_info_get(ao),
450 ELM_ACCESS_INFO, _access_info_cb, it);
451 /* to access title access object, any idea? */
452 it->base->access_obj = ao;
457 /* to access title access object, any idea? */
458 ao = it->base->access_obj;
461 if (it->title_label || it->subtitle_label)
462 _elm_access_edje_object_part_object_unregister
463 (WIDGET(it), elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
469 _elm_naviframe_item_elm_widget_item_part_text_set(Eo *eo_it EINA_UNUSED,
470 Elm_Naviframe_Item_Data *it,
474 Elm_Naviframe_Item_Data *nit = it;
475 Elm_Naviframe_Text_Item_Pair *pair = NULL;
478 if ((!part) || (!strcmp(part, "default")) ||
479 (!strcmp(part, TITLE_PART)))
481 eina_stringshare_replace(&nit->title_label, label);
483 elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
485 elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
486 elm_object_part_text_set(VIEW(it), TITLE_PART, label);
488 else if (!strcmp("subtitle", part))
490 eina_stringshare_replace(&nit->subtitle_label, label);
492 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
494 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
495 elm_object_part_text_set(VIEW(it), SUBTITLE_PART, label);
499 EINA_INLIST_FOREACH(nit->text_list, pair)
500 if (!strcmp(part, pair->part)) break;
504 pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
507 ERR("Failed to allocate new text part of the item! : naviframe=%p",
511 eina_stringshare_replace(&pair->part, part);
512 nit->text_list = eina_inlist_append(nit->text_list,
513 EINA_INLIST_GET(pair));
516 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
518 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
519 elm_object_signal_emit(VIEW(it), buf, "elm");
520 elm_object_part_text_set(VIEW(it), part, label);
524 if (_elm_config->access_mode)
525 _access_obj_process(nit, EINA_TRUE);
527 elm_layout_sizing_eval(WIDGET(nit));
530 EOLIAN static const char *
531 _elm_naviframe_item_elm_widget_item_part_text_get(Eo *nit EINA_UNUSED,
532 Elm_Naviframe_Item_Data *it,
537 if (!part || !strcmp(part, "default"))
538 snprintf(buf, sizeof(buf), TITLE_PART);
539 else if (!strcmp("subtitle", part))
540 snprintf(buf, sizeof(buf), SUBTITLE_PART);
542 snprintf(buf, sizeof(buf), "%s", part);
544 return elm_object_part_text_get(VIEW(it), buf);
548 _elm_naviframe_item_eo_base_destructor(Eo *eo_item, Elm_Naviframe_Item_Data *it)
551 Elm_Naviframe_Op *nfo;
552 Elm_Naviframe_Item_Data *nit = it, *prev_it = NULL;
555 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
557 nit->delete_me = EINA_TRUE;
559 top = (eo_item == elm_naviframe_top_item_get(WIDGET(nit)));
560 if (evas_object_data_get(VIEW(nit), "out_of_list"))
563 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
565 if (top && !sd->on_deletion) /* must raise another one */
567 if (sd->stack && sd->stack->last)
568 prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last,
569 Elm_Naviframe_Item_Data);
572 elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE);
576 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_FALSE);
577 elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE);
579 if (sd->freeze_events)
580 evas_object_freeze_events_set(VIEW(prev_it), EINA_FALSE);
581 _resize_object_reset(WIDGET(prev_it), prev_it);
582 evas_object_show(VIEW(prev_it));
584 _prev_page_focus_recover(prev_it);
586 elm_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
590 // This should not happen, but just in case and by security
591 // make sure there is no more reference to this item.
592 EINA_LIST_FOREACH(sd->ops, l, nfo)
594 if (nfo->related == nit) nfo->related = NULL;
595 if (nfo->self == nit) nfo->self = NULL;
600 eo_do_super(eo_item, ELM_NAVIFRAME_ITEM_CLASS, eo_destructor());
604 _item_content_set(Elm_Naviframe_Item_Data *it,
605 Evas_Object *content)
607 if (it->content == content) return;
609 evas_object_del(it->content);
610 it->content = content;
612 if (!content) return;
614 elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
615 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
617 evas_object_event_callback_add
618 (content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
622 _item_title_prev_btn_set(Elm_Naviframe_Item_Data *it,
625 if (it->title_prev_btn == btn) return;
626 evas_object_del(it->title_prev_btn);
627 it->title_prev_btn = btn;
628 if (it->auto_pushed_btn && (it->auto_pushed_btn != btn))
629 it->auto_pushed_btn = NULL;
632 elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
633 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
634 evas_object_event_callback_add
635 (btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
637 //FIXME: set back button callback here after elm 2.0
641 _item_title_next_btn_set(Elm_Naviframe_Item_Data *it,
644 if (it->title_next_btn == btn) return;
645 evas_object_del(it->title_next_btn);
646 it->title_next_btn = btn;
649 elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
650 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
652 evas_object_event_callback_add
653 (btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
657 _item_title_icon_set(Elm_Naviframe_Item_Data *it,
660 if (it->title_icon == icon) return;
661 evas_object_del(it->title_icon);
662 it->title_icon = icon;
665 elm_object_part_content_set(VIEW(it), ICON_PART, icon);
666 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
668 evas_object_event_callback_add
669 (icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
673 _item_content_unset(Elm_Naviframe_Item_Data *it)
675 Evas_Object *content = it->content;
677 if (!content) return NULL;
679 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
680 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
682 evas_object_event_callback_del
683 (content, EVAS_CALLBACK_DEL, _item_content_del_cb);
690 _item_title_prev_btn_unset(Elm_Naviframe_Item_Data *it)
692 Evas_Object *content = it->title_prev_btn;
694 if (!content) return NULL;
696 elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
697 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
699 evas_object_event_callback_del
700 (content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
701 Eo* parent = eo_do_ret(content, parent, eo_parent_get());
702 eo_do(content, eo_event_callback_del(
703 EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked,
705 it->title_prev_btn = NULL;
706 if (it->auto_pushed_btn) it->auto_pushed_btn = NULL;
711 _item_title_next_btn_unset(Elm_Naviframe_Item_Data *it)
713 Evas_Object *content = it->title_next_btn;
715 if (!content) return NULL;
717 elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
718 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
720 evas_object_event_callback_del
721 (content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
723 it->title_next_btn = NULL;
728 _item_title_icon_unset(Elm_Naviframe_Item_Data *it)
730 Evas_Object *content = it->title_icon;
732 if (!content) return NULL;
734 elm_object_part_content_unset(VIEW(it), ICON_PART);
735 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
737 evas_object_event_callback_del
738 (content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
740 it->title_icon = NULL;
744 /* since we have each item as layout, we can't reusing the layout's
745 * aliasing, so let's do it ourselves */
747 _part_aliasing_eval(const char **part)
749 if (!*part || !strcmp("default", *part))
750 *part = CONTENT_PART;
751 else if (!strcmp(*part, "prev_btn"))
752 *part = PREV_BTN_PART;
753 else if (!strcmp(*part, "next_btn"))
754 *part = NEXT_BTN_PART;
755 else if (!strcmp(*part, "icon"))
760 _title_content_set(Elm_Naviframe_Item_Data *it,
762 Evas_Object *content)
764 Elm_Naviframe_Content_Item_Pair *pair = NULL;
767 EINA_INLIST_FOREACH(it->content_list, pair)
768 if (!strcmp(part, pair->part)) break;
771 if (pair->content == content) return;
773 evas_object_event_callback_del(pair->content,
776 if (content) elm_object_part_content_set(VIEW(it), part, content);
780 if (!content) return;
782 //Remove the pair if new content was swallowed into other part.
783 EINA_INLIST_FOREACH(it->content_list, pair)
785 if (pair->content == content)
787 eina_stringshare_del(pair->part);
788 it->content_list = eina_inlist_remove(it->content_list,
789 EINA_INLIST_GET(pair));
790 evas_object_event_callback_del(pair->content,
799 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
802 ERR("Failed to allocate new content part of the item! : naviframe=%p",
807 eina_stringshare_replace(&pair->part, part);
808 it->content_list = eina_inlist_append(it->content_list,
809 EINA_INLIST_GET(pair));
810 elm_object_part_content_set(VIEW(it), part, content);
811 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
812 elm_object_signal_emit(VIEW(it), buf, "elm");
814 pair->content = content;
815 evas_object_event_callback_add(content,
822 _elm_naviframe_item_elm_widget_item_part_content_set(Eo *eo_nit EINA_UNUSED,
823 Elm_Naviframe_Item_Data *nit,
825 Evas_Object *content)
827 _part_aliasing_eval(&part);
830 if (!part || !strcmp(CONTENT_PART, part))
831 _item_content_set(nit, content);
832 else if (!strcmp(part, PREV_BTN_PART))
833 _item_title_prev_btn_set(nit, content);
834 else if (!strcmp(part, NEXT_BTN_PART))
835 _item_title_next_btn_set(nit, content);
836 else if (!strcmp(part, ICON_PART))
837 _item_title_icon_set(nit, content);
839 _title_content_set(nit, part, content);
841 elm_layout_sizing_eval(WIDGET(nit));
844 EOLIAN static Evas_Object *
845 _elm_naviframe_item_elm_widget_item_part_content_get(Eo *eo_nit EINA_UNUSED,
846 Elm_Naviframe_Item_Data *nit,
849 _part_aliasing_eval(&part);
852 if (!part || !strcmp(CONTENT_PART, part))
854 else if (!strcmp(part, PREV_BTN_PART))
855 return nit->title_prev_btn;
856 else if (!strcmp(part, NEXT_BTN_PART))
857 return nit->title_next_btn;
858 else if (!strcmp(part, ICON_PART))
859 return nit->title_icon;
862 return elm_object_part_content_get(VIEW(nit), part);
866 _title_content_unset(Elm_Naviframe_Item_Data *it, const char *part)
868 Elm_Naviframe_Content_Item_Pair *pair = NULL;
870 Evas_Object *content = NULL;
872 EINA_INLIST_FOREACH(it->content_list, pair)
874 if (!strcmp(part, pair->part))
876 content = pair->content;
877 eina_stringshare_del(pair->part);
878 it->content_list = eina_inlist_remove(it->content_list,
879 EINA_INLIST_GET(pair));
885 if (!content) return NULL;
887 elm_object_part_content_unset(VIEW(it), part);
888 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
889 elm_object_signal_emit(VIEW(it), buf, "elm");
890 evas_object_event_callback_del(content,
896 EOLIAN static Evas_Object *
897 _elm_naviframe_item_elm_widget_item_part_content_unset(Eo *eo_nit EINA_UNUSED,
898 Elm_Naviframe_Item_Data *nit,
901 Evas_Object *o = NULL;
903 _part_aliasing_eval(&part);
906 if (!part || !strcmp(CONTENT_PART, part))
907 o = _item_content_unset(nit);
908 else if (!strcmp(part, PREV_BTN_PART))
909 o = _item_title_prev_btn_unset(nit);
910 else if (!strcmp(part, NEXT_BTN_PART))
911 o = _item_title_next_btn_unset(nit);
912 else if (!strcmp(part, ICON_PART))
913 o = _item_title_icon_unset(nit);
915 o = _title_content_unset(nit, part);
917 elm_layout_sizing_eval(WIDGET(nit));
923 _elm_naviframe_item_elm_widget_item_signal_emit(Eo *eo_it EINA_UNUSED,
924 Elm_Naviframe_Item_Data *it,
925 const char *emission,
928 elm_object_signal_emit(VIEW(it), emission, source);
932 _elm_naviframe_elm_layout_sizing_eval(Eo *obj, Elm_Naviframe_Data *sd)
934 Evas_Coord minw = -1, minh = -1;
935 Elm_Naviframe_Item_Data *it, *top;
936 Evas_Coord x, y, w, h;
938 if (sd->on_deletion) return;
939 if (!sd->stack) return;
941 top = (EINA_INLIST_CONTAINER_GET(sd->stack->last, Elm_Naviframe_Item_Data));
942 evas_object_geometry_get(obj, &x, &y, &w, &h);
943 EINA_INLIST_FOREACH(sd->stack, it)
945 evas_object_move(VIEW(it), x, y);
946 evas_object_resize(VIEW(it), w, h);
950 edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
951 &it->minw, &it->minh);
957 evas_object_size_hint_min_set(obj, minw, minh);
958 evas_object_size_hint_max_set(obj, -1, -1);
962 _on_item_back_btn_clicked(void *data,
963 Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
965 /* Since edje has the event queue, clicked event could be happened
966 multiple times on some heavy environment. This callback del will
967 prevent those scenario and guarantee only one clicked for it's own
969 eo_do(obj, eo_event_callback_del(
970 EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked,
972 elm_naviframe_item_pop(data);
978 _back_btn_new(Evas_Object *obj, const char *title_label)
980 Evas_Object *btn, *ed;
983 btn = elm_button_add(obj);
985 if (!btn) return NULL;
986 eo_do(btn, eo_event_callback_add
987 (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _on_item_back_btn_clicked, obj));
989 (buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
990 elm_object_style_set(btn, buf);
992 elm_layout_text_set(btn, NULL, title_label);
994 elm_object_domain_translatable_text_set(btn, PACKAGE, N_("Back"));
996 /* HACK NOTE: this explicit check only exists to avoid an ERR()
997 * message from elm_layout_content_set().
999 * The button was ALWAYS supposed to support an elm.swallow.content, but
1000 * default naviframe/back_btn/default theme did not provide such, then
1001 * old themes would emit such error message.
1003 * Once we can break the theme API, remove this check and always
1006 ed = elm_layout_edje_get(btn);
1007 if (edje_object_part_exists(ed, CONTENT_PART))
1009 Evas_Object *ico = elm_icon_add(btn);
1010 elm_icon_standard_set(ico, "arrow_left");
1011 elm_layout_content_set(btn, CONTENT_PART, ico);
1014 if(_elm_config->atspi_mode)
1015 eo_do(btn, elm_interface_atspi_accessible_name_set(N_("Navigate back")));
1021 _elm_naviframe_elm_layout_signal_emit(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *emission, const char *source)
1023 Elm_Object_Item *eo_top_it;
1025 eo_top_it = elm_naviframe_top_item_get(obj);
1026 if (!eo_top_it) return;
1027 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1029 eo_do(VIEW(top_it), elm_obj_layout_signal_emit(emission, source));
1032 /* content/text smart functions proxying things to the top item, which
1033 * is the resize object of the layout */
1034 EOLIAN static Eina_Bool
1035 _elm_naviframe_elm_layout_text_set(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part, const char *label)
1037 Elm_Object_Item *it;
1038 const char *text = NULL;
1040 it = elm_naviframe_top_item_get(obj);
1041 if (!it) return EINA_FALSE;
1043 elm_object_item_part_text_set(it, part, label);
1044 text = elm_object_item_part_text_get(it, part);
1045 if ((text) && !strcmp(text, label))
1050 EOLIAN static const char*
1051 _elm_naviframe_elm_layout_text_get(const Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1053 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1054 if (!it) return NULL;
1056 return elm_object_item_part_text_get(it, part);
1059 /* we have to keep a "manual" set here because of the callbacks on the
1061 EOLIAN static Eina_Bool
1062 _elm_naviframe_elm_container_content_set(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part, Evas_Object *content)
1064 Elm_Object_Item *it;
1066 it = elm_naviframe_top_item_get(obj);
1067 if (!it) return EINA_FALSE;
1069 elm_object_item_part_content_set(it, part, content);
1071 if (content == elm_object_item_part_content_get(it, part))
1077 EOLIAN static Evas_Object*
1078 _elm_naviframe_elm_container_content_get(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1080 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1082 if (!it) return NULL;
1084 return elm_object_item_part_content_get(it, part);
1087 EOLIAN static Evas_Object*
1088 _elm_naviframe_elm_container_content_unset(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *part)
1090 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
1092 if (!it) return NULL;
1094 return elm_object_item_part_content_unset(it, part);
1098 _on_item_title_clicked(void *data,
1099 Evas_Object *obj EINA_UNUSED,
1100 const char *emission EINA_UNUSED,
1101 const char *source EINA_UNUSED)
1103 Elm_Naviframe_Item_Data *it = data;
1105 eo_do(WIDGET(it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_TITLE_CLICKED, EO_OBJ(it)));
1108 /* "elm,state,cur,pushed"
1111 _on_item_push_finished(void *data,
1112 Evas_Object *obj EINA_UNUSED,
1113 const char *emission EINA_UNUSED,
1114 const char *source EINA_UNUSED)
1116 Elm_Naviframe_Item_Data *it = data;
1120 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1122 evas_object_hide(VIEW(it));
1124 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1126 if (sd->freeze_events)
1127 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1130 /* "elm,state,cur,popped"
1133 _on_item_pop_finished(void *data,
1134 Evas_Object *obj EINA_UNUSED,
1135 const char *emission EINA_UNUSED,
1136 const char *source EINA_UNUSED)
1138 Elm_Naviframe_Item_Data *it = data;
1140 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1143 elm_widget_tree_unfocusable_set(VIEW(it), EINA_FALSE);
1144 sd->popping = eina_list_remove(sd->popping, it);
1146 eo_do(EO_OBJ(it), elm_wdg_item_del());
1149 /* "elm,state,new,pushed",
1150 * "elm,state,prev,popped
1153 _on_item_show_finished(void *data,
1154 Evas_Object *obj EINA_UNUSED,
1155 const char *emission EINA_UNUSED,
1156 const char *source EINA_UNUSED)
1158 Elm_Naviframe_Item_Data *it = data;
1160 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1162 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1164 _prev_page_focus_recover(it);
1166 if (sd->freeze_events)
1167 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1169 it->pushing = EINA_FALSE;
1171 eo_do(WIDGET(it), eo_event_callback_call(ELM_NAVIFRAME_EVENT_TRANSITION_FINISHED, EO_OBJ(it)));
1175 _on_item_size_hints_changed(void *data,
1176 Evas *e EINA_UNUSED,
1177 Evas_Object *obj EINA_UNUSED,
1178 void *event_info EINA_UNUSED)
1180 elm_layout_sizing_eval(data);
1184 _item_dispmode_set(Elm_Naviframe_Item_Data *it, Evas_Display_Mode dispmode)
1186 if (it->dispmode == dispmode) return;
1189 case EVAS_DISPLAY_MODE_COMPRESS:
1190 elm_object_signal_emit(VIEW(it), "elm,state,display,compress", "elm");
1193 elm_object_signal_emit(VIEW(it), "elm,state,display,default", "elm");
1196 it->dispmode = dispmode;
1200 _access_prev_btn_info_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
1202 return strdup(E_("Back"));
1206 _elm_naviframe_item_eo_base_constructor(Eo *eo_item, Elm_Naviframe_Item_Data *it)
1208 eo_item = eo_do_super_ret(eo_item, ELM_NAVIFRAME_ITEM_CLASS, eo_item, eo_constructor());
1209 it->base = eo_data_scope_get(eo_item, ELM_WIDGET_ITEM_CLASS);
1214 static Elm_Object_Item *
1215 _item_new(Evas_Object *obj,
1216 const Elm_Object_Item *eo_prev_it,
1217 const char *title_label,
1218 Evas_Object *prev_btn,
1219 Evas_Object *next_btn,
1220 Evas_Object *content,
1221 const char *item_style)
1225 ELM_NAVIFRAME_DATA_GET(obj, sd);
1227 eo_item = eo_add(ELM_NAVIFRAME_ITEM_CLASS, obj);
1231 ERR("Failed to allocate new item! : naviframe=%p", obj);
1235 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1238 VIEW(it) = elm_layout_add(obj);
1239 evas_object_smart_member_add(VIEW(it), obj);
1241 if (!elm_widget_sub_object_add(obj, VIEW(it)))
1242 ERR("could not add %p as sub object of %p", VIEW(it), obj);
1244 evas_object_event_callback_add
1245 (VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1246 _on_item_size_hints_changed, obj);
1248 elm_object_signal_callback_add
1249 (VIEW(it), "elm,action,show,finished", "*", _on_item_show_finished, it);
1250 elm_object_signal_callback_add
1251 (VIEW(it), "elm,action,pushed,finished", "*", _on_item_push_finished, it);
1252 elm_object_signal_callback_add
1253 (VIEW(it), "elm,action,popped,finished", "*", _on_item_pop_finished, it);
1254 elm_object_signal_callback_add
1255 (VIEW(it), "elm,action,title,transition,finished", "*", _on_item_title_transition_finished, it);
1256 elm_object_signal_callback_add
1257 (VIEW(it), "elm,action,title,clicked", "*", _on_item_title_clicked, it);
1259 _item_style_set(it, item_style);
1262 eo_do(eo_item, elm_wdg_item_part_text_set(TITLE_PART, title_label));
1265 if ((!prev_btn) && sd->auto_pushed && eo_prev_it)
1267 ELM_NAVIFRAME_ITEM_DATA_GET(eo_prev_it, prev_it);
1268 const char *prev_title = prev_it->title_label;
1269 prev_btn = _back_btn_new(obj, prev_title);
1270 it->auto_pushed_btn = prev_btn;
1275 eo_do(eo_item, elm_wdg_item_part_content_set(PREV_BTN_PART, prev_btn));
1276 if (!elm_layout_text_get(prev_btn, NULL))
1278 if (!_access_info_has(prev_btn, ELM_ACCESS_INFO))
1280 /* set access info */
1281 _elm_access_callback_set
1282 (_elm_access_info_get(prev_btn), ELM_ACCESS_INFO,
1283 _access_prev_btn_info_cb, it);
1290 eo_do(eo_item, elm_wdg_item_part_content_set(NEXT_BTN_PART, next_btn));
1292 if (!elm_layout_text_get(next_btn, NULL))
1294 if (!_access_info_has(next_btn, ELM_ACCESS_INFO))
1296 /* set access info */
1297 _elm_access_text_set
1298 (_elm_access_info_get(next_btn), ELM_ACCESS_INFO, E_("Next"));
1303 _item_content_set(it, content);
1304 _item_dispmode_set(it, sd->dispmode);
1306 it->title_enabled = EINA_TRUE;
1308 //TIZEN ONLY(20150707): expose title as at-spi object
1309 if (_elm_config->atspi_mode)
1311 Evas_Object *part = (Evas_Object*)edje_object_part_object_get(elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
1314 Evas_Object *access = elm_access_object_register(part, VIEW(it));
1315 _elm_access_callback_set(_elm_access_info_get(access),
1316 ELM_ACCESS_INFO, _access_info_cb, it);
1317 elm_atspi_accessible_role_set(access, ELM_ATSPI_ROLE_HEADING);
1326 _on_obj_size_hints_changed(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
1327 Evas_Object *obj, void *event_info EINA_UNUSED)
1329 Elm_Naviframe_Item_Data *it;
1330 Evas_Display_Mode dispmode;
1332 ELM_NAVIFRAME_DATA_GET(obj, sd);
1334 dispmode = evas_object_size_hint_display_mode_get(obj);
1335 if (sd->dispmode == dispmode) return;
1337 sd->dispmode = dispmode;
1339 EINA_INLIST_FOREACH(sd->stack, it)
1340 _item_dispmode_set(it, dispmode);
1343 EOLIAN static Eina_Bool
1344 _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)
1348 Eina_List *l = NULL;
1349 Elm_Object_Item *eo_top_it;
1350 void *(*list_data_get)(const Eina_List *list);
1352 Eina_Bool int_ret = EINA_FALSE;
1354 eo_top_it = elm_naviframe_top_item_get(obj);
1355 if (!eo_top_it) goto end;
1357 list_data_get = eina_list_data_get;
1359 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1360 l = eina_list_append(l, VIEW(top_it));
1363 if (_elm_config->access_mode)
1365 ao = _access_object_get(top_it, TITLE_ACCESS_PART);
1366 if (ao) l = eina_list_append(l, ao);
1369 int_ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next, next_item);
1376 int_ret = !elm_widget_focus_get(obj);
1382 EOLIAN static Eina_Bool
1383 _elm_naviframe_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED)
1388 EOLIAN static Eina_Bool
1389 _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)
1393 Eina_List *l = NULL;
1394 Elm_Object_Item *eo_top_it;
1395 void *(*list_data_get)(const Eina_List *list);
1397 eo_top_it = elm_naviframe_top_item_get(obj);
1398 if (!eo_top_it) return EINA_FALSE;
1400 list_data_get = eina_list_data_get;
1402 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it);
1403 l = eina_list_append(l, VIEW(top_it));
1405 int_ret = elm_widget_focus_list_direction_get
1406 (obj, base, l, list_data_get, degree, direction, direction_item, weight);
1414 _elm_naviframe_evas_object_smart_add(Eo *obj, Elm_Naviframe_Data *priv)
1416 ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
1418 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
1419 elm_widget_sub_object_parent_add(obj);
1421 priv->dummy_edje = wd->resize_obj;
1422 evas_object_smart_member_add(priv->dummy_edje, obj);
1424 priv->auto_pushed = _elm_config->naviframe_prev_btn_auto_pushed;
1425 priv->freeze_events = EINA_TRUE;
1427 evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1428 _on_obj_size_hints_changed, obj);
1429 elm_widget_can_focus_set(obj, EINA_TRUE);
1433 _send_signal(Elm_Naviframe_Item_Data *it, const char *sig)
1436 elm_object_signal_emit(VIEW(it), sig, "elm");
1437 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1441 _deferred(void *data)
1443 Elm_Naviframe_Data *nfd = data;
1444 Elm_Naviframe_Op *nfo;
1446 EINA_LIST_FREE(nfd->ops, nfo)
1448 const char *signals_cur[] = {
1449 "elm,state,cur,popped,deferred",
1450 "elm,state,cur,pushed,deferred"
1452 const char *signals_prev = "elm,state,prev,popped,deferred";
1453 const char *signals_new = "elm,state,new,pushed,deferred";
1454 Elm_Naviframe_Item_Data *cur;
1455 Elm_Naviframe_Item_Data *other;
1457 cur = nfo->push ? nfo->related : nfo->self;
1458 other = nfo->push ? nfo->self : nfo->related;
1460 _send_signal(cur, signals_cur[nfo->push]);
1461 _send_signal(other, nfo->push ? signals_new : signals_prev);
1466 nfd->animator = NULL;
1467 return ECORE_CALLBACK_CANCEL;
1471 _elm_naviframe_evas_object_smart_del(Eo *obj, Elm_Naviframe_Data *sd)
1473 Elm_Naviframe_Item_Data *it;
1474 Elm_Naviframe_Op *nfo;
1476 sd->on_deletion = EINA_TRUE;
1480 it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item_Data);
1481 eo_do(EO_OBJ(it), elm_wdg_item_del());
1484 //All popping items which are not called yet by animator.
1485 if (sd->animator) ecore_animator_del(sd->animator);
1486 EINA_LIST_FREE(sd->ops, nfo)
1488 EINA_LIST_FREE(sd->popping, it)
1489 eo_do(EO_OBJ(it), elm_wdg_item_del());
1491 evas_object_del(sd->dummy_edje);
1493 eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
1496 //Show only the top item view
1498 _elm_naviframe_evas_object_smart_show(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED)
1500 Elm_Object_Item *eo_top;
1502 eo_top = elm_naviframe_top_item_get(obj);
1503 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top, top);
1505 if (top && !top->delete_me)
1506 evas_object_show(VIEW(top));
1510 _key_action_top_item_get(Evas_Object *obj, const char *params EINA_UNUSED)
1512 Elm_Object_Item *eo_item = NULL;
1513 eo_do(obj, eo_item = elm_obj_naviframe_top_item_get());
1514 if (!eo_item) return EINA_FALSE;
1516 //FIXME: Replace this below code to elm_naviframe_item_pop() at elm 2.0.
1517 ///Leave for compatibility.
1518 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1519 if (it->title_prev_btn)
1520 eo_do(it->title_prev_btn, eo_event_callback_call(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL));
1525 EOLIAN static Eina_Bool
1526 _elm_naviframe_elm_widget_event(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, Evas_Object *src, Evas_Callback_Type type, void *event_info)
1529 Evas_Event_Key_Down *ev = event_info;
1531 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1532 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
1533 if (!_elm_config_key_binding_call(obj, ev, key_actions)) return EINA_FALSE;
1535 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1540 _elm_naviframe_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool is_access)
1542 Elm_Naviframe_Item_Data *it;
1544 EINA_INLIST_FOREACH(sd->stack, it)
1545 _access_obj_process(it, is_access);
1549 _item_push_helper(Elm_Naviframe_Item_Data *item)
1551 Elm_Object_Item *eo_top_item;
1552 Evas_Object *obj = WIDGET(item);
1553 ELM_NAVIFRAME_DATA_GET(obj, sd);
1554 eo_top_item = elm_naviframe_top_item_get(obj);
1555 evas_object_show(VIEW(item));
1557 ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_item, top_item);
1558 if (top_item) elm_widget_focused_object_clear(VIEW(top_item));
1559 _resize_object_reset(obj, item);
1562 Elm_Naviframe_Op *nfo = calloc(1, sizeof (Elm_Naviframe_Op));
1564 elm_widget_tree_unfocusable_set(VIEW(item), EINA_FALSE);
1565 elm_widget_tree_unfocusable_set(VIEW(top_item), EINA_TRUE);
1567 if (sd->freeze_events)
1569 evas_object_freeze_events_set(VIEW(item), EINA_TRUE);
1570 evas_object_freeze_events_set(VIEW(top_item), EINA_TRUE);
1572 elm_object_signal_emit(VIEW(top_item), "elm,state,cur,pushed", "elm");
1573 elm_object_signal_emit(VIEW(item), "elm,state,new,pushed", "elm");
1574 edje_object_message_signal_process(elm_layout_edje_get(VIEW(top_item)));
1575 edje_object_message_signal_process(elm_layout_edje_get(VIEW(item)));
1578 nfo->related = top_item;
1579 nfo->push = EINA_TRUE;
1581 sd->ops = eina_list_append(sd->ops, nfo);
1582 if (!sd->animator) sd->animator = ecore_animator_add(_deferred, sd);
1583 item->pushing = EINA_TRUE;
1587 if (elm_object_focus_allow_get(VIEW(item)))
1588 elm_object_focus_set(VIEW(item), EINA_TRUE);
1590 elm_object_focus_set(WIDGET(item), EINA_TRUE);
1593 sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(item));
1596 elm_object_signal_emit(VIEW(item), "elm,state,visible", "elm");
1598 elm_layout_sizing_eval(obj);
1602 elm_naviframe_add(Evas_Object *parent)
1604 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1605 Evas_Object *obj = eo_add(MY_CLASS, parent);
1610 _elm_naviframe_eo_base_constructor(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED)
1612 obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
1614 evas_obj_type_set(MY_CLASS_NAME_LEGACY),
1615 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
1616 elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PAGE_TAB_LIST));
1621 EOLIAN static Elm_Object_Item*
1622 _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)
1624 Elm_Object_Item *top_item, *eo_item;
1626 top_item = elm_naviframe_top_item_get(obj);
1627 eo_item = _item_new(obj, top_item,
1628 title_label, prev_btn, next_btn, content, item_style);
1629 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, item);
1630 if (!item) return NULL;
1631 _item_push_helper(item);
1635 EOLIAN static Elm_Object_Item*
1636 _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)
1638 Elm_Object_Item *eo_it;
1639 Elm_Naviframe_Item_Data *prev_it = NULL;
1641 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_before, NULL);
1642 ELM_NAVIFRAME_ITEM_DATA_GET(eo_before, before);
1644 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
1647 ELM_NAVIFRAME_ITEM_DATA_GET(eo_it, it);
1648 if (EINA_INLIST_GET(it)->prev)
1649 prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
1650 Elm_Naviframe_Item_Data);
1651 eo_it = _item_new(obj, EO_OBJ(prev_it),
1652 title_label, prev_btn, next_btn, content, item_style);
1653 if (!eo_it) return NULL;
1655 it = eo_data_scope_get(eo_it, ELM_NAVIFRAME_ITEM_CLASS);
1657 sd->stack = eina_inlist_prepend_relative
1658 (sd->stack, EINA_INLIST_GET(it),
1659 EINA_INLIST_GET(before));
1661 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1662 evas_object_hide(VIEW(it));
1663 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1665 elm_layout_sizing_eval(obj);
1670 EOLIAN static Elm_Object_Item*
1671 _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)
1673 Elm_Object_Item *eo_item;
1674 Eina_Bool top_inserted = EINA_FALSE;
1676 EINA_SAFETY_ON_NULL_RETURN_VAL(eo_after, NULL);
1677 ELM_NAVIFRAME_ITEM_DATA_GET(eo_after, after);
1679 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
1681 eo_item = _item_new(obj, eo_after,
1682 title_label, prev_btn, next_btn, content, item_style);
1683 if (!eo_item) return NULL;
1685 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1687 if (elm_naviframe_top_item_get(obj) == eo_after) top_inserted = EINA_TRUE;
1689 sd->stack = eina_inlist_append_relative
1690 (sd->stack, EINA_INLIST_GET(it),
1691 EINA_INLIST_GET(after));
1696 elm_widget_focused_object_clear(VIEW(after));
1697 elm_widget_tree_unfocusable_set(VIEW(after), EINA_TRUE);
1698 _resize_object_reset(obj, it);
1699 evas_object_show(VIEW(it));
1700 evas_object_hide(VIEW(after));
1701 if (elm_object_focus_allow_get(VIEW(it)))
1702 elm_object_focus_set(VIEW(it), EINA_TRUE);
1704 elm_object_focus_set(WIDGET(it), EINA_TRUE);
1705 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1706 elm_object_signal_emit(VIEW(after), "elm,state,invisible", "elm");
1709 elm_object_signal_emit(VIEW(it), "elm,state,invisible", "elm");
1711 elm_layout_sizing_eval(obj);
1716 EOLIAN static Evas_Object*
1717 _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd)
1719 Elm_Object_Item *eo_item;
1720 Elm_Naviframe_Item_Data *prev_it = NULL;
1721 Evas_Object *content = NULL;
1723 eo_item = elm_naviframe_top_item_get(obj);
1724 if (!eo_item) return NULL;
1726 ELM_NAVIFRAME_ITEM_DATA_GET(eo_item, it);
1728 if (it->pushing || it->popping) return NULL;
1729 it->popping = EINA_TRUE;
1731 evas_object_ref(obj);
1735 if (!it->pop_cb(it->pop_data, eo_item))
1739 eo_do(eo_item, elm_wdg_item_del());
1742 /* To avoid multiple item pops, the auto pushed button deletes
1743 its clicked callback once it is called.
1744 Since the item is not popped or deleted here, the deleted
1745 callback of the auto pushed button should be restored. */
1746 if (it->auto_pushed_btn)
1747 eo_do(it->auto_pushed_btn, eo_event_callback_add
1748 (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED,
1749 _on_item_back_btn_clicked, obj));
1750 it->popping = EINA_FALSE;
1752 evas_object_unref(obj);
1757 evas_object_unref(obj);
1760 content = it->content;
1762 evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
1764 if (sd->stack->last->prev)
1765 prev_it = EINA_INLIST_CONTAINER_GET
1766 (sd->stack->last->prev, Elm_Naviframe_Item_Data);
1768 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
1772 Elm_Naviframe_Op *nfo = calloc(1, sizeof (Elm_Naviframe_Op));
1774 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1775 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_FALSE);
1777 if (sd->freeze_events)
1779 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1780 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1783 _resize_object_reset(obj, prev_it);
1785 /* these 2 signals MUST take place simultaneously */
1786 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1787 evas_object_show(VIEW(prev_it));
1788 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
1790 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1791 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1793 if (!nfo) goto on_error;
1796 nfo->related = prev_it;
1797 nfo->push = EINA_FALSE;
1799 sd->popping = eina_list_append(sd->popping, it);
1800 sd->ops = eina_list_append(sd->ops, nfo);
1801 if (!sd->animator) sd->animator = ecore_animator_add(_deferred, sd);
1804 eo_do(eo_item, elm_wdg_item_del());
1811 _elm_naviframe_item_pop_to(Eo *eo_it, Elm_Naviframe_Item_Data *it)
1815 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1817 if (eo_it == elm_naviframe_top_item_get(WIDGET(it))) return;
1819 l = sd->stack->last->prev;
1821 sd->on_deletion = EINA_TRUE;
1825 Elm_Naviframe_Item_Data *iit = EINA_INLIST_CONTAINER_GET
1826 (l, Elm_Naviframe_Item_Data);
1828 if (iit == it) break;
1832 eo_do(EO_OBJ(iit), elm_wdg_item_del());
1835 sd->on_deletion = EINA_FALSE;
1837 elm_naviframe_item_pop(WIDGET(it));
1841 _elm_naviframe_item_promote(Eo *eo_it, Elm_Naviframe_Item_Data *it)
1843 Elm_Object_Item *eo_prev_top;
1844 Elm_Naviframe_Item_Data *nit = it;
1846 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
1848 eo_prev_top = elm_naviframe_top_item_get(WIDGET(nit));
1849 if (eo_it == eo_prev_top) return;
1851 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
1852 _item_push_helper(nit);
1856 _elm_naviframe_item_simple_promote(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Evas_Object *content)
1858 Elm_Naviframe_Item_Data *itr;
1860 EINA_INLIST_FOREACH(sd->stack, itr)
1862 if (elm_object_item_content_get(EO_OBJ(itr)) == content)
1864 elm_naviframe_item_promote(EO_OBJ(itr));
1871 _elm_naviframe_content_preserve_on_pop_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool preserve)
1873 sd->preserve = !!preserve;
1876 EOLIAN static Eina_Bool
1877 _elm_naviframe_content_preserve_on_pop_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
1879 return sd->preserve;
1882 EOLIAN static Elm_Object_Item*
1883 _elm_naviframe_top_item_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
1885 if (!sd->stack) return NULL;
1886 Elm_Naviframe_Item_Data *ret_it = EINA_INLIST_CONTAINER_GET
1887 (sd->stack->last, Elm_Naviframe_Item_Data);
1888 return EO_OBJ(ret_it);
1891 EOLIAN static Elm_Object_Item*
1892 _elm_naviframe_bottom_item_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
1894 if (!sd->stack) return NULL;
1895 Elm_Naviframe_Item_Data *ret_it = EINA_INLIST_CONTAINER_GET
1896 (sd->stack, Elm_Naviframe_Item_Data);
1897 return EO_OBJ(ret_it);
1901 _elm_naviframe_item_style_set(Eo *eo_item EINA_UNUSED,
1902 Elm_Naviframe_Item_Data *nit,
1903 const char *item_style)
1905 if (item_style && !strcmp(item_style, nit->style)) return;
1908 if (!strcmp("basic", nit->style)) return;
1910 _item_style_set(nit, item_style);
1911 _item_signals_emit(nit);
1912 _item_title_enabled_update(nit, EINA_FALSE);
1915 EOLIAN static const char *
1916 _elm_naviframe_item_style_get(Eo *eo_item EINA_UNUSED,
1917 Elm_Naviframe_Item_Data *nit)
1922 EINA_DEPRECATED EAPI void
1923 elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
1926 elm_naviframe_item_title_enabled_set(it, visible, EINA_FALSE);
1929 EINA_DEPRECATED EAPI Eina_Bool
1930 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
1932 return elm_naviframe_item_title_enabled_get(it);
1936 _elm_naviframe_item_title_enabled_set(Eo *eo_item EINA_UNUSED,
1937 Elm_Naviframe_Item_Data *nit,
1939 Eina_Bool transition)
1941 enabled = !!enabled;
1942 if (nit->title_enabled == enabled) return;
1944 nit->title_enabled = enabled;
1946 transition = !!transition;
1947 _item_title_enabled_update(nit, transition);
1950 EOLIAN static Eina_Bool
1951 _elm_naviframe_item_title_enabled_get(const Eo *eo_item EINA_UNUSED, Elm_Naviframe_Item_Data *nit)
1953 return nit->title_enabled;
1957 _elm_naviframe_item_pop_cb_set(Eo *eo_item EINA_UNUSED,
1958 Elm_Naviframe_Item_Data *nit,
1959 Elm_Naviframe_Item_Pop_Cb func,
1963 nit->pop_data = data;
1967 _elm_naviframe_prev_btn_auto_pushed_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool auto_pushed)
1969 sd->auto_pushed = !!auto_pushed;
1972 EOLIAN static Eina_Bool
1973 _elm_naviframe_prev_btn_auto_pushed_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
1975 return sd->auto_pushed;
1978 EOLIAN static Eina_List*
1979 _elm_naviframe_items_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
1981 Eina_List *ret = NULL;
1982 Elm_Naviframe_Item_Data *itr;
1984 EINA_INLIST_FOREACH(sd->stack, itr)
1985 ret = eina_list_append(ret, EO_OBJ(itr));
1991 _elm_naviframe_event_enabled_set(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd, Eina_Bool enabled)
1993 enabled = !!enabled;
1994 if (sd->freeze_events == !enabled) return;
1995 sd->freeze_events = !enabled;
1998 EOLIAN static Eina_Bool
1999 _elm_naviframe_event_enabled_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd)
2001 return !sd->freeze_events;
2004 EOLIAN static Eina_Bool
2005 _elm_naviframe_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED)
2011 _elm_naviframe_class_constructor(Eo_Class *klass)
2013 evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
2016 EOLIAN const Elm_Atspi_Action *
2017 _elm_naviframe_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *pd EINA_UNUSED)
2019 static Elm_Atspi_Action atspi_actions[] = {
2020 { "top_item_get", "top_item_get", NULL, _key_action_top_item_get },
2021 { NULL, NULL, NULL, NULL }
2023 return &atspi_actions[0];
2026 #include "elm_naviframe_item.eo.c"
2027 #include "elm_naviframe.eo.c"