1 #include <Elementary.h>
3 #include "elm_widget_naviframe.h"
5 EAPI const char ELM_NAVIFRAME_SMART_NAME[] = "elm_naviframe";
7 static const char CONTENT_PART[] = "elm.swallow.content";
8 static const char PREV_BTN_PART[] = "elm.swallow.prev_btn";
9 static const char NEXT_BTN_PART[] = "elm.swallow.next_btn";
10 static const char ICON_PART[] = "elm.swallow.icon";
11 static const char TITLE_PART[] = "elm.text.title";
12 static const char SUBTITLE_PART[] = "elm.text.subtitle";
13 static const char TITLE_ACCESS_PART[] = "access.title";
15 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
16 static const char SIG_TITLE_CLICKED[] = "title,clicked";
17 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
18 {SIG_TRANSITION_FINISHED, ""},
19 {SIG_TITLE_CLICKED, ""},
23 EVAS_SMART_SUBCLASS_NEW
24 (ELM_NAVIFRAME_SMART_NAME, _elm_naviframe, Elm_Naviframe_Smart_Class,
25 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
27 static const char SIG_CLICKED[] = "clicked";
30 _item_content_del_cb(void *data,
32 Evas_Object *obj __UNUSED__,
33 void *event_info __UNUSED__)
35 Elm_Naviframe_Item *it = data;
38 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
42 _item_title_prev_btn_del_cb(void *data,
44 Evas_Object *obj __UNUSED__,
45 void *event_info __UNUSED__)
47 Elm_Naviframe_Item *it = data;
49 it->title_prev_btn = NULL;
50 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
54 _item_title_next_btn_del_cb(void *data,
56 Evas_Object *obj __UNUSED__,
57 void *event_info __UNUSED__)
59 Elm_Naviframe_Item *it = data;
61 it->title_next_btn = NULL;
62 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
66 _item_title_icon_del_cb(void *data,
68 Evas_Object *obj __UNUSED__,
69 void *event_info __UNUSED__)
71 Elm_Naviframe_Item *it = data;
73 it->title_icon = NULL;
74 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
78 _title_content_del(void *data,
80 Evas_Object *obj __UNUSED__,
81 void *event_info __UNUSED__)
84 Elm_Naviframe_Content_Item_Pair *pair = data;
85 Elm_Naviframe_Item *it = pair->it;
86 snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
87 elm_object_signal_emit(VIEW(it), buf, "elm");
88 it->content_list = eina_inlist_remove(it->content_list,
89 EINA_INLIST_GET(pair));
90 eina_stringshare_del(pair->part);
95 _item_free(Elm_Naviframe_Item *it)
98 Elm_Naviframe_Content_Item_Pair *content_pair;
99 Elm_Naviframe_Text_Item_Pair *text_pair;
101 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
103 eina_stringshare_del(it->style);
104 eina_stringshare_del(it->title_label);
105 eina_stringshare_del(it->subtitle_label);
107 EINA_INLIST_FOREACH_SAFE(it->content_list, l, content_pair)
109 if (content_pair->content)
111 evas_object_event_callback_del(content_pair->content,
114 evas_object_del(content_pair->content);
116 eina_stringshare_del(content_pair->part);
119 EINA_INLIST_FOREACH_SAFE(it->text_list, l, text_pair)
121 eina_stringshare_del(text_pair->part);
127 if ((sd->preserve) && (!sd->on_deletion))
129 /* so that elm does not delete the contents with the item's
130 * view after the del_pre_hook */
131 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
132 evas_object_event_callback_del
133 (it->content, EVAS_CALLBACK_DEL, _item_content_del_cb);
139 _item_content_signals_emit(Elm_Naviframe_Item *it)
141 Elm_Naviframe_Content_Item_Pair *content_pair;
145 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
147 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
150 if (it->title_prev_btn)
151 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
153 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
156 if (it->title_next_btn)
157 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
159 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
162 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
164 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
166 EINA_INLIST_FOREACH(it->content_list, content_pair)
168 if (content_pair->content)
169 snprintf(buf, sizeof(buf), "elm,state,%s,show", content_pair->part);
171 snprintf(buf, sizeof(buf), "elm,state,%s,hide", content_pair->part);
172 elm_object_signal_emit(VIEW(it), buf, "elm");
177 _item_text_signals_emit(Elm_Naviframe_Item *it)
179 Elm_Naviframe_Text_Item_Pair *text_pair;
182 if ((it->title_label) && (it->title_label[0]))
183 elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
185 elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
187 if ((it->subtitle_label) && (it->subtitle_label[0]))
188 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
190 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
192 EINA_INLIST_FOREACH(it->text_list, text_pair)
194 if (elm_object_part_text_get(VIEW(it), text_pair->part))
195 snprintf(buf, sizeof(buf), "elm,state,%s,show", text_pair->part);
197 snprintf(buf, sizeof(buf), "elm,state,%s,hide", text_pair->part);
198 elm_object_signal_emit(VIEW(it), buf, "elm");
203 _access_object_get(Elm_Naviframe_Item *it, const char* part)
205 Evas_Object *po, *ao;
207 po = (Evas_Object *)edje_object_part_object_get
208 (elm_layout_edje_get(VIEW(it)), part);
209 ao = evas_object_data_get(po, "_part_access_obj");
215 _access_focus_set(Elm_Naviframe_Item *it)
219 if (!it->title_visible)
221 elm_object_focus_set(it->content, EINA_TRUE);
225 ao =_access_object_get(it, TITLE_ACCESS_PART);
226 if (ao) elm_object_focus_set(ao, EINA_TRUE);
227 else if ((it->title_icon) &&
228 (elm_widget_can_focus_get(it->title_icon) ||
229 elm_widget_child_can_focus_get(it->title_icon)))
230 elm_object_focus_set(it->title_icon, EINA_TRUE);
234 _item_signals_emit(Elm_Naviframe_Item *it)
236 _item_text_signals_emit(it);
237 _item_content_signals_emit(it);
240 /* FIXME: we need to handle the case when this function is called
241 * during a transition */
243 _item_style_set(Elm_Naviframe_Item *it,
244 const char *item_style)
248 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
252 strcpy(buf, "item/basic");
253 eina_stringshare_replace(&it->style, "basic");
257 snprintf(buf, sizeof(buf), "item/%s", item_style);
258 eina_stringshare_replace(&it->style, item_style);
261 elm_layout_theme_set(VIEW(it), "naviframe", buf,
262 elm_widget_style_get(WIDGET(it)));
264 if (sd->freeze_events)
265 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
269 _item_title_visible_update(Elm_Naviframe_Item *nit)
272 if (_elm_config->access_mode) _access_focus_set(nit);
274 if (nit->title_visible)
275 elm_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
277 elm_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
281 _elm_naviframe_smart_theme(Evas_Object *obj)
283 Elm_Naviframe_Item *it;
284 const char *style, *sstyle;
286 ELM_NAVIFRAME_DATA_GET(obj, sd);
288 style = elm_widget_style_get(obj);
290 EINA_INLIST_FOREACH(sd->stack, it)
292 /* FIXME: Need to merge with opensource later. smart_theme() is called
293 multiple timese since the elm_widget.c is inefficient. If the
294 elm_widget is merged with the latest opensouce, it's ok to sync with
295 opensource here also */
296 sstyle = elm_widget_style_get(VIEW(it));
297 if ((style && sstyle) && strcmp(style, sstyle))
299 _item_style_set(it, it->style);
300 _item_signals_emit(it);
301 _item_title_visible_update(it);
305 elm_layout_sizing_eval(obj);
311 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
318 layout = (Evas_Object *)data;
319 info = elm_object_part_text_get(layout, TITLE_PART);
320 if (!info) return NULL;
322 buf = eina_strbuf_new();
323 eina_strbuf_append(buf, info);
325 info = elm_object_part_text_get(layout, SUBTITLE_PART);
328 eina_strbuf_append_printf(buf, ", %s", info);
331 ret = eina_strbuf_string_steal(buf);
332 eina_strbuf_free(buf);
337 _access_obj_process(Elm_Naviframe_Item *it, Eina_Bool is_access)
339 Evas_Object *ao, *eo;
343 if (!_access_object_get(it, TITLE_ACCESS_PART))
345 eo = elm_layout_edje_get(VIEW(it));
346 ao =_elm_access_edje_object_part_object_register(WIDGET(it), eo,
348 _elm_access_text_set(_elm_access_object_get(ao),
349 ELM_ACCESS_TYPE, E_("title"));
350 _elm_access_callback_set(_elm_access_object_get(ao),
351 ELM_ACCESS_INFO, _access_info_cb, VIEW(it));
353 /* to access title access object, any idea? */
354 ((Elm_Widget_Item *)it)->access_obj = ao;
360 _elm_access_edje_object_part_object_unregister
361 (WIDGET(it), elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
363 /* to access title access object, any idea? */
364 ao = ((Elm_Widget_Item *)it)->access_obj;
371 _item_text_set_hook(Elm_Object_Item *it,
375 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
376 Elm_Naviframe_Text_Item_Pair *pair = NULL;
379 if ((!part) || (!strcmp(part, "default")) ||
380 (!strcmp(part, TITLE_PART)))
382 eina_stringshare_replace(&nit->title_label, label);
384 elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
386 elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
387 elm_object_part_text_set(VIEW(it), TITLE_PART, label);
389 else if (!strcmp("subtitle", part))
391 eina_stringshare_replace(&nit->subtitle_label, label);
393 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
395 elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
396 elm_object_part_text_set(VIEW(it), SUBTITLE_PART, label);
400 EINA_INLIST_FOREACH(nit->text_list, pair)
401 if (!strcmp(part, pair->part)) break;
405 pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
408 ERR("Failed to allocate new text part of the item! : naviframe=%p",
412 eina_stringshare_replace(&pair->part, part);
413 nit->text_list = eina_inlist_append(nit->text_list,
414 EINA_INLIST_GET(pair));
417 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
419 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
420 elm_object_signal_emit(VIEW(it), buf, "elm");
421 elm_object_part_text_set(VIEW(it), part, label);
425 if (_elm_config->access_mode)
426 _access_obj_process(nit, EINA_TRUE);
428 elm_layout_sizing_eval(WIDGET(nit));
432 _item_text_get_hook(const Elm_Object_Item *it,
437 if (!part || !strcmp(part, "default"))
438 snprintf(buf, sizeof(buf), TITLE_PART);
439 else if (!strcmp("subtitle", part))
440 snprintf(buf, sizeof(buf), SUBTITLE_PART);
442 snprintf(buf, sizeof(buf), "%s", part);
444 return elm_object_part_text_get(VIEW(it), buf);
448 _item_del_pre_hook(Elm_Object_Item *it)
450 Elm_Naviframe_Item *nit, *prev_it = NULL;
453 nit = (Elm_Naviframe_Item *)it;
454 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
456 if (nit->animator) ecore_animator_del(nit->animator);
458 top = (it == elm_naviframe_top_item_get(WIDGET(nit)));
459 if (evas_object_data_get(VIEW(nit), "out_of_list"))
462 if (!sd->on_deletion)
464 nit->unfocusable = elm_widget_tree_unfocusable_get(VIEW(nit));
465 elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE);
468 if (sd->stack->last->prev)
469 prev_it = EINA_INLIST_CONTAINER_GET
470 (sd->stack->last->prev, Elm_Naviframe_Item);
472 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
473 if (!sd->stack) elm_widget_resize_object_set(WIDGET(it), sd->dummy_edje);
475 if (top && !sd->on_deletion) /* must raise another one */
477 if (!prev_it) goto end;
479 if (sd->freeze_events)
481 evas_object_freeze_events_set(VIEW(prev_it), EINA_FALSE);
483 elm_widget_resize_object_set(WIDGET(prev_it), VIEW(prev_it));
484 evas_object_show(VIEW(prev_it));
485 evas_object_raise(VIEW(prev_it));
487 elm_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
498 _item_content_set(Elm_Naviframe_Item *it,
499 Evas_Object *content)
501 if (it->content == content) return;
503 if (it->content) evas_object_del(it->content);
504 it->content = content;
506 if (!content) return;
508 elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
509 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
511 evas_object_event_callback_add
512 (content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
516 _item_title_prev_btn_set(Elm_Naviframe_Item *it,
519 if (it->title_prev_btn == btn) return;
520 if (it->title_prev_btn) evas_object_del(it->title_prev_btn);
521 it->title_prev_btn = btn;
524 elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
525 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
526 evas_object_event_callback_add
527 (btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
531 _item_title_next_btn_set(Elm_Naviframe_Item *it,
534 if (it->title_next_btn == btn) return;
535 if (it->title_next_btn) evas_object_del(it->title_next_btn);
536 it->title_next_btn = btn;
539 elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
540 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
542 evas_object_event_callback_add
543 (btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
547 _item_title_icon_set(Elm_Naviframe_Item *it,
550 if (it->title_icon == icon) return;
551 if (it->title_icon) evas_object_del(it->title_icon);
552 it->title_icon = icon;
555 elm_object_part_content_set(VIEW(it), ICON_PART, icon);
556 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
558 evas_object_event_callback_add
559 (icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
563 _item_content_unset(Elm_Naviframe_Item *it)
565 Evas_Object *content = it->content;
567 if (!content) return NULL;
569 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
570 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
572 evas_object_event_callback_del
573 (content, EVAS_CALLBACK_DEL, _item_content_del_cb);
580 _item_title_prev_btn_unset(Elm_Naviframe_Item *it)
582 Evas_Object *content = it->title_prev_btn;
584 if (!content) return NULL;
586 elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
587 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
589 evas_object_event_callback_del
590 (content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
592 it->title_prev_btn = NULL;
597 _item_title_next_btn_unset(Elm_Naviframe_Item *it)
599 Evas_Object *content = it->title_next_btn;
601 if (!content) return NULL;
603 elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
604 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
606 evas_object_event_callback_del
607 (content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
609 it->title_next_btn = NULL;
614 _item_title_icon_unset(Elm_Naviframe_Item *it)
616 Evas_Object *content = it->title_icon;
618 if (!content) return NULL;
620 elm_object_part_content_unset(VIEW(it), ICON_PART);
621 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
623 evas_object_event_callback_del
624 (content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
626 it->title_icon = NULL;
630 /* since we have each item as layout, we can't reusing the layout's
631 * aliasing, so let's do it ourselves */
633 _part_aliasing_eval(const char **part)
635 if (!*part || !strcmp("default", *part))
636 *part = CONTENT_PART;
637 else if (!strcmp(*part, "prev_btn"))
638 *part = PREV_BTN_PART;
639 else if (!strcmp(*part, "next_btn"))
640 *part = NEXT_BTN_PART;
641 else if (!strcmp(*part, "icon"))
646 _title_content_set(Elm_Naviframe_Item *it,
648 Evas_Object *content)
650 Elm_Naviframe_Content_Item_Pair *pair = NULL;
653 EINA_INLIST_FOREACH(it->content_list, pair)
654 if (!strcmp(part, pair->part)) break;
657 if (pair->content == content) return;
659 evas_object_event_callback_del(pair->content,
662 if (content) elm_object_part_content_set(VIEW(it), part, content);
666 if (!content) return;
668 //Remove the pair if new content was swallowed into other part.
669 EINA_INLIST_FOREACH(it->content_list, pair)
671 if (pair->content == content)
673 eina_stringshare_del(pair->part);
674 it->content_list = eina_inlist_remove(it->content_list,
675 EINA_INLIST_GET(pair));
676 evas_object_event_callback_del(pair->content,
685 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
688 ERR("Failed to allocate new content part of the item! : naviframe=%p",
693 eina_stringshare_replace(&pair->part, part);
694 it->content_list = eina_inlist_append(it->content_list,
695 EINA_INLIST_GET(pair));
696 elm_object_part_content_set(VIEW(it), part, content);
697 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
698 elm_object_signal_emit(VIEW(it), buf, "elm");
700 pair->content = content;
701 evas_object_event_callback_add(content,
707 if (_elm_config->access_mode)
708 _access_obj_process(it, EINA_TRUE);
712 _item_content_set_hook(Elm_Object_Item *it,
714 Evas_Object *content)
716 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
718 _part_aliasing_eval(&part);
721 if (!part || !strcmp(CONTENT_PART, part))
722 _item_content_set(nit, content);
723 else if (!strcmp(part, PREV_BTN_PART))
724 _item_title_prev_btn_set(nit, content);
725 else if (!strcmp(part, NEXT_BTN_PART))
726 _item_title_next_btn_set(nit, content);
727 else if (!strcmp(part, ICON_PART))
728 _item_title_icon_set(nit, content);
730 _title_content_set(nit, part, content);
732 elm_layout_sizing_eval(WIDGET(it));
736 _item_content_get_hook(const Elm_Object_Item *it,
739 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
741 _part_aliasing_eval(&part);
744 if (!part || !strcmp(CONTENT_PART, part))
746 else if (!strcmp(part, PREV_BTN_PART))
747 return nit->title_prev_btn;
748 else if (!strcmp(part, NEXT_BTN_PART))
749 return nit->title_next_btn;
750 else if (!strcmp(part, ICON_PART))
751 return nit->title_icon;
754 return elm_object_part_content_get(VIEW(nit), part);
758 _title_content_unset(Elm_Naviframe_Item *it, const char *part)
760 Elm_Naviframe_Content_Item_Pair *pair = NULL;
762 Evas_Object *content = NULL;
764 EINA_INLIST_FOREACH(it->content_list, pair)
766 if (!strcmp(part, pair->part))
768 content = pair->content;
769 eina_stringshare_del(pair->part);
770 it->content_list = eina_inlist_remove(it->content_list,
771 EINA_INLIST_GET(pair));
777 if (!content) return NULL;
779 elm_object_part_content_unset(VIEW(it), part);
780 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
781 elm_object_signal_emit(VIEW(it), buf, "elm");
782 evas_object_event_callback_del(content,
789 _item_content_unset_hook(Elm_Object_Item *it,
792 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
793 Evas_Object *o = NULL;
795 _part_aliasing_eval(&part);
798 if (!part || !strcmp(CONTENT_PART, part))
799 o = _item_content_unset(nit);
800 else if (!strcmp(part, PREV_BTN_PART))
801 o = _item_title_prev_btn_unset(nit);
802 else if (!strcmp(part, NEXT_BTN_PART))
803 o = _item_title_next_btn_unset(nit);
804 else if (!strcmp(part, ICON_PART))
805 o = _item_title_icon_unset(nit);
807 o = _title_content_unset(nit, part);
809 elm_layout_sizing_eval(WIDGET(it));
815 _item_signal_emit_hook(Elm_Object_Item *it,
816 const char *emission,
819 elm_object_signal_emit(VIEW(it), emission, source);
823 _elm_naviframe_smart_sizing_eval(Evas_Object *obj)
825 Evas_Coord minw = -1, minh = -1;
826 Elm_Naviframe_Item *it;
827 Evas_Coord x, y, w, h;
829 ELM_NAVIFRAME_DATA_GET(obj, sd);
831 if (sd->on_deletion) return;
833 evas_object_geometry_get(obj, &x, &y, &w, &h);
834 EINA_INLIST_FOREACH(sd->stack, it)
836 evas_object_move(VIEW(it), x, y);
837 evas_object_resize(VIEW(it), w, h);
838 edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
839 &it->minw, &it->minh);
840 if (it->minw > minw) minw = it->minw;
841 if (it->minh > minh) minh = it->minh;
844 evas_object_size_hint_min_set(obj, minw, minh);
845 evas_object_size_hint_max_set(obj, -1, -1);
849 _on_item_back_btn_clicked(void *data,
851 void *event_info __UNUSED__)
853 /* Since edje has the event queue, clicked event could be happend
854 multiple times on some heavy environment. This callback del will
855 prevent those scenario and guarantee only one clicked for it's own
857 evas_object_smart_callback_del(obj, SIG_CLICKED, _on_item_back_btn_clicked);
858 elm_naviframe_item_pop(data);
862 _back_btn_new(Evas_Object *obj, const char *title_label)
864 Evas_Object *btn, *ed;
867 btn = elm_button_add(obj);
869 if (!btn) return NULL;
870 evas_object_smart_callback_add
871 (btn, SIG_CLICKED, _on_item_back_btn_clicked, obj);
873 (buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
874 elm_object_style_set(btn, buf);
876 elm_layout_text_set(btn, NULL, title_label);
878 elm_object_domain_translatable_text_set(btn, PACKAGE, N_("Back"));
880 /* HACK NOTE: this explicit check only exists to avoid an ERR()
881 * message from elm_layout_content_set().
883 * The button was ALWAYS supposed to support an elm.swallow.content, but
884 * default naviframe/back_btn/default theme did not provide such, then
885 * old themes would emit such error message.
887 * Once we can break the theme API, remove this check and always
890 ed = elm_layout_edje_get(btn);
891 if (edje_object_part_exists(ed, CONTENT_PART))
893 Evas_Object *ico = elm_icon_add(btn);
894 elm_icon_standard_set(ico, "arrow_left");
895 elm_layout_content_set(btn, CONTENT_PART, ico);
902 _elm_naviframe_smart_signal_callback_add(Evas_Object *obj,
903 const char *emission,
905 Edje_Signal_Cb func_cb,
908 ELM_NAVIFRAME_DATA_GET(obj, sd);
911 if (!sd->stack) return;
913 _elm_naviframe_parent_sc->callback_add(obj, emission, source, func_cb, data);
915 it = elm_naviframe_top_item_get(obj);
916 if (!it) return EINA_FALSE;
918 elm_object_signal_callback_add(VIEW(it), emission, source, func_cb, data);
922 _elm_naviframe_smart_signal(Evas_Object *obj,
923 const char *emission,
926 ELM_NAVIFRAME_DATA_GET(obj, sd);
928 if (!sd->stack) return;
930 _elm_naviframe_parent_sc->signal(obj, emission, source);
933 /* content/text smart functions proxying things to the top item, which
934 * is the resize object of the layout */
936 _elm_naviframe_smart_text_set(Evas_Object *obj,
942 it = elm_naviframe_top_item_get(obj);
943 if (!it) return EINA_FALSE;
945 elm_object_item_part_text_set(it, part, label);
947 return !strcmp(elm_object_item_part_text_get(it, part), label);
951 _elm_naviframe_smart_text_get(const Evas_Object *obj,
954 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
956 if (!it) return NULL;
958 return elm_object_item_part_text_get(it, part);
961 /* we have to keep a "manual" set here because of the callbacks on the
964 _elm_naviframe_smart_content_set(Evas_Object *obj,
966 Evas_Object *content)
970 it = elm_naviframe_top_item_get(obj);
971 if (!it) return EINA_FALSE;
973 elm_object_item_part_content_set(it, part, content);
975 return content == elm_object_item_part_content_get(it, part);
979 _elm_naviframe_smart_content_get(const Evas_Object *obj,
982 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
984 if (!it) return NULL;
986 return elm_object_item_part_content_get(it, part);
990 _elm_naviframe_smart_content_unset(Evas_Object *obj,
993 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
995 if (!it) return NULL;
997 return elm_object_item_part_content_unset(it, part);
1001 _on_item_title_clicked(void *data,
1002 Evas_Object *obj __UNUSED__,
1003 const char *emission __UNUSED__,
1004 const char *source __UNUSED__)
1006 Elm_Naviframe_Item *it = data;
1008 evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_CLICKED, it);
1011 /* "elm,state,cur,pushed"
1014 _on_item_push_finished(void *data,
1015 Evas_Object *obj __UNUSED__,
1016 const char *emission __UNUSED__,
1017 const char *source __UNUSED__)
1019 Elm_Naviframe_Item *it = data;
1023 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1025 evas_object_hide(VIEW(it));
1027 elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
1029 if (sd->freeze_events)
1030 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1033 /* "elm,state,cur,popped"
1036 _on_item_pop_finished(void *data,
1037 Evas_Object *obj __UNUSED__,
1038 const char *emission __UNUSED__,
1039 const char *source __UNUSED__)
1041 Elm_Naviframe_Item *it = data;
1043 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1046 elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
1047 sd->popping = eina_list_remove(sd->popping, it);
1049 elm_widget_item_del(data);
1052 /* "elm,state,new,pushed",
1053 * "elm,state,prev,popped
1056 _on_item_show_finished(void *data,
1057 Evas_Object *obj __UNUSED__,
1058 const char *emission __UNUSED__,
1059 const char *source __UNUSED__)
1061 Elm_Naviframe_Item *it = data;
1062 unsigned int order = 0;
1063 Evas_Object *newest;
1065 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1067 elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
1069 elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
1071 newest = elm_widget_newest_focus_order_get(VIEW(it), &order, EINA_TRUE);
1073 elm_object_focus_set(newest, EINA_TRUE);
1075 elm_object_focus_set(VIEW(it), EINA_TRUE);
1077 if (sd->freeze_events)
1078 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1080 evas_object_smart_callback_call(WIDGET(it), SIG_TRANSITION_FINISHED, data);
1084 _on_item_size_hints_changed(void *data,
1086 Evas_Object *obj __UNUSED__,
1087 void *event_info __UNUSED__)
1089 elm_layout_sizing_eval(data);
1093 _item_dispmode_set(Elm_Naviframe_Item *it, Evas_Display_Mode dispmode)
1095 if (it->dispmode == dispmode) return;
1098 case EVAS_DISPLAY_MODE_COMPRESS:
1099 elm_object_signal_emit(VIEW(it), "display,mode,compress", "");
1102 elm_object_signal_emit(VIEW(it), "display,mode,default", "");
1105 it->dispmode = dispmode;
1108 static Elm_Naviframe_Item *
1109 _item_new(Evas_Object *obj,
1110 const Elm_Naviframe_Item *prev_it,
1111 const char *title_label,
1112 Evas_Object *prev_btn,
1113 Evas_Object *next_btn,
1114 Evas_Object *content,
1115 const char *item_style)
1117 Elm_Naviframe_Item *it;
1119 ELM_NAVIFRAME_DATA_GET(obj, sd);
1121 it = elm_widget_item_new(obj, Elm_Naviframe_Item);
1124 ERR("Failed to allocate new item! : naviframe=%p", obj);
1128 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
1129 elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
1130 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
1131 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
1132 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
1133 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
1134 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
1137 VIEW(it) = elm_layout_add(obj);
1138 evas_object_smart_member_add(VIEW(it), obj);
1140 evas_object_event_callback_add
1141 (VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1142 _on_item_size_hints_changed, obj);
1144 elm_object_signal_callback_add
1145 (VIEW(it), "elm,action,show,finished", "", _on_item_show_finished, it);
1146 elm_object_signal_callback_add
1147 (VIEW(it), "elm,action,pushed,finished", "", _on_item_push_finished, it);
1148 elm_object_signal_callback_add
1149 (VIEW(it), "elm,action,popped,finished", "", _on_item_pop_finished, it);
1150 elm_object_signal_callback_add
1151 (VIEW(it), "elm,action,title,clicked", "", _on_item_title_clicked, it);
1153 _item_style_set(it, item_style);
1156 _item_text_set_hook((Elm_Object_Item *)it, TITLE_PART, title_label);
1159 if ((!prev_btn) && sd->auto_pushed && prev_it)
1161 const char *prev_title = prev_it->title_label;
1162 prev_btn = _back_btn_new(obj, prev_title);
1167 _item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
1169 if (!elm_layout_text_get(prev_btn, NULL))
1170 _elm_access_text_set
1171 (_elm_access_object_get(prev_btn), ELM_ACCESS_INFO, E_("Back"));
1176 _item_content_set_hook((Elm_Object_Item *)it, NEXT_BTN_PART, next_btn);
1178 if (!elm_layout_text_get(next_btn, NULL))
1179 _elm_access_text_set
1180 (_elm_access_object_get(next_btn), ELM_ACCESS_INFO, E_("Next"));
1183 _item_content_set(it, content);
1184 _item_dispmode_set(it, sd->dispmode);
1186 it->title_visible = EINA_TRUE;
1192 _on_obj_size_hints_changed(void *data __UNUSED__, Evas *e __UNUSED__,
1193 Evas_Object *obj, void *event_info __UNUSED__)
1195 Elm_Naviframe_Item *it;
1196 Evas_Display_Mode dispmode;
1198 ELM_NAVIFRAME_DATA_GET(obj, sd);
1200 dispmode = evas_object_size_hint_display_mode_get(obj);
1201 if (sd->dispmode == dispmode) return;
1203 sd->dispmode = dispmode;
1205 EINA_INLIST_FOREACH(sd->stack, it)
1206 _item_dispmode_set(it, dispmode);
1210 _elm_naviframe_smart_focus_next(const Evas_Object *obj,
1211 Elm_Focus_Direction dir,
1216 Eina_List *l = NULL;
1217 Elm_Naviframe_Item *top_it;
1218 void *(*list_data_get)(const Eina_List *list);
1220 top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1221 if (!top_it) return EINA_FALSE;
1223 list_data_get = eina_list_data_get;
1225 l = eina_list_append(l, VIEW(top_it));
1228 if (_elm_config->access_mode)
1230 ao = _access_object_get(top_it, TITLE_ACCESS_PART);
1231 if (ao) l = eina_list_append(l, ao);
1234 ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
1241 _elm_naviframe_smart_focus_direction(const Evas_Object *obj,
1242 const Evas_Object *base,
1244 Evas_Object **direction,
1248 Eina_List *l = NULL;
1249 Elm_Naviframe_Item *top_it;
1250 void *(*list_data_get)(const Eina_List *list);
1252 top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1253 if (!top_it) return EINA_FALSE;
1255 list_data_get = eina_list_data_get;
1257 l = eina_list_append(l, VIEW(top_it));
1258 ret = elm_widget_focus_list_direction_get
1259 (obj, base, l, list_data_get, degree, direction, weight);
1266 _elm_naviframe_smart_add(Evas_Object *obj)
1268 EVAS_SMART_DATA_ALLOC(obj, Elm_Naviframe_Smart_Data);
1270 ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->base.add(obj);
1272 priv->dummy_edje = ELM_WIDGET_DATA(priv)->resize_obj;
1273 priv->auto_pushed = EINA_TRUE;
1274 priv->freeze_events = EINA_TRUE;
1276 evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1277 _on_obj_size_hints_changed, obj);
1278 elm_widget_can_focus_set(obj, EINA_TRUE);
1282 _pop_transition_cb(void *data)
1284 Elm_Naviframe_Item *prev_it, *it;
1285 it = (Elm_Naviframe_Item *)data;
1287 it->animator = NULL;
1289 prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(WIDGET(it));
1292 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred",
1294 //FIXME: Remove the below line once edje_object_message_signal_process is fixed.
1295 //This API crashes when in the midst of this API processing if edje object passed here is deleted.
1296 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1298 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm");
1300 //FIXME: Remove the below line once edje_object_message_signal_process is fixed.
1301 //This API crashes when in the midst of this API processing if edje object passed here is deleted.
1302 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1304 return ECORE_CALLBACK_CANCEL;
1308 _elm_naviframe_smart_del(Evas_Object *obj)
1310 Elm_Naviframe_Item *it;
1312 ELM_NAVIFRAME_DATA_GET(obj, sd);
1314 sd->on_deletion = EINA_TRUE;
1318 it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item);
1319 elm_widget_item_del(it);
1322 //All popping items which are not called yet by animator.
1323 EINA_LIST_FREE(sd->popping, it)
1325 if (it->animator) ecore_animator_del(it->animator);
1326 elm_widget_item_del(it);
1328 eina_list_free(sd->popping);
1330 evas_object_del(sd->dummy_edje);
1332 ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->base.del(obj);
1336 _elm_naviframe_smart_access(Evas_Object *obj, Eina_Bool is_access)
1338 Elm_Naviframe_Item *it;
1340 ELM_NAVIFRAME_CHECK(obj);
1341 ELM_NAVIFRAME_DATA_GET(obj, sd);
1343 EINA_INLIST_FOREACH(sd->stack, it)
1344 _access_obj_process(it, is_access);
1348 _elm_naviframe_smart_event(Evas_Object *obj,
1349 Evas_Object *src __UNUSED__,
1350 Evas_Callback_Type type,
1353 Elm_Naviframe_Item *it;
1354 Evas_Event_Key_Down *ev = event_info;
1356 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
1357 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1358 if (strcmp(ev->keyname, "BackSpace")) return EINA_FALSE;
1360 it = elm_naviframe_top_item_get(obj);
1361 if (!it) return EINA_FALSE;
1363 if (it->title_prev_btn)
1364 evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
1366 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1372 _elm_naviframe_smart_set_user(Elm_Naviframe_Smart_Class *sc)
1374 ELM_WIDGET_CLASS(sc)->base.add = _elm_naviframe_smart_add;
1375 ELM_WIDGET_CLASS(sc)->base.del = _elm_naviframe_smart_del;
1377 ELM_WIDGET_CLASS(sc)->theme = _elm_naviframe_smart_theme;
1378 ELM_WIDGET_CLASS(sc)->focus_next = _elm_naviframe_smart_focus_next;
1379 ELM_WIDGET_CLASS(sc)->focus_direction = _elm_naviframe_smart_focus_direction;
1380 ELM_WIDGET_CLASS(sc)->access = _elm_naviframe_smart_access;
1381 ELM_WIDGET_CLASS(sc)->event = _elm_naviframe_smart_event;
1383 ELM_CONTAINER_CLASS(sc)->content_set = _elm_naviframe_smart_content_set;
1384 ELM_CONTAINER_CLASS(sc)->content_get = _elm_naviframe_smart_content_get;
1385 ELM_CONTAINER_CLASS(sc)->content_unset = _elm_naviframe_smart_content_unset;
1387 ELM_LAYOUT_CLASS(sc)->signal = _elm_naviframe_smart_signal;
1388 ELM_LAYOUT_CLASS(sc)->callback_add = _elm_naviframe_smart_signal_callback_add;
1389 ELM_LAYOUT_CLASS(sc)->text_set = _elm_naviframe_smart_text_set;
1390 ELM_LAYOUT_CLASS(sc)->text_get = _elm_naviframe_smart_text_get;
1391 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_naviframe_smart_sizing_eval;
1395 _push_transition_cb(void *data)
1397 Elm_Naviframe_Item *prev_it, *it = data;
1399 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1401 it->animator = NULL;
1403 if (sd->stack->last->prev)
1405 prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last->prev,
1406 Elm_Naviframe_Item);
1407 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
1409 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1411 elm_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
1412 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1414 return ECORE_CALLBACK_CANCEL;
1417 EAPI const Elm_Naviframe_Smart_Class *
1418 elm_naviframe_smart_class_get(void)
1420 static Elm_Naviframe_Smart_Class _sc =
1421 ELM_NAVIFRAME_SMART_CLASS_INIT_NAME_VERSION
1422 (ELM_NAVIFRAME_SMART_NAME);
1423 static const Elm_Naviframe_Smart_Class *class = NULL;
1424 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
1429 _elm_naviframe_smart_set(&_sc);
1430 esc->callbacks = _smart_callbacks;
1437 elm_naviframe_add(Evas_Object *parent)
1441 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1443 obj = elm_widget_add(_elm_naviframe_smart_class_new(), parent);
1444 if (!obj) return NULL;
1446 if (!elm_widget_sub_object_add(parent, obj))
1447 ERR("could not add %p as sub object of %p", obj, parent);
1449 _elm_widget_orient_signal_emit(obj);
1454 EAPI Elm_Object_Item *
1455 elm_naviframe_item_push(Evas_Object *obj,
1456 const char *title_label,
1457 Evas_Object *prev_btn,
1458 Evas_Object *next_btn,
1459 Evas_Object *content,
1460 const char *item_style)
1462 Elm_Naviframe_Item *prev_it, *it;
1464 ELM_NAVIFRAME_CHECK(obj) NULL;
1466 ELM_NAVIFRAME_DATA_GET(obj, sd);
1468 prev_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1469 it = _item_new(obj, prev_it,
1470 title_label, prev_btn, next_btn, content, item_style);
1471 if (!it) return NULL;
1473 evas_object_show(VIEW(it));
1474 elm_widget_resize_object_set(obj, VIEW(it));
1476 elm_widget_sub_object_add(obj, VIEW(prev_it));
1477 evas_object_smart_member_add(sd->dummy_edje, obj);
1481 /* re-add as smart member */
1482 evas_object_smart_member_add(VIEW(prev_it), obj);
1484 if (sd->freeze_events)
1486 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1487 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1490 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
1491 elm_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
1492 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1493 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1495 prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
1496 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE);
1498 it->animator = ecore_animator_add(_push_transition_cb, it);
1501 elm_object_focus_set(VIEW(it), EINA_TRUE);
1503 sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it));
1504 evas_object_raise(VIEW(it));
1507 if (_elm_config->access_mode) _access_focus_set(it);
1509 elm_layout_sizing_eval(obj);
1511 return (Elm_Object_Item *)it;
1514 EAPI Elm_Object_Item *
1515 elm_naviframe_item_insert_before(Evas_Object *obj,
1516 Elm_Object_Item *before,
1517 const char *title_label,
1518 Evas_Object *prev_btn,
1519 Evas_Object *next_btn,
1520 Evas_Object *content,
1521 const char *item_style)
1523 Elm_Naviframe_Item *it, *prev_it = NULL;
1525 ELM_NAVIFRAME_CHECK(obj) NULL;
1526 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
1527 ELM_NAVIFRAME_DATA_GET(obj, sd);
1529 it = (Elm_Naviframe_Item *)before;
1530 if (EINA_INLIST_GET(it)->prev)
1531 prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
1532 Elm_Naviframe_Item);
1533 it = _item_new(obj, prev_it,
1534 title_label, prev_btn, next_btn, content, item_style);
1535 if (!it) return NULL;
1537 sd->stack = eina_inlist_prepend_relative
1538 (sd->stack, EINA_INLIST_GET(it),
1539 EINA_INLIST_GET(((Elm_Naviframe_Item *)before)));
1541 elm_layout_sizing_eval(obj);
1543 return (Elm_Object_Item *)it;
1546 EAPI Elm_Object_Item *
1547 elm_naviframe_item_insert_after(Evas_Object *obj,
1548 Elm_Object_Item *after,
1549 const char *title_label,
1550 Evas_Object *prev_btn,
1551 Evas_Object *next_btn,
1552 Evas_Object *content,
1553 const char *item_style)
1555 Elm_Naviframe_Item *it;
1556 Eina_Bool top_inserted = EINA_FALSE;
1558 ELM_NAVIFRAME_CHECK(obj) NULL;
1559 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
1560 ELM_NAVIFRAME_DATA_GET(obj, sd);
1562 it = _item_new(obj, (Elm_Naviframe_Item *)after,
1563 title_label, prev_btn, next_btn, content, item_style);
1564 if (!it) return NULL;
1566 if (elm_naviframe_top_item_get(obj) == after) top_inserted = EINA_TRUE;
1568 sd->stack = eina_inlist_append_relative
1569 (sd->stack, EINA_INLIST_GET(it),
1570 EINA_INLIST_GET(((Elm_Naviframe_Item *)after)));
1574 elm_widget_resize_object_set(obj, VIEW(it));
1575 elm_widget_sub_object_add(obj, VIEW(after));
1576 evas_object_smart_member_add(sd->dummy_edje, obj);
1577 evas_object_show(VIEW(it));
1578 evas_object_hide(VIEW(after));
1579 elm_object_focus_set(VIEW(it), EINA_TRUE);
1583 if (_elm_config->access_mode) _access_focus_set(it);
1585 elm_layout_sizing_eval(obj);
1587 return (Elm_Object_Item *)it;
1591 elm_naviframe_item_pop(Evas_Object *obj)
1593 Elm_Naviframe_Item *it, *prev_it = NULL;
1594 Evas_Object *content = NULL;
1596 ELM_NAVIFRAME_CHECK(obj) NULL;
1597 ELM_NAVIFRAME_DATA_GET(obj, sd);
1599 it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1600 if (!it) return NULL;
1602 if (it->pop_cb) it->pop_cb(it->pop_data, (Elm_Object_Item *)it);
1605 content = it->content;
1607 evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
1609 it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(it));
1610 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1612 if (sd->stack->last->prev)
1613 prev_it = EINA_INLIST_CONTAINER_GET
1614 (sd->stack->last->prev, Elm_Naviframe_Item);
1616 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
1617 if (!sd->stack) elm_widget_resize_object_set(obj, sd->dummy_edje);
1621 if (sd->freeze_events)
1623 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1624 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1627 elm_widget_resize_object_set(obj, VIEW(prev_it));
1628 evas_object_smart_member_add(sd->dummy_edje, obj);
1629 evas_object_raise(VIEW(prev_it));
1632 if (_elm_config->access_mode) _access_focus_set(prev_it);
1634 /* these 2 signals MUST take place simultaneously */
1635 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1636 evas_object_show(VIEW(prev_it));
1637 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
1639 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1640 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1642 if (it->animator) ecore_animator_del(it->animator);
1643 it->animator = ecore_animator_add(_pop_transition_cb, it);
1644 sd->popping = eina_list_append(sd->popping, it);
1647 elm_widget_item_del(it);
1653 elm_naviframe_item_pop_to(Elm_Object_Item *it)
1655 Elm_Naviframe_Item *nit;
1656 Eina_Inlist *l, *prev_l;
1658 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1660 nit = (Elm_Naviframe_Item *)it;
1661 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
1663 if (it == elm_naviframe_top_item_get(WIDGET(nit))) return;
1665 l = sd->stack->last->prev;
1667 sd->on_deletion = EINA_TRUE;
1671 Elm_Naviframe_Item *iit = EINA_INLIST_CONTAINER_GET
1672 (l, Elm_Naviframe_Item);
1674 if (iit == nit) break;
1677 sd->stack = eina_inlist_remove(sd->stack, l);
1679 elm_widget_item_del(iit);
1684 sd->on_deletion = EINA_FALSE;
1686 elm_naviframe_item_pop(WIDGET(nit));
1690 elm_naviframe_item_promote(Elm_Object_Item *it)
1692 Elm_Object_Item *prev_top;
1693 Elm_Naviframe_Item *nit;
1694 Elm_Naviframe_Item *prev_it;
1696 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1698 nit = (Elm_Naviframe_Item *)it;
1699 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
1701 prev_top = elm_naviframe_top_item_get(WIDGET(nit));
1702 if (it == prev_top) return;
1704 /* remember, last is 1st on the naviframe, push it to last pos. */
1705 sd->stack = eina_inlist_demote(sd->stack, EINA_INLIST_GET(nit));
1707 elm_widget_resize_object_set(WIDGET(it), VIEW(nit));
1708 elm_widget_sub_object_add(WIDGET(it), VIEW(prev_top));
1709 evas_object_smart_member_add(sd->dummy_edje, WIDGET(it));
1711 /* this was the previous top one */
1712 prev_it = EINA_INLIST_CONTAINER_GET
1713 (sd->stack->last->prev, Elm_Naviframe_Item);
1715 /* re-add as smart member */
1716 evas_object_smart_member_add(VIEW(prev_it), WIDGET(it));
1718 prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
1719 elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
1721 if (sd->freeze_events)
1723 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1724 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1727 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
1729 evas_object_show(VIEW(nit));
1730 evas_object_raise(VIEW(nit));
1732 elm_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
1734 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1735 edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
1736 if (nit->animator) ecore_animator_del(nit->animator);
1737 nit->animator = ecore_animator_add(_push_transition_cb, nit);
1740 if (_elm_config->access_mode) _access_focus_set(nit);
1744 elm_naviframe_item_simple_promote(Evas_Object *obj,
1745 Evas_Object *content)
1747 Elm_Naviframe_Item *itr;
1749 ELM_NAVIFRAME_CHECK(obj);
1750 ELM_NAVIFRAME_DATA_GET(obj, sd);
1752 EINA_INLIST_FOREACH(sd->stack, itr)
1754 if (elm_object_item_content_get((Elm_Object_Item *)itr) == content)
1756 elm_naviframe_item_promote((Elm_Object_Item *)itr);
1763 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj,
1766 ELM_NAVIFRAME_CHECK(obj);
1767 ELM_NAVIFRAME_DATA_GET(obj, sd);
1769 sd->preserve = !!preserve;
1773 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
1775 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1776 ELM_NAVIFRAME_DATA_GET(obj, sd);
1778 return sd->preserve;
1781 EAPI Elm_Object_Item *
1782 elm_naviframe_top_item_get(const Evas_Object *obj)
1784 ELM_NAVIFRAME_CHECK(obj) NULL;
1785 ELM_NAVIFRAME_DATA_GET(obj, sd);
1787 if (!sd->stack) return NULL;
1788 return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
1789 (sd->stack->last, Elm_Naviframe_Item));
1792 EAPI Elm_Object_Item *
1793 elm_naviframe_bottom_item_get(const Evas_Object *obj)
1795 ELM_NAVIFRAME_CHECK(obj) NULL;
1796 ELM_NAVIFRAME_DATA_GET(obj, sd);
1798 if (!sd->stack) return NULL;
1799 return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
1800 (sd->stack, Elm_Naviframe_Item));
1804 elm_naviframe_item_style_set(Elm_Object_Item *it,
1805 const char *item_style)
1807 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1809 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1811 if (item_style && !strcmp(item_style, nit->style)) return;
1814 if (!strcmp("basic", nit->style)) return;
1816 _item_style_set(nit, item_style);
1817 _item_signals_emit(nit);
1818 _item_title_visible_update(nit);
1822 elm_naviframe_item_style_get(const Elm_Object_Item *it)
1824 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1826 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, NULL);
1832 elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
1835 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1837 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1839 visible = !!visible;
1840 if (nit->title_visible == visible) return;
1842 nit->title_visible = visible;
1843 _item_title_visible_update(nit);
1847 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
1849 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1851 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
1853 return nit->title_visible;
1857 elm_naviframe_item_pop_cb_set(Elm_Object_Item *it, Elm_Naviframe_Item_Pop_Cb func, void *data)
1859 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1861 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1864 nit->pop_data = data;
1868 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj,
1869 Eina_Bool auto_pushed)
1871 ELM_NAVIFRAME_CHECK(obj);
1872 ELM_NAVIFRAME_DATA_GET(obj, sd);
1874 sd->auto_pushed = !!auto_pushed;
1878 elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
1880 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1881 ELM_NAVIFRAME_DATA_GET(obj, sd);
1883 return sd->auto_pushed;
1887 elm_naviframe_items_get(const Evas_Object *obj)
1889 Eina_List *ret = NULL;
1890 Elm_Naviframe_Item *itr;
1892 ELM_NAVIFRAME_CHECK(obj) NULL;
1893 ELM_NAVIFRAME_DATA_GET(obj, sd);
1895 EINA_INLIST_FOREACH(sd->stack, itr)
1896 ret = eina_list_append(ret, itr);
1902 elm_naviframe_event_enabled_set(Evas_Object *obj,
1905 ELM_NAVIFRAME_CHECK(obj);
1906 ELM_NAVIFRAME_DATA_GET(obj, sd);
1908 enabled = !!enabled;
1909 if (sd->freeze_events == !enabled) return;
1910 sd->freeze_events = !enabled;
1914 elm_naviframe_event_enabled_get(const Evas_Object *obj)
1916 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1917 ELM_NAVIFRAME_DATA_GET(obj, sd);
1919 return !sd->freeze_events;