1 #include <Elementary.h>
4 typedef struct _Widget_Data Widget_Data;
5 typedef struct _Elm_Naviframe_Item Elm_Naviframe_Item;
6 typedef struct _Elm_Naviframe_Content_Item_Pair Elm_Naviframe_Content_Item_Pair;
7 typedef struct _Elm_Naviframe_Text_Item_Pair Elm_Naviframe_Text_Item_Pair;
13 Eina_Bool preserve: 1;
14 Eina_Bool auto_pushed: 1;
15 Eina_Bool freeze_events: 1;
18 struct _Elm_Naviframe_Content_Item_Pair
23 Elm_Naviframe_Item *it;
26 struct _Elm_Naviframe_Text_Item_Pair
33 struct _Elm_Naviframe_Item
37 Eina_Inlist *content_list;
38 Eina_Inlist *text_list;
40 Evas_Object *title_prev_btn;
41 Evas_Object *title_next_btn;
43 Eina_Bool back_btn: 1;
44 Eina_Bool title_visible: 1;
47 static const char *widtype = NULL;
49 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
50 static const char SIG_PUSH_FINISHED[] = "push,finished";
51 static const char SIG_POP_FINISHED[] = "pop,finished";
52 static const char SIG_TITLE_CLICKED[] = "title,clicked";
54 static const Evas_Smart_Cb_Description _signals[] = {
55 {SIG_TRANSITION_FINISHED, ""},
56 {SIG_TITLE_CLICKED, ""},
60 static void _del_hook(Evas_Object *obj);
61 static void _theme_hook(Evas_Object *obj);
62 static void _emit_hook(Evas_Object *obj,
65 static void _disable_hook(Evas_Object *obj);
66 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
67 static void _item_text_set_hook(Elm_Object_Item *it,
70 static const char *_item_text_get_hook(const Elm_Object_Item *it,
72 static void _item_content_set_hook(Elm_Object_Item *it,
74 Evas_Object *content);
75 static Evas_Object *_item_content_get_hook(const Elm_Object_Item *it,
77 static Evas_Object *_item_content_unset_hook(Elm_Object_Item *it,
79 static void _item_signal_emit_hook(Elm_Object_Item *it,
82 static void _item_title_visible_update(Elm_Naviframe_Item *navi_it);
83 static void _sizing_eval(Evas_Object *obj);
84 static void _item_sizing_eval(Elm_Naviframe_Item *it);
85 static void _move(void *data, Evas *e, Evas_Object *obj, void *event_info);
86 static void _resize(void *data,
90 static void _title_clicked(void *data, Evas_Object *obj,
93 static void _back_btn_clicked(void *data,
96 static Evas_Object *_back_btn_new(Evas_Object *obj);
97 static void _item_content_del(void *data,
101 static void _title_content_del(void *data,
105 static void _title_prev_btn_del(void *data,
109 static void _title_next_btn_del(void *data,
113 static void _title_content_set(Elm_Naviframe_Item *it,
114 Elm_Naviframe_Content_Item_Pair *pair,
116 Evas_Object *content);
117 static void _title_prev_btn_set(Elm_Naviframe_Item *it,
120 static void _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn);
121 static void _item_del(Elm_Naviframe_Item *it);
122 static void _pushed_finished(void *data,
124 const char *emission,
126 static void _popped_finished(void *data,
128 const char *emission,
130 static void _show_finished(void *data,
132 const char *emission,
134 static void _item_content_set(Elm_Naviframe_Item *navi_it,
135 Evas_Object *content);
136 static void _item_style_set(Elm_Naviframe_Item *navi_it,
137 const char *item_style);
140 _del_hook(Evas_Object *obj)
143 Elm_Naviframe_Item *it;
145 wd = elm_widget_data_get(obj);
150 while (wd->stack->last)
152 it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
154 wd->stack = eina_inlist_remove(wd->stack, wd->stack->last);
156 if (!wd->stack) break;
163 _theme_hook(Evas_Object *obj)
166 Elm_Naviframe_Item *it;
168 wd = elm_widget_data_get(obj);
171 _elm_theme_object_set(obj,
175 elm_widget_style_get(obj));
177 EINA_INLIST_FOREACH(wd->stack, it)
179 _item_style_set(it, it->style);
180 _item_title_visible_update(it);
183 _elm_widget_mirrored_reload(obj);
184 _mirrored_set(obj, elm_widget_mirrored_get(obj));
187 static void _emit_hook(Evas_Object *obj,
188 const char *emission,
191 ELM_CHECK_WIDTYPE(obj, widtype);
193 Widget_Data *wd = elm_widget_data_get(obj);
196 edje_object_signal_emit(wd->base, emission, source);
200 _disable_hook(Evas_Object *obj __UNUSED__)
206 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
209 Elm_Naviframe_Item *it;
211 wd = elm_widget_data_get(obj);
214 EINA_INLIST_FOREACH(wd->stack, it)
215 edje_object_mirrored_set(VIEW(it), rtl);
216 edje_object_mirrored_set(wd->base, rtl);
220 _item_text_set_hook(Elm_Object_Item *it,
224 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
226 Elm_Naviframe_Text_Item_Pair *pair = NULL;
227 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
231 snprintf(buf, sizeof(buf), "elm.text.title");
233 snprintf(buf, sizeof(buf), "%s", part);
235 EINA_INLIST_FOREACH(navi_it->text_list, pair)
236 if (!strcmp(buf, pair->part)) break;
240 pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
243 ERR("Failed to allocate new text part of the item! : naviframe=%p",
247 eina_stringshare_replace(&pair->part, buf);
248 navi_it->text_list = eina_inlist_append(navi_it->text_list,
249 EINA_INLIST_GET(pair));
252 eina_stringshare_replace(&pair->text, label);
253 edje_object_part_text_set(VIEW(navi_it), buf, label);
257 snprintf(buf, sizeof(buf), "elm,state,%s,show", buf);
258 edje_object_signal_emit(VIEW(navi_it), buf, "elm");
262 snprintf(buf, sizeof(buf), "elm,state,%s,hide", buf);
263 edje_object_signal_emit(VIEW(navi_it), buf, "elm");
266 _item_sizing_eval(navi_it);
270 _item_text_get_hook(const Elm_Object_Item *it, const char *part)
272 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
273 Elm_Naviframe_Text_Item_Pair *pair = NULL;
274 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
278 snprintf(buf, sizeof(buf), "elm.text.title");
280 snprintf(buf, sizeof(buf), "%s", part);
282 EINA_INLIST_FOREACH(navi_it->text_list, pair)
284 if (!strcmp(buf, pair->part))
291 _item_content_set_hook(Elm_Object_Item *it,
293 Evas_Object *content)
295 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
297 Elm_Naviframe_Content_Item_Pair *pair = NULL;
298 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
301 if ((!part) || (!strcmp(part, "elm.swallow.content")))
303 _item_content_set(navi_it, content);
306 else if (!strcmp(part, "elm.swallow.prev_btn"))
308 _title_prev_btn_set(navi_it, content, EINA_FALSE);
311 else if(!strcmp(part, "elm.swallow.next_btn"))
313 _title_next_btn_set(navi_it, content);
318 _title_content_set(navi_it, pair, part, content);
322 _item_content_get_hook(const Elm_Object_Item *it, const char *part)
324 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
325 Elm_Naviframe_Content_Item_Pair *pair = NULL;
326 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
329 if ((!part) || (!strcmp(part, "elm.swallow.content")))
330 return navi_it->content;
331 else if (!strcmp(part, "elm.swallow.prev_btn"))
332 return navi_it->title_prev_btn;
333 else if(!strcmp(part, "elm.swallow.next_btn"))
334 return navi_it->title_next_btn;
337 EINA_INLIST_FOREACH(navi_it->content_list, pair)
339 if (!strcmp(part, pair->part))
340 return pair->content;
346 _item_content_unset_hook(Elm_Object_Item *it, const char *part)
348 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
349 Elm_Naviframe_Content_Item_Pair *pair = NULL;
350 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
351 Evas_Object *content = NULL;
355 //FIXME: could be unset the below specified contents also.
357 !strcmp(part, "elm.swallow.content") ||
358 !strcmp(part, "elm.swallow.prev_btn") ||
359 !strcmp(part, "elm.swallow.next_btn"))
361 WRN("You can not unset the content! : naviframe=%p",
367 EINA_INLIST_FOREACH(navi_it->content_list, pair)
369 if (!strcmp(part, pair->part))
371 content = pair->content;
372 eina_stringshare_del(pair->part);
373 navi_it->content_list = eina_inlist_remove(navi_it->content_list,
374 EINA_INLIST_GET(pair));
380 if (!content) return NULL;
382 elm_widget_sub_object_del(WIDGET(navi_it), content);
383 edje_object_part_unswallow(VIEW(navi_it), content);
384 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
385 edje_object_signal_emit(VIEW(navi_it), buf, "elm");
386 evas_object_event_callback_del(content,
389 _item_sizing_eval(navi_it);
395 _item_signal_emit_hook(Elm_Object_Item *it,
396 const char *emission,
399 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
400 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
401 edje_object_signal_emit(VIEW(navi_it), emission, source);
405 _item_title_visible_update(Elm_Naviframe_Item *navi_it)
407 if (navi_it->title_visible)
408 edje_object_signal_emit(VIEW(navi_it), "elm,state,title,show", "elm");
410 edje_object_signal_emit(VIEW(navi_it), "elm,state,title,hide", "elm");
414 _sizing_eval(Evas_Object *obj)
417 Elm_Naviframe_Item *it;
418 wd = elm_widget_data_get(obj);
421 EINA_INLIST_FOREACH(wd->stack, it)
422 _item_sizing_eval(it);
426 _item_sizing_eval(Elm_Naviframe_Item *it)
429 Evas_Coord x, y, w, h;
432 wd = elm_widget_data_get(WIDGET(it));
435 evas_object_geometry_get(WIDGET(it), &x, &y, &w, &h);
436 evas_object_move(VIEW(it), x, y);
437 evas_object_resize(VIEW(it), w, h);
441 _move(void *data __UNUSED__,
444 void *event_info __UNUSED__)
450 _resize(void *data __UNUSED__,
453 void *event_info __UNUSED__)
459 _title_clicked(void *data,
460 Evas_Object *obj __UNUSED__,
461 const char *emission __UNUSED__,
462 const char *source __UNUSED__)
464 Elm_Naviframe_Item *it = data;
465 evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_CLICKED, it);
469 _back_btn_clicked(void *data,
471 void *event_info __UNUSED__)
473 /* Since edje has the event queue, clicked event could be happend multiple times
474 on some heavy environment. This callback del will prevent those scenario and
475 guarantee only one clicked for it's own page. */
476 evas_object_smart_callback_del(obj, "clicked", _back_btn_clicked);
477 elm_naviframe_item_pop(data);
481 _back_btn_new(Evas_Object *obj)
485 btn = elm_button_add(obj);
486 if (!btn) return NULL;
487 evas_object_smart_callback_add(btn, "clicked", _back_btn_clicked, obj);
488 snprintf(buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
489 elm_object_style_set(btn, buf);
494 _title_content_del(void *data,
496 Evas_Object *obj __UNUSED__,
497 void *event_info __UNUSED__)
500 Elm_Naviframe_Content_Item_Pair *pair = data;
501 Elm_Naviframe_Item *it = pair->it;
502 snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
503 edje_object_signal_emit(VIEW(it), buf, "elm");
504 it->content_list = eina_inlist_remove(it->content_list,
505 EINA_INLIST_GET(pair));
506 eina_stringshare_del(pair->part);
511 _title_prev_btn_del(void *data,
513 Evas_Object *obj __UNUSED__,
514 void *event_info __UNUSED__)
516 Elm_Naviframe_Item *it = data;
517 it->back_btn = EINA_FALSE;
518 it->title_prev_btn = NULL;
519 edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
523 _title_next_btn_del(void *data,
525 Evas_Object *obj __UNUSED__,
526 void *event_info __UNUSED__)
528 Elm_Naviframe_Item *it = data;
529 it->title_next_btn = NULL;
530 edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
534 _item_content_del(void *data,
536 Evas_Object *obj __UNUSED__,
537 void *event_info __UNUSED__)
539 Elm_Naviframe_Item *it = data;
541 edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
545 _title_content_set(Elm_Naviframe_Item *it,
546 Elm_Naviframe_Content_Item_Pair *pair,
548 Evas_Object *content)
552 EINA_INLIST_FOREACH(it->content_list, pair)
553 if (!strcmp(part, pair->part)) break;
557 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
560 ERR("Failed to allocate new content part of the item! : naviframe=%p", WIDGET(it));
564 eina_stringshare_replace(&pair->part, part);
565 it->content_list = eina_inlist_append(it->content_list,
566 EINA_INLIST_GET(pair));
569 if (pair->content == content) return;
573 evas_object_event_callback_del(pair->content,
576 evas_object_del(pair->content);
580 elm_widget_sub_object_add(WIDGET(it), content);
581 evas_object_event_callback_add(content,
585 edje_object_part_swallow(it->base.view, part, content);
586 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
587 edje_object_signal_emit(it->base.view, buf, "elm");
588 pair->content = content;
589 _item_sizing_eval(it);
593 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
594 edje_object_signal_emit(it->base.view, buf, "elm");
595 pair->content = NULL;
600 _title_prev_btn_set(Elm_Naviframe_Item *it,
604 if (it->title_prev_btn == btn) return;
606 if (it->title_prev_btn)
607 evas_object_del(it->title_prev_btn);
609 it->title_prev_btn = btn;
613 edje_object_signal_emit(VIEW(it),
614 "elm,state,prev_btn,hide",
619 elm_widget_sub_object_add(WIDGET(it), btn);
620 evas_object_event_callback_add(btn,
624 edje_object_part_swallow(VIEW(it), "elm.swallow.prev_btn", btn);
625 edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
626 it->back_btn = back_btn;
628 _item_sizing_eval(it);
632 _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn)
634 if (it->title_next_btn == btn) return;
636 if (it->title_next_btn)
637 evas_object_del(it->title_next_btn);
639 it->title_next_btn = btn;
643 edje_object_signal_emit(VIEW(it),
644 "elm,state,next_btn,hide",
649 elm_widget_sub_object_add(WIDGET(it), btn);
650 evas_object_event_callback_add(btn,
654 edje_object_part_swallow(VIEW(it), "elm.swallow.next_btn", btn);
655 edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
657 _item_sizing_eval(it);
661 _item_del(Elm_Naviframe_Item *it)
664 Elm_Naviframe_Content_Item_Pair *content_pair;
665 Elm_Naviframe_Text_Item_Pair *text_pair;
669 wd = elm_widget_data_get(WIDGET(it));
672 if (it->title_prev_btn)
673 evas_object_del(it->title_prev_btn);
674 if (it->title_next_btn)
675 evas_object_del(it->title_next_btn);
676 if ((it->content) && (!wd->preserve))
677 evas_object_del(it->content);
679 while (it->content_list)
681 content_pair = EINA_INLIST_CONTAINER_GET(it->content_list,
682 Elm_Naviframe_Content_Item_Pair);
683 evas_object_event_callback_del(content_pair->content,
686 evas_object_del(content_pair->content);
687 eina_stringshare_del(content_pair->part);
688 it->content_list = eina_inlist_remove(it->content_list,
693 while (it->text_list)
695 text_pair = EINA_INLIST_CONTAINER_GET(it->text_list,
696 Elm_Naviframe_Text_Item_Pair);
697 eina_stringshare_del(text_pair->part);
698 eina_stringshare_del(text_pair->text);
699 it->text_list = eina_inlist_remove(it->text_list,
704 eina_stringshare_del(it->style);
706 elm_widget_item_del(it);
710 _pushed_finished(void *data,
711 Evas_Object *obj __UNUSED__,
712 const char *emission __UNUSED__,
713 const char *source __UNUSED__)
716 Elm_Naviframe_Item *it = data;
719 wd = elm_widget_data_get(WIDGET(it));
722 evas_object_hide(VIEW(it));
723 evas_object_smart_callback_call(WIDGET(it),
726 if (wd->freeze_events)
727 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
731 _popped_finished(void *data,
732 Evas_Object *obj __UNUSED__,
733 const char *emission __UNUSED__,
734 const char *source __UNUSED__)
736 Elm_Naviframe_Item *it = data;
738 evas_object_smart_callback_call(WIDGET(it),
745 _show_finished(void *data,
746 Evas_Object *obj __UNUSED__,
747 const char *emission __UNUSED__,
748 const char *source __UNUSED__)
750 Elm_Naviframe_Item *it;
755 wd = elm_widget_data_get(WIDGET(it));
758 evas_object_smart_callback_call(WIDGET(it),
759 SIG_TRANSITION_FINISHED,
761 if (wd->freeze_events)
762 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
766 _item_content_set(Elm_Naviframe_Item *navi_it, Evas_Object *content)
768 if (navi_it->content == content) return;
769 if (navi_it->content) evas_object_del(navi_it->content);
770 elm_widget_sub_object_add(WIDGET(navi_it), content);
771 edje_object_part_swallow(VIEW(navi_it),
772 "elm.swallow.content",
775 edje_object_signal_emit(VIEW(navi_it),
776 "elm,state,content,show",
779 edje_object_signal_emit(VIEW(navi_it),
780 "elm,state,content,hide",
782 evas_object_event_callback_add(content,
786 navi_it->content = content;
787 _item_sizing_eval(navi_it);
790 //FIXME: need to handle if this function is called while transition
792 _item_style_set(Elm_Naviframe_Item *navi_it, const char *item_style)
794 Elm_Naviframe_Content_Item_Pair *content_pair;
795 Elm_Naviframe_Text_Item_Pair *text_pair;
802 sprintf(buf, "item/basic");
803 eina_stringshare_replace(&navi_it->style, "basic");
807 if (strlen(item_style) > sizeof(buf))
808 WRN("too much long style name! : naviframe=%p", WIDGET(navi_it));
809 sprintf(buf, "item/%s", item_style);
810 eina_stringshare_replace(&navi_it->style, item_style);
812 _elm_theme_object_set(WIDGET(navi_it),
816 elm_widget_style_get(WIDGET(navi_it)));
818 EINA_INLIST_FOREACH(navi_it->text_list, text_pair)
819 _item_text_set_hook((Elm_Object_Item *) navi_it,
823 EINA_INLIST_FOREACH(navi_it->content_list, content_pair)
824 _item_content_set_hook((Elm_Object_Item *) navi_it,
826 content_pair->content);
829 if (navi_it->content)
831 edje_object_part_swallow(VIEW(navi_it),
832 "elm.swallow.content",
834 edje_object_signal_emit(VIEW(navi_it),
835 "elm,state,content,show",
840 if (navi_it->title_prev_btn)
842 edje_object_part_swallow(VIEW(navi_it),
843 "elm.swallow.prev_btn",
844 navi_it->title_prev_btn);
845 edje_object_signal_emit(VIEW(navi_it),
846 "elm,state,prev_btn,show",
851 if (navi_it->title_next_btn)
853 edje_object_part_swallow(VIEW(navi_it),
854 "elm.swallow.next_btn",
855 navi_it->title_next_btn);
856 edje_object_signal_emit(VIEW(navi_it),
857 "elm,state,next_btn,show",
861 navi_it->title_visible = EINA_TRUE;
862 _item_sizing_eval(navi_it);
864 wd = elm_widget_data_get(WIDGET(navi_it));
867 if (wd->freeze_events)
868 evas_object_freeze_events_set(VIEW(navi_it), EINA_FALSE);
872 elm_naviframe_add(Evas_Object *parent)
878 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
879 ELM_SET_WIDTYPE(widtype, "naviframe");
880 elm_widget_type_set(obj, "naviframe");
881 elm_widget_sub_object_add(parent, obj);
882 elm_widget_data_set(obj, wd);
883 elm_widget_del_hook_set(obj, _del_hook);
884 elm_widget_disable_hook_set(obj, _disable_hook);
885 elm_widget_theme_hook_set(obj, _theme_hook);
886 elm_widget_signal_emit_hook_set(obj, _emit_hook);
889 wd->base = edje_object_add(e);
890 edje_object_mirrored_set(wd->base, elm_widget_mirrored_get(obj));
891 elm_widget_resize_object_set(obj, wd->base);
892 _elm_theme_object_set(obj, wd->base, "naviframe", "base", "default");
894 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, obj);
895 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
896 evas_object_smart_callbacks_descriptions_set(obj, _signals);
898 wd->auto_pushed = EINA_TRUE;
899 wd->freeze_events = EINA_TRUE;
904 EAPI Elm_Object_Item *
905 elm_naviframe_item_push(Evas_Object *obj,
906 const char *title_label,
907 Evas_Object *prev_btn,
908 Evas_Object *next_btn,
909 Evas_Object *content,
910 const char *item_style)
912 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
914 Elm_Naviframe_Item *prev_it, *it;
916 wd = elm_widget_data_get(obj);
917 if (!wd) return NULL;
920 it = elm_widget_item_new(obj, Elm_Naviframe_Item);
923 ERR("Failed to allocate new item! : naviframe=%p", obj);
927 elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
928 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
929 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
930 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
931 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
932 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
935 VIEW(it) = edje_object_add(evas_object_evas_get(obj));
936 edje_object_mirrored_set(VIEW(it), elm_widget_mirrored_get(obj));
937 evas_object_smart_member_add(VIEW(it), wd->base);
938 elm_widget_sub_object_add(obj, VIEW(it));
939 edje_object_signal_callback_add(VIEW(it),
940 "elm,action,show,finished",
943 edje_object_signal_callback_add(VIEW(it),
944 "elm,action,pushed,finished",
946 _pushed_finished, it);
947 edje_object_signal_callback_add(VIEW(it),
948 "elm,action,popped,finished",
950 _popped_finished, it);
951 edje_object_signal_callback_add(VIEW(it),
952 "elm,action,title,clicked",
956 _item_style_set(it, item_style);
958 _item_text_set_hook((Elm_Object_Item *) it, "elm.text.title", title_label);
961 if ((!prev_btn) && wd->auto_pushed && eina_inlist_count(wd->stack))
963 prev_btn = _back_btn_new(obj);
964 _title_prev_btn_set(it, prev_btn, EINA_TRUE);
967 _title_prev_btn_set(it, prev_btn, EINA_FALSE);
969 _title_next_btn_set(it, next_btn);
971 _item_content_set(it, content);
973 _item_sizing_eval(it);
974 evas_object_show(VIEW(it));
976 prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
979 if (wd->freeze_events)
981 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
982 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
984 edje_object_signal_emit(VIEW(prev_it),
985 "elm,state,cur,pushed",
987 edje_object_signal_emit(VIEW(it),
988 "elm,state,new,pushed",
991 it->title_visible = EINA_TRUE;
992 wd->stack = eina_inlist_append(wd->stack, EINA_INLIST_GET(it));
993 return (Elm_Object_Item *) it;
997 elm_naviframe_item_pop(Evas_Object *obj)
999 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1000 Elm_Naviframe_Item *it, *prev_it = NULL;
1002 Evas_Object *content = NULL;
1004 wd = elm_widget_data_get(obj);
1005 if (!wd) return NULL;
1007 it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1008 if (!it) return NULL;
1009 elm_widget_tree_unfocusable_set(it->content, EINA_TRUE);
1011 content = it->content;
1013 if (wd->stack->last->prev)
1014 prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
1015 Elm_Naviframe_Item);
1016 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(it));
1019 edje_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1020 evas_object_show(VIEW(prev_it));
1021 evas_object_raise(VIEW(prev_it));
1022 edje_object_signal_emit(VIEW(prev_it),
1023 "elm,state,prev,popped",
1033 elm_naviframe_item_pop_to(Elm_Object_Item *it)
1035 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1036 Elm_Naviframe_Item *navi_it;
1038 Eina_Inlist *l, *prev_l;
1040 navi_it = (Elm_Naviframe_Item *) it;
1041 wd = elm_widget_data_get(WIDGET(navi_it));
1044 if (it == elm_naviframe_top_item_get(WIDGET(navi_it))) return;
1046 l = wd->stack->last->prev;
1050 if (EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item) ==
1051 ((Elm_Naviframe_Item *) it)) break;
1053 wd->stack = eina_inlist_remove(wd->stack, l);
1054 _item_del(EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item));
1057 elm_naviframe_item_pop(WIDGET(navi_it));
1061 elm_naviframe_item_promote(Elm_Object_Item *it)
1063 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1064 Elm_Naviframe_Item *navi_it;
1065 Elm_Naviframe_Item *prev_it;
1068 navi_it = (Elm_Naviframe_Item *) it;
1069 wd = elm_widget_data_get(navi_it->base.widget);
1072 if (it == elm_naviframe_top_item_get(navi_it->base.widget)) return;
1073 wd->stack = eina_inlist_demote(wd->stack, EINA_INLIST_GET(navi_it));
1074 prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
1075 Elm_Naviframe_Item);
1076 if (wd->freeze_events)
1078 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1079 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1081 edje_object_signal_emit(prev_it->base.view,
1082 "elm,state,cur,pushed",
1084 evas_object_show(navi_it->base.view);
1085 evas_object_raise(navi_it->base.view);
1086 edje_object_signal_emit(navi_it->base.view,
1087 "elm,state,new,pushed",
1093 elm_naviframe_item_del(Elm_Object_Item *it)
1095 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1096 Elm_Naviframe_Item *navi_it;
1099 navi_it =(Elm_Naviframe_Item *) it;
1100 wd = elm_widget_data_get(WIDGET(navi_it));
1103 if (it == elm_naviframe_top_item_get(WIDGET(navi_it)))
1105 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
1107 navi_it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
1108 Elm_Naviframe_Item);
1109 evas_object_show(VIEW(navi_it));
1110 evas_object_raise(VIEW(navi_it));
1111 edje_object_signal_emit(VIEW(navi_it), "elm,state,visible", "elm");
1115 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
1121 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj, Eina_Bool preserve)
1123 ELM_CHECK_WIDTYPE(obj, widtype);
1124 Widget_Data *wd = elm_widget_data_get(obj);
1126 wd->preserve = !!preserve;
1130 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
1132 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1133 Widget_Data *wd = elm_widget_data_get(obj);
1134 if (!wd) return EINA_FALSE;
1135 return wd->preserve;
1138 EAPI Elm_Object_Item*
1139 elm_naviframe_top_item_get(const Evas_Object *obj)
1141 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1142 Widget_Data *wd = elm_widget_data_get(obj);
1143 if ((!wd) || (!wd->stack)) return NULL;
1144 return (Elm_Object_Item *) (EINA_INLIST_CONTAINER_GET(wd->stack->last,
1145 Elm_Naviframe_Item));
1148 EAPI Elm_Object_Item*
1149 elm_naviframe_bottom_item_get(const Evas_Object *obj)
1151 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1152 Widget_Data *wd = elm_widget_data_get(obj);
1153 if ((!wd) || (!wd->stack)) return NULL;
1154 return (Elm_Object_Item *) (EINA_INLIST_CONTAINER_GET(wd->stack,
1155 Elm_Naviframe_Item));
1159 elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style)
1161 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1162 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1164 //Return if new style is exsiting one.
1166 if (!strcmp(item_style, navi_it->style)) return;
1169 if (!strcmp("basic", navi_it->style)) return;
1171 _item_style_set(navi_it, item_style);
1175 elm_naviframe_item_style_get(const Elm_Object_Item *it)
1177 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
1178 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1179 return navi_it->style;
1183 elm_naviframe_item_title_visible_set(Elm_Object_Item *it, Eina_Bool visible)
1185 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1186 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1188 visible = !!visible;
1189 if (navi_it->title_visible == visible) return;
1191 navi_it->title_visible = visible;
1192 _item_title_visible_update(navi_it);
1196 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
1198 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
1199 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1200 return navi_it->title_visible;
1204 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj, Eina_Bool auto_pushed)
1206 ELM_CHECK_WIDTYPE(obj, widtype);
1207 Widget_Data *wd = elm_widget_data_get(obj);
1209 wd->auto_pushed = !!auto_pushed;
1213 elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
1215 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1216 Widget_Data *wd = elm_widget_data_get(obj);
1217 if (!wd) return EINA_FALSE;
1218 return wd->auto_pushed;