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;
14 Eina_Bool preserve: 1;
15 Eina_Bool auto_pushed: 1;
16 Eina_Bool freeze_events: 1;
19 struct _Elm_Naviframe_Content_Item_Pair
24 Elm_Naviframe_Item *it;
27 struct _Elm_Naviframe_Text_Item_Pair
34 struct _Elm_Naviframe_Item
38 Eina_Inlist *content_list;
39 Eina_Inlist *text_list;
41 Evas_Object *title_prev_btn;
42 Evas_Object *title_next_btn;
45 Eina_Bool back_btn: 1;
46 Eina_Bool title_visible: 1;
49 static const char *widtype = NULL;
51 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
52 static const char SIG_PUSH_FINISHED[] = "push,finished";
53 static const char SIG_POP_FINISHED[] = "pop,finished";
54 static const char SIG_TITLE_CLICKED[] = "title,clicked";
56 static const Evas_Smart_Cb_Description _signals[] = {
57 {SIG_TRANSITION_FINISHED, ""},
58 {SIG_TITLE_CLICKED, ""},
62 static void _del_hook(Evas_Object *obj);
63 static void _theme_hook(Evas_Object *obj);
64 static void _emit_hook(Evas_Object *obj,
67 static void _disable_hook(Evas_Object *obj);
68 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
69 static void _item_text_set_hook(Elm_Object_Item *it,
72 static const char *_item_text_get_hook(const Elm_Object_Item *it,
74 static void _item_content_set_hook(Elm_Object_Item *it,
76 Evas_Object *content);
77 static Evas_Object *_item_content_get_hook(const Elm_Object_Item *it,
79 static Evas_Object *_item_content_unset_hook(Elm_Object_Item *it,
81 static void _item_signal_emit_hook(Elm_Object_Item *it,
84 static void _item_title_visible_update(Elm_Naviframe_Item *navi_it);
85 static void _sizing_eval(Evas_Object *obj);
86 static void _item_sizing_eval(Elm_Naviframe_Item *it);
87 static void _move(void *data, Evas *e, Evas_Object *obj, void *event_info);
88 static void _resize(void *data,
92 static void _hide(void *data, Evas *e, Evas_Object *obj, void *event_info);
93 static void _title_clicked(void *data, Evas_Object *obj,
96 static void _back_btn_clicked(void *data,
99 static Evas_Object *_back_btn_new(Evas_Object *obj);
100 static void _item_content_del(void *data,
104 static void _title_content_del(void *data,
108 static void _title_prev_btn_del(void *data,
112 static void _title_next_btn_del(void *data,
116 static void _title_icon_del(void *data,
120 static void _title_content_set(Elm_Naviframe_Item *it,
122 Evas_Object *content);
123 static void _title_prev_btn_set(Elm_Naviframe_Item *it,
126 static void _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn);
127 static void _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon);
128 static void _item_del(Elm_Naviframe_Item *it);
129 static void _pushed_finished(void *data,
131 const char *emission,
133 static void _popped_finished(void *data,
135 const char *emission,
137 static void _show_finished(void *data,
139 const char *emission,
141 static void _item_content_set(Elm_Naviframe_Item *navi_it,
142 Evas_Object *content);
143 static void _item_style_set(Elm_Naviframe_Item *navi_it,
144 const char *item_style);
145 static Elm_Naviframe_Item * _item_new(Evas_Object *obj,
146 const char *title_label,
147 Evas_Object *prev_btn,
148 Evas_Object *next_btn,
149 Evas_Object *content,
150 const char *item_style);
153 _del_hook(Evas_Object *obj)
156 Elm_Naviframe_Item *it;
158 wd = elm_widget_data_get(obj);
163 while (wd->stack->last)
165 it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
167 wd->stack = eina_inlist_remove(wd->stack, wd->stack->last);
169 if (!wd->stack) break;
176 _theme_hook(Evas_Object *obj)
179 Elm_Naviframe_Item *it;
181 wd = elm_widget_data_get(obj);
184 _elm_theme_object_set(obj,
188 elm_widget_style_get(obj));
190 EINA_INLIST_FOREACH(wd->stack, it)
192 _item_style_set(it, it->style);
193 _item_title_visible_update(it);
196 _elm_widget_mirrored_reload(obj);
197 _mirrored_set(obj, elm_widget_mirrored_get(obj));
199 evas_object_hide(wd->rect);
202 static void _emit_hook(Evas_Object *obj,
203 const char *emission,
206 ELM_CHECK_WIDTYPE(obj, widtype);
208 Widget_Data *wd = elm_widget_data_get(obj);
211 edje_object_signal_emit(wd->base, emission, source);
215 _disable_hook(Evas_Object *obj __UNUSED__)
221 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
224 Elm_Naviframe_Item *it;
226 wd = elm_widget_data_get(obj);
229 EINA_INLIST_FOREACH(wd->stack, it)
230 edje_object_mirrored_set(VIEW(it), rtl);
231 edje_object_mirrored_set(wd->base, rtl);
235 _item_text_set_hook(Elm_Object_Item *it,
239 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
241 Elm_Naviframe_Text_Item_Pair *pair = NULL;
242 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
245 if (!part || !strcmp(part, "default"))
246 snprintf(buf, sizeof(buf), "elm.text.title");
247 else if(!strcmp("subtitle", part))
248 snprintf(buf, sizeof(buf), "elm.text.subtitle");
250 snprintf(buf, sizeof(buf), "%s", part);
252 EINA_INLIST_FOREACH(navi_it->text_list, pair)
253 if (!strcmp(buf, pair->part)) break;
257 pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
260 ERR("Failed to allocate new text part of the item! : naviframe=%p",
264 eina_stringshare_replace(&pair->part, buf);
265 navi_it->text_list = eina_inlist_append(navi_it->text_list,
266 EINA_INLIST_GET(pair));
269 eina_stringshare_replace(&pair->text, label);
270 edje_object_part_text_set(VIEW(navi_it), buf, label);
274 snprintf(buf, sizeof(buf), "elm,state,%s,show", buf);
275 edje_object_signal_emit(VIEW(navi_it), buf, "elm");
279 snprintf(buf, sizeof(buf), "elm,state,%s,hide", buf);
280 edje_object_signal_emit(VIEW(navi_it), buf, "elm");
283 _item_sizing_eval(navi_it);
287 _item_text_get_hook(const Elm_Object_Item *it, const char *part)
289 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
290 Elm_Naviframe_Text_Item_Pair *pair = NULL;
291 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
294 if (!part || !strcmp(part, "default"))
295 snprintf(buf, sizeof(buf), "elm.text.title");
296 else if(!strcmp("subtitle", part))
297 snprintf(buf, sizeof(buf), "elm.text.subtitle");
299 snprintf(buf, sizeof(buf), "%s", part);
301 EINA_INLIST_FOREACH(navi_it->text_list, pair)
303 if (!strcmp(buf, pair->part))
310 _item_content_set_hook(Elm_Object_Item *it,
312 Evas_Object *content)
314 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
316 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
319 if ((!part) || (!strcmp(part, "elm.swallow.content")))
321 _item_content_set(navi_it, content);
324 else if (!strcmp(part, "elm.swallow.prev_btn"))
326 _title_prev_btn_set(navi_it, content, EINA_FALSE);
329 else if (!strcmp(part, "elm.swallow.next_btn"))
331 _title_next_btn_set(navi_it, content);
334 else if (!strcmp(part, "icon"))
336 _title_icon_set(navi_it, content);
341 _title_content_set(navi_it, part, content);
345 _item_content_get_hook(const Elm_Object_Item *it, const char *part)
347 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
348 Elm_Naviframe_Content_Item_Pair *pair = NULL;
349 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
352 if ((!part) || (!strcmp(part, "elm.swallow.content")))
353 return navi_it->content;
354 else if (!strcmp(part, "elm.swallow.prev_btn"))
355 return navi_it->title_prev_btn;
356 else if (!strcmp(part, "elm.swallow.next_btn"))
357 return navi_it->title_next_btn;
358 else if (!strcmp(part, "icon"))
359 return navi_it->icon;
362 EINA_INLIST_FOREACH(navi_it->content_list, pair)
364 if (!strcmp(part, pair->part))
365 return pair->content;
371 _item_content_unset_hook(Elm_Object_Item *it, const char *part)
373 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
374 Elm_Naviframe_Content_Item_Pair *pair = NULL;
375 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
376 Evas_Object *content = NULL;
380 //FIXME: could be unset the below specified contents also.
382 !strcmp(part, "elm.swallow.content") ||
383 !strcmp(part, "elm.swallow.prev_btn") ||
384 !strcmp(part, "elm.swallow.next_btn") ||
385 !strcmp(part, "icon"))
387 WRN("You can not unset the content! : naviframe=%p",
393 EINA_INLIST_FOREACH(navi_it->content_list, pair)
395 if (!strcmp(part, pair->part))
397 content = pair->content;
398 eina_stringshare_del(pair->part);
399 navi_it->content_list = eina_inlist_remove(navi_it->content_list,
400 EINA_INLIST_GET(pair));
406 if (!content) return NULL;
408 elm_widget_sub_object_del(WIDGET(navi_it), content);
409 edje_object_part_unswallow(VIEW(navi_it), content);
410 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
411 edje_object_signal_emit(VIEW(navi_it), buf, "elm");
412 evas_object_event_callback_del(content,
415 _item_sizing_eval(navi_it);
421 _item_signal_emit_hook(Elm_Object_Item *it,
422 const char *emission,
425 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
426 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
427 edje_object_signal_emit(VIEW(navi_it), emission, source);
431 _item_title_visible_update(Elm_Naviframe_Item *navi_it)
433 if (navi_it->title_visible)
434 edje_object_signal_emit(VIEW(navi_it), "elm,state,title,show", "elm");
436 edje_object_signal_emit(VIEW(navi_it), "elm,state,title,hide", "elm");
440 _sizing_eval(Evas_Object *obj)
443 Elm_Naviframe_Item *it;
444 wd = elm_widget_data_get(obj);
447 EINA_INLIST_FOREACH(wd->stack, it)
448 _item_sizing_eval(it);
452 _item_sizing_eval(Elm_Naviframe_Item *it)
455 Evas_Coord x, y, w, h;
458 wd = elm_widget_data_get(WIDGET(it));
461 evas_object_geometry_get(WIDGET(it), &x, &y, &w, &h);
462 evas_object_move(VIEW(it), x, y);
463 evas_object_resize(VIEW(it), w, h);
467 _move(void *data __UNUSED__,
470 void *event_info __UNUSED__)
473 Widget_Data *wd = elm_widget_data_get(obj);
476 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
477 evas_object_move(wd->rect, x, y);
483 _resize(void *data __UNUSED__,
486 void *event_info __UNUSED__)
489 Widget_Data *wd = elm_widget_data_get(obj);
492 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
493 evas_object_resize(wd->rect, w, h);
499 _hide(void *data __UNUSED__,
502 void *event_info __UNUSED__)
504 Widget_Data *wd = elm_widget_data_get(obj);
506 if (wd->freeze_events)
507 evas_object_hide(wd->rect);
511 _title_clicked(void *data,
512 Evas_Object *obj __UNUSED__,
513 const char *emission __UNUSED__,
514 const char *source __UNUSED__)
516 Elm_Naviframe_Item *it = data;
517 evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_CLICKED, it);
521 _back_btn_clicked(void *data,
523 void *event_info __UNUSED__)
525 /* Since edje has the event queue, clicked event could be happend multiple times
526 on some heavy environment. This callback del will prevent those scenario and
527 guarantee only one clicked for it's own page. */
528 evas_object_smart_callback_del(obj, "clicked", _back_btn_clicked);
529 elm_naviframe_item_pop(data);
533 _back_btn_new(Evas_Object *obj)
537 btn = elm_button_add(obj);
538 if (!btn) return NULL;
539 evas_object_smart_callback_add(btn, "clicked", _back_btn_clicked, obj);
540 snprintf(buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
541 elm_object_style_set(btn, buf);
546 _title_content_del(void *data,
548 Evas_Object *obj __UNUSED__,
549 void *event_info __UNUSED__)
552 Elm_Naviframe_Content_Item_Pair *pair = data;
553 Elm_Naviframe_Item *it = pair->it;
554 snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
555 edje_object_signal_emit(VIEW(it), buf, "elm");
556 it->content_list = eina_inlist_remove(it->content_list,
557 EINA_INLIST_GET(pair));
558 eina_stringshare_del(pair->part);
563 _title_prev_btn_del(void *data,
565 Evas_Object *obj __UNUSED__,
566 void *event_info __UNUSED__)
568 Elm_Naviframe_Item *it = data;
569 it->back_btn = EINA_FALSE;
570 it->title_prev_btn = NULL;
571 edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
575 _title_next_btn_del(void *data,
577 Evas_Object *obj __UNUSED__,
578 void *event_info __UNUSED__)
580 Elm_Naviframe_Item *it = data;
581 it->title_next_btn = NULL;
582 edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
586 _title_icon_del(void *data,
588 Evas_Object *obj __UNUSED__,
589 void *event_info __UNUSED__)
591 Elm_Naviframe_Item *it = data;
593 edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
597 _item_content_del(void *data,
599 Evas_Object *obj __UNUSED__,
600 void *event_info __UNUSED__)
602 Elm_Naviframe_Item *it = data;
604 edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
608 _title_content_set(Elm_Naviframe_Item *it,
610 Evas_Object *content)
613 Elm_Naviframe_Content_Item_Pair *pair = NULL;
615 EINA_INLIST_FOREACH(it->content_list, pair)
616 if (!strcmp(part, pair->part)) break;
618 if ((pair) && (pair->content))
622 evas_object_del(pair->content);
623 pair->content = NULL;
626 if (pair->content == content) return;
627 evas_object_event_callback_del(pair->content,
630 evas_object_del(pair->content);
631 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
632 edje_object_signal_emit(VIEW(it), buf, "elm");
636 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
639 ERR("Failed to allocate new content part of the item! : naviframe=%p", WIDGET(it));
643 eina_stringshare_replace(&pair->part, part);
644 it->content_list = eina_inlist_append(it->content_list,
645 EINA_INLIST_GET(pair));
648 elm_widget_sub_object_add(WIDGET(it), content);
649 evas_object_event_callback_add(content,
653 edje_object_part_swallow(VIEW(it), part, content);
654 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
655 edje_object_signal_emit(VIEW(it), buf, "elm");
656 pair->content = content;
657 _item_sizing_eval(it);
661 _title_prev_btn_set(Elm_Naviframe_Item *it,
665 if (it->title_prev_btn == btn) return;
667 if (it->title_prev_btn)
668 evas_object_del(it->title_prev_btn);
670 it->title_prev_btn = btn;
673 elm_widget_sub_object_add(WIDGET(it), btn);
674 evas_object_event_callback_add(btn,
678 edje_object_part_swallow(VIEW(it), "elm.swallow.prev_btn", btn);
679 edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
680 it->back_btn = back_btn;
682 _item_sizing_eval(it);
686 _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn)
688 if (it->title_next_btn == btn) return;
690 if (it->title_next_btn)
691 evas_object_del(it->title_next_btn);
693 it->title_next_btn = btn;
696 elm_widget_sub_object_add(WIDGET(it), btn);
697 evas_object_event_callback_add(btn,
701 edje_object_part_swallow(VIEW(it), "elm.swallow.next_btn", btn);
702 edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
704 _item_sizing_eval(it);
708 _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon)
710 if (it->icon == icon) return;
713 evas_object_del(it->icon);
718 elm_widget_sub_object_add(WIDGET(it), icon);
719 evas_object_event_callback_add(icon,
723 edje_object_part_swallow(VIEW(it), "elm.swallow.icon", icon);
724 edje_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
726 _item_sizing_eval(it);
731 _item_del(Elm_Naviframe_Item *it)
734 Elm_Naviframe_Content_Item_Pair *content_pair;
735 Elm_Naviframe_Text_Item_Pair *text_pair;
739 wd = elm_widget_data_get(WIDGET(it));
742 if (it->title_prev_btn)
743 evas_object_del(it->title_prev_btn);
744 if (it->title_next_btn)
745 evas_object_del(it->title_next_btn);
747 evas_object_del(it->icon);
748 if ((it->content) && (!wd->preserve))
749 evas_object_del(it->content);
751 while (it->content_list)
753 content_pair = EINA_INLIST_CONTAINER_GET(it->content_list,
754 Elm_Naviframe_Content_Item_Pair);
755 evas_object_event_callback_del(content_pair->content,
758 evas_object_del(content_pair->content);
759 eina_stringshare_del(content_pair->part);
760 it->content_list = eina_inlist_remove(it->content_list,
765 while (it->text_list)
767 text_pair = EINA_INLIST_CONTAINER_GET(it->text_list,
768 Elm_Naviframe_Text_Item_Pair);
769 eina_stringshare_del(text_pair->part);
770 eina_stringshare_del(text_pair->text);
771 it->text_list = eina_inlist_remove(it->text_list,
776 eina_stringshare_del(it->style);
778 elm_widget_item_del(it);
782 _pushed_finished(void *data,
783 Evas_Object *obj __UNUSED__,
784 const char *emission __UNUSED__,
785 const char *source __UNUSED__)
788 Elm_Naviframe_Item *it = data;
791 wd = elm_widget_data_get(WIDGET(it));
794 evas_object_hide(VIEW(it));
795 evas_object_smart_callback_call(WIDGET(it),
801 _popped_finished(void *data,
802 Evas_Object *obj __UNUSED__,
803 const char *emission __UNUSED__,
804 const char *source __UNUSED__)
806 Elm_Naviframe_Item *it = data;
808 evas_object_smart_callback_call(WIDGET(it),
815 _show_finished(void *data,
816 Evas_Object *obj __UNUSED__,
817 const char *emission __UNUSED__,
818 const char *source __UNUSED__)
820 Elm_Naviframe_Item *it;
825 wd = elm_widget_data_get(WIDGET(it));
828 evas_object_smart_callback_call(WIDGET(it),
829 SIG_TRANSITION_FINISHED,
831 if (wd->freeze_events)
832 evas_object_hide(wd->rect);
836 _item_content_set(Elm_Naviframe_Item *navi_it, Evas_Object *content)
838 if (navi_it->content == content) return;
839 if (navi_it->content) evas_object_del(navi_it->content);
840 elm_widget_sub_object_add(WIDGET(navi_it), content);
841 edje_object_part_swallow(VIEW(navi_it),
842 "elm.swallow.content",
845 edje_object_signal_emit(VIEW(navi_it),
846 "elm,state,content,show",
849 edje_object_signal_emit(VIEW(navi_it),
850 "elm,state,content,hide",
852 evas_object_event_callback_add(content,
856 navi_it->content = content;
857 _item_sizing_eval(navi_it);
860 //FIXME: need to handle if this function is called while transition
862 _item_style_set(Elm_Naviframe_Item *navi_it, const char *item_style)
864 Elm_Naviframe_Content_Item_Pair *content_pair;
865 Elm_Naviframe_Text_Item_Pair *text_pair;
872 sprintf(buf, "item/basic");
873 eina_stringshare_replace(&navi_it->style, "basic");
877 if (strlen(item_style) > sizeof(buf))
878 WRN("too much long style name! : naviframe=%p", WIDGET(navi_it));
879 sprintf(buf, "item/%s", item_style);
880 eina_stringshare_replace(&navi_it->style, item_style);
882 _elm_theme_object_set(WIDGET(navi_it),
886 elm_widget_style_get(WIDGET(navi_it)));
888 EINA_INLIST_FOREACH(navi_it->text_list, text_pair)
889 _item_text_set_hook((Elm_Object_Item *) navi_it,
893 EINA_INLIST_FOREACH(navi_it->content_list, content_pair)
894 _item_content_set_hook((Elm_Object_Item *) navi_it,
896 content_pair->content);
898 if (navi_it->content)
900 edje_object_part_swallow(VIEW(navi_it),
901 "elm.swallow.content",
903 edje_object_signal_emit(VIEW(navi_it),
904 "elm,state,content,show",
909 if (navi_it->title_prev_btn)
911 edje_object_part_swallow(VIEW(navi_it),
912 "elm.swallow.prev_btn",
913 navi_it->title_prev_btn);
914 edje_object_signal_emit(VIEW(navi_it),
915 "elm,state,prev_btn,show",
920 if (navi_it->title_next_btn)
922 edje_object_part_swallow(VIEW(navi_it),
923 "elm.swallow.next_btn",
924 navi_it->title_next_btn);
925 edje_object_signal_emit(VIEW(navi_it),
926 "elm,state,next_btn,show",
930 navi_it->title_visible = EINA_TRUE;
931 _item_sizing_eval(navi_it);
933 wd = elm_widget_data_get(WIDGET(navi_it));
934 if (wd && wd->freeze_events)
935 evas_object_hide(wd->rect);
938 static Elm_Naviframe_Item *
939 _item_new(Evas_Object *obj,
940 const char *title_label,
941 Evas_Object *prev_btn,
942 Evas_Object *next_btn,
943 Evas_Object *content,
944 const char *item_style)
946 Widget_Data *wd = elm_widget_data_get(obj);
949 Elm_Naviframe_Item *it = elm_widget_item_new(obj, Elm_Naviframe_Item);
952 ERR("Failed to allocate new item! : naviframe=%p", obj);
956 elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
957 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
958 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
959 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
960 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
961 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
964 VIEW(it) = edje_object_add(evas_object_evas_get(obj));
965 edje_object_mirrored_set(VIEW(it), elm_widget_mirrored_get(obj));
966 evas_object_smart_member_add(VIEW(it), wd->base);
967 elm_widget_sub_object_add(obj, VIEW(it));
968 edje_object_signal_callback_add(VIEW(it),
969 "elm,action,show,finished",
972 edje_object_signal_callback_add(VIEW(it),
973 "elm,action,pushed,finished",
975 _pushed_finished, it);
976 edje_object_signal_callback_add(VIEW(it),
977 "elm,action,popped,finished",
979 _popped_finished, it);
980 edje_object_signal_callback_add(VIEW(it),
981 "elm,action,title,clicked",
985 _item_style_set(it, item_style);
986 _item_text_set_hook((Elm_Object_Item *) it, "elm.text.title", title_label);
989 if ((!prev_btn) && wd->auto_pushed && eina_inlist_count(wd->stack))
991 prev_btn = _back_btn_new(obj);
992 _title_prev_btn_set(it, prev_btn, EINA_TRUE);
995 _title_prev_btn_set(it, prev_btn, EINA_FALSE);
997 _title_next_btn_set(it, next_btn);
998 _item_content_set(it, content);
999 _item_sizing_eval(it);
1001 it->title_visible = EINA_TRUE;
1006 elm_naviframe_add(Evas_Object *parent)
1012 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
1013 ELM_SET_WIDTYPE(widtype, "naviframe");
1014 elm_widget_type_set(obj, "naviframe");
1015 elm_widget_sub_object_add(parent, obj);
1016 elm_widget_data_set(obj, wd);
1017 elm_widget_del_hook_set(obj, _del_hook);
1018 elm_widget_disable_hook_set(obj, _disable_hook);
1019 elm_widget_theme_hook_set(obj, _theme_hook);
1020 elm_widget_signal_emit_hook_set(obj, _emit_hook);
1023 wd->base = edje_object_add(e);
1024 edje_object_mirrored_set(wd->base, elm_widget_mirrored_get(obj));
1025 elm_widget_resize_object_set(obj, wd->base);
1026 _elm_theme_object_set(obj, wd->base, "naviframe", "base", "default");
1029 wd->rect = evas_object_rectangle_add(e);
1030 evas_object_color_set(wd->rect, 0, 0, 0, 0);
1031 elm_widget_sub_object_add(obj, wd->rect);
1033 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, obj);
1034 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
1035 evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _hide, obj);
1036 evas_object_smart_callbacks_descriptions_set(obj, _signals);
1038 wd->auto_pushed = EINA_TRUE;
1039 wd->freeze_events = EINA_TRUE;
1044 EAPI Elm_Object_Item *
1045 elm_naviframe_item_push(Evas_Object *obj,
1046 const char *title_label,
1047 Evas_Object *prev_btn,
1048 Evas_Object *next_btn,
1049 Evas_Object *content,
1050 const char *item_style)
1052 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1054 Elm_Naviframe_Item *prev_it, *it;
1056 wd = elm_widget_data_get(obj);
1057 if (!wd) return NULL;
1059 it = _item_new(obj, title_label, prev_btn, next_btn, content, item_style);
1060 if (!it) return NULL;
1062 evas_object_show(VIEW(it));
1064 prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1067 if (wd->freeze_events)
1069 evas_object_raise(wd->rect);
1070 evas_object_show(wd->rect);
1072 edje_object_signal_emit(VIEW(prev_it),
1073 "elm,state,cur,pushed",
1075 edje_object_signal_emit(VIEW(it),
1076 "elm,state,new,pushed",
1078 edje_object_message_signal_process(VIEW(prev_it));
1079 edje_object_message_signal_process(VIEW(it));
1081 wd->stack = eina_inlist_append(wd->stack, EINA_INLIST_GET(it));
1082 return (Elm_Object_Item *) it;
1085 EAPI Elm_Object_Item *
1086 elm_naviframe_item_insert_before(Elm_Object_Item *before,
1087 const char *title_label,
1088 Evas_Object *prev_btn,
1089 Evas_Object *next_btn,
1090 Evas_Object *content,
1091 const char *item_style)
1093 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
1094 Elm_Naviframe_Item *it;
1097 wd = elm_widget_data_get(WIDGET(before));
1098 if (!wd) return NULL;
1100 it = _item_new(WIDGET(before), title_label, prev_btn, next_btn, content,
1102 if (!it) return NULL;
1105 eina_inlist_prepend_relative(wd->stack, EINA_INLIST_GET(it),
1106 EINA_INLIST_GET(((Elm_Naviframe_Item *) before)));
1107 return (Elm_Object_Item *) it;
1110 EAPI Elm_Object_Item *
1111 elm_naviframe_item_insert_after(Elm_Object_Item *after,
1112 const char *title_label,
1113 Evas_Object *prev_btn,
1114 Evas_Object *next_btn,
1115 Evas_Object *content,
1116 const char *item_style)
1118 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
1119 Elm_Naviframe_Item *it;
1122 wd = elm_widget_data_get(WIDGET(after));
1123 if (!wd) return NULL;
1125 it = _item_new(WIDGET(after), title_label, prev_btn, next_btn, content,
1127 if (!it) return NULL;
1129 if (elm_naviframe_top_item_get(WIDGET(after)) == after)
1131 evas_object_hide(VIEW(after));
1132 evas_object_show(VIEW(it));
1135 eina_inlist_append_relative(wd->stack, EINA_INLIST_GET(it),
1136 EINA_INLIST_GET(((Elm_Naviframe_Item *) after)));
1137 return (Elm_Object_Item *) it;
1141 elm_naviframe_item_pop(Evas_Object *obj)
1143 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1144 Elm_Naviframe_Item *it, *prev_it = NULL;
1146 Evas_Object *content = NULL;
1148 wd = elm_widget_data_get(obj);
1149 if (!wd) return NULL;
1151 it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1152 if (!it) return NULL;
1153 elm_widget_tree_unfocusable_set(it->content, EINA_TRUE);
1155 content = it->content;
1157 if (wd->stack->last->prev)
1158 prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
1159 Elm_Naviframe_Item);
1160 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(it));
1163 if (wd->freeze_events)
1165 evas_object_raise(wd->rect);
1166 evas_object_show(wd->rect);
1168 edje_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1169 evas_object_show(VIEW(prev_it));
1170 evas_object_raise(VIEW(prev_it));
1171 edje_object_signal_emit(VIEW(prev_it),
1172 "elm,state,prev,popped",
1174 edje_object_message_signal_process(VIEW(it));
1175 edje_object_message_signal_process(VIEW(prev_it));
1184 elm_naviframe_item_pop_to(Elm_Object_Item *it)
1186 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1187 Elm_Naviframe_Item *navi_it;
1189 Eina_Inlist *l, *prev_l;
1191 navi_it = (Elm_Naviframe_Item *) it;
1192 wd = elm_widget_data_get(WIDGET(navi_it));
1195 if (it == elm_naviframe_top_item_get(WIDGET(navi_it))) return;
1197 l = wd->stack->last->prev;
1201 if (EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item) ==
1202 ((Elm_Naviframe_Item *) it)) break;
1204 wd->stack = eina_inlist_remove(wd->stack, l);
1205 _item_del(EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item));
1208 elm_naviframe_item_pop(WIDGET(navi_it));
1212 elm_naviframe_item_promote(Elm_Object_Item *it)
1214 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1215 Elm_Naviframe_Item *navi_it;
1216 Elm_Naviframe_Item *prev_it;
1219 navi_it = (Elm_Naviframe_Item *) it;
1220 wd = elm_widget_data_get(navi_it->base.widget);
1223 if (it == elm_naviframe_top_item_get(navi_it->base.widget)) return;
1224 wd->stack = eina_inlist_demote(wd->stack, EINA_INLIST_GET(navi_it));
1225 prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
1226 Elm_Naviframe_Item);
1227 if (wd->freeze_events)
1229 evas_object_raise(wd->rect);
1230 evas_object_show(wd->rect);
1232 edje_object_signal_emit(VIEW(prev_it),
1233 "elm,state,cur,pushed",
1235 evas_object_show(VIEW(navi_it));
1236 evas_object_raise(VIEW(navi_it));
1237 edje_object_signal_emit(VIEW(navi_it),
1238 "elm,state,new,pushed",
1240 edje_object_message_signal_process(VIEW(prev_it));
1241 edje_object_message_signal_process(VIEW(navi_it));
1245 elm_naviframe_item_del(Elm_Object_Item *it)
1247 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1248 Elm_Naviframe_Item *navi_it;
1251 navi_it =(Elm_Naviframe_Item *) it;
1252 wd = elm_widget_data_get(WIDGET(navi_it));
1255 if (it == elm_naviframe_top_item_get(WIDGET(navi_it)))
1257 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
1259 navi_it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
1260 Elm_Naviframe_Item);
1261 evas_object_show(VIEW(navi_it));
1262 evas_object_raise(VIEW(navi_it));
1263 edje_object_signal_emit(VIEW(navi_it), "elm,state,visible", "elm");
1267 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
1273 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj, Eina_Bool preserve)
1275 ELM_CHECK_WIDTYPE(obj, widtype);
1276 Widget_Data *wd = elm_widget_data_get(obj);
1278 wd->preserve = !!preserve;
1282 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
1284 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1285 Widget_Data *wd = elm_widget_data_get(obj);
1286 if (!wd) return EINA_FALSE;
1287 return wd->preserve;
1290 EAPI Elm_Object_Item*
1291 elm_naviframe_top_item_get(const Evas_Object *obj)
1293 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1294 Widget_Data *wd = elm_widget_data_get(obj);
1295 if ((!wd) || (!wd->stack)) return NULL;
1296 return (Elm_Object_Item *) (EINA_INLIST_CONTAINER_GET(wd->stack->last,
1297 Elm_Naviframe_Item));
1300 EAPI Elm_Object_Item*
1301 elm_naviframe_bottom_item_get(const Evas_Object *obj)
1303 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1304 Widget_Data *wd = elm_widget_data_get(obj);
1305 if ((!wd) || (!wd->stack)) return NULL;
1306 return (Elm_Object_Item *) (EINA_INLIST_CONTAINER_GET(wd->stack,
1307 Elm_Naviframe_Item));
1311 elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style)
1313 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1314 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1316 //Return if new style is exsiting one.
1318 if (!strcmp(item_style, navi_it->style)) return;
1321 if (!strcmp("basic", navi_it->style)) return;
1323 _item_style_set(navi_it, item_style);
1327 elm_naviframe_item_style_get(const Elm_Object_Item *it)
1329 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
1330 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1331 return navi_it->style;
1335 elm_naviframe_item_title_visible_set(Elm_Object_Item *it, Eina_Bool visible)
1337 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1338 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1340 visible = !!visible;
1341 if (navi_it->title_visible == visible) return;
1343 navi_it->title_visible = visible;
1344 _item_title_visible_update(navi_it);
1348 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
1350 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
1351 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1352 return navi_it->title_visible;
1356 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj, Eina_Bool auto_pushed)
1358 ELM_CHECK_WIDTYPE(obj, widtype);
1359 Widget_Data *wd = elm_widget_data_get(obj);
1361 wd->auto_pushed = !!auto_pushed;
1365 elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
1367 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1368 Widget_Data *wd = elm_widget_data_get(obj);
1369 if (!wd) return EINA_FALSE;
1370 return wd->auto_pushed;
1374 elm_naviframe_items_get(const Evas_Object *obj)
1376 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1377 Widget_Data *wd = elm_widget_data_get(obj);
1378 if (!wd) return NULL;