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;
42 Evas_Object *title_icon;
46 Eina_Bool back_btn: 1;
47 Eina_Bool title_visible: 1;
50 static const char *widtype = NULL;
52 static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
53 static const char SIG_PUSH_FINISHED[] = "push,finished";
54 static const char SIG_POP_FINISHED[] = "pop,finished";
55 static const char SIG_TITLE_CLICKED[] = "title,clicked";
57 static const Evas_Smart_Cb_Description _signals[] = {
58 {SIG_TRANSITION_FINISHED, ""},
59 {SIG_TITLE_CLICKED, ""},
63 static void _del_hook(Evas_Object *obj);
64 static void _theme_hook(Evas_Object *obj);
65 static void _emit_hook(Evas_Object *obj,
68 static void _disable_hook(Evas_Object *obj);
69 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
70 static void _item_text_set_hook(Elm_Object_Item *it,
73 static const char *_item_text_get_hook(const Elm_Object_Item *it,
75 static void _item_content_set_hook(Elm_Object_Item *it,
77 Evas_Object *content);
78 static Evas_Object *_item_content_get_hook(const Elm_Object_Item *it,
80 static Evas_Object *_item_content_unset_hook(Elm_Object_Item *it,
82 static void _item_signal_emit_hook(Elm_Object_Item *it,
85 static void _item_title_visible_update(Elm_Naviframe_Item *navi_it);
86 static void _sizing_eval(Evas_Object *obj);
87 static void _move(void *data, Evas *e, Evas_Object *obj, void *event_info);
88 static void _resize(void *data,
92 static void _title_clicked(void *data, Evas_Object *obj,
95 static void _back_btn_clicked(void *data,
98 static Evas_Object *_back_btn_new(Evas_Object *obj);
99 static void _item_content_del(void *data,
103 static void _title_content_del(void *data,
107 static void _title_prev_btn_del(void *data,
111 static void _title_next_btn_del(void *data,
115 static void _title_icon_del(void *data,
119 static void _title_content_set(Elm_Naviframe_Item *it,
121 Evas_Object *content);
122 static void _title_prev_btn_set(Elm_Naviframe_Item *it,
125 static void _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn);
126 static void _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon);
127 static Evas_Object * _item_content_unset(Elm_Naviframe_Item *it);
128 static Evas_Object * _title_prev_btn_unset(Elm_Naviframe_Item *it);
129 static Evas_Object * _title_next_btn_unset(Elm_Naviframe_Item *it);
130 static Evas_Object * _title_icon_unset(Elm_Naviframe_Item *it);
131 static Evas_Object * _title_content_unset(Elm_Naviframe_Item *it,
133 static void _item_del(Elm_Naviframe_Item *it);
134 static void _pushed_finished(void *data,
136 const char *emission,
138 static void _popped_finished(void *data,
140 const char *emission,
142 static void _show_finished(void *data,
144 const char *emission,
146 static void _changed_size_hints(void *data,
150 static void _item_content_set(Elm_Naviframe_Item *navi_it,
151 Evas_Object *content);
152 static void _item_style_set(Elm_Naviframe_Item *navi_it,
153 const char *item_style);
154 static Elm_Naviframe_Item * _item_new(Evas_Object *obj,
155 const char *title_label,
156 Evas_Object *prev_btn,
157 Evas_Object *next_btn,
158 Evas_Object *content,
159 const char *item_style);
162 _del_hook(Evas_Object *obj)
165 Elm_Naviframe_Item *it;
167 wd = elm_widget_data_get(obj);
172 while (wd->stack->last)
174 it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
176 wd->stack = eina_inlist_remove(wd->stack, wd->stack->last);
178 if (!wd->stack) break;
185 _theme_hook(Evas_Object *obj)
188 Elm_Naviframe_Item *it;
190 wd = elm_widget_data_get(obj);
193 _elm_theme_object_set(obj,
197 elm_widget_style_get(obj));
199 EINA_INLIST_FOREACH(wd->stack, it)
201 _item_style_set(it, it->style);
202 _item_title_visible_update(it);
205 _elm_widget_mirrored_reload(obj);
206 _mirrored_set(obj, elm_widget_mirrored_get(obj));
209 static void _emit_hook(Evas_Object *obj,
210 const char *emission,
213 ELM_CHECK_WIDTYPE(obj, widtype);
215 Widget_Data *wd = elm_widget_data_get(obj);
218 edje_object_signal_emit(wd->base, emission, source);
222 _disable_hook(Evas_Object *obj __UNUSED__)
228 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
231 Elm_Naviframe_Item *it;
233 wd = elm_widget_data_get(obj);
236 EINA_INLIST_FOREACH(wd->stack, it)
237 edje_object_mirrored_set(VIEW(it), rtl);
238 edje_object_mirrored_set(wd->base, rtl);
242 _item_text_set_hook(Elm_Object_Item *it,
246 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
248 Elm_Naviframe_Text_Item_Pair *pair = NULL;
249 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
252 if (!part || !strcmp(part, "default"))
253 snprintf(buf, sizeof(buf), "elm.text.title");
254 else if(!strcmp("subtitle", part))
255 snprintf(buf, sizeof(buf), "elm.text.subtitle");
257 snprintf(buf, sizeof(buf), "%s", part);
259 EINA_INLIST_FOREACH(navi_it->text_list, pair)
260 if (!strcmp(buf, pair->part)) break;
264 pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
267 ERR("Failed to allocate new text part of the item! : naviframe=%p",
271 eina_stringshare_replace(&pair->part, buf);
272 navi_it->text_list = eina_inlist_append(navi_it->text_list,
273 EINA_INLIST_GET(pair));
276 eina_stringshare_replace(&pair->text, label);
277 edje_object_part_text_set(VIEW(navi_it), buf, label);
281 snprintf(buf, sizeof(buf), "elm,state,%s,show", buf);
282 edje_object_signal_emit(VIEW(navi_it), buf, "elm");
286 snprintf(buf, sizeof(buf), "elm,state,%s,hide", buf);
287 edje_object_signal_emit(VIEW(navi_it), buf, "elm");
290 _sizing_eval(WIDGET(navi_it));
294 _item_text_get_hook(const Elm_Object_Item *it, const char *part)
296 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
297 Elm_Naviframe_Text_Item_Pair *pair = NULL;
298 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
301 if (!part || !strcmp(part, "default"))
302 snprintf(buf, sizeof(buf), "elm.text.title");
303 else if(!strcmp("subtitle", part))
304 snprintf(buf, sizeof(buf), "elm.text.subtitle");
306 snprintf(buf, sizeof(buf), "%s", part);
308 EINA_INLIST_FOREACH(navi_it->text_list, pair)
310 if (!strcmp(buf, pair->part))
317 _item_content_set_hook(Elm_Object_Item *it,
319 Evas_Object *content)
321 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
323 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
326 if (!part || !strcmp("default", part))
328 _item_content_set(navi_it, content);
331 else if (!strcmp(part, "prev_btn"))
333 _title_prev_btn_set(navi_it, content, EINA_FALSE);
336 else if (!strcmp(part, "next_btn"))
338 _title_next_btn_set(navi_it, content);
341 else if (!strcmp(part, "icon"))
343 _title_icon_set(navi_it, content);
348 _title_content_set(navi_it, part, content);
352 _item_content_get_hook(const Elm_Object_Item *it, const char *part)
354 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
355 Elm_Naviframe_Content_Item_Pair *pair = NULL;
356 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
359 if (!part || !strcmp("default", part))
360 return navi_it->content;
361 else if (!strcmp(part, "prev_btn"))
362 return navi_it->title_prev_btn;
363 else if (!strcmp(part, "next_btn"))
364 return navi_it->title_next_btn;
365 else if (!strcmp(part, "icon"))
366 return navi_it->title_icon;
369 EINA_INLIST_FOREACH(navi_it->content_list, pair)
371 if (!strcmp(part, pair->part))
372 return pair->content;
378 _item_content_unset_hook(Elm_Object_Item *it, const char *part)
380 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
381 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
384 if (!part || !strcmp("default", part))
385 return _item_content_unset(navi_it);
386 else if (!strcmp(part, "prev_btn"))
387 return _title_prev_btn_unset(navi_it);
388 else if (!strcmp(part, "next_btn"))
389 return _title_next_btn_unset(navi_it);
390 else if (!strcmp(part, "icon"))
391 return _title_icon_unset(navi_it);
393 return _title_content_unset(navi_it, part);
397 _item_signal_emit_hook(Elm_Object_Item *it,
398 const char *emission,
401 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
402 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
403 edje_object_signal_emit(VIEW(navi_it), emission, source);
407 _item_title_visible_update(Elm_Naviframe_Item *navi_it)
409 if (navi_it->title_visible)
410 edje_object_signal_emit(VIEW(navi_it), "elm,state,title,show", "elm");
412 edje_object_signal_emit(VIEW(navi_it), "elm,state,title,hide", "elm");
416 _sizing_eval(Evas_Object *obj)
419 Elm_Naviframe_Item *it;
420 Evas_Coord x, y, w, h;
421 Evas_Coord minw = -1, minh = -1;
423 wd = elm_widget_data_get(obj);
426 EINA_INLIST_FOREACH(wd->stack, it)
428 evas_object_geometry_get(WIDGET(it), &x, &y, &w, &h);
429 evas_object_move(VIEW(it), x, y);
430 evas_object_resize(VIEW(it), w, h);
431 edje_object_size_min_calc(VIEW(it), &it->minw, &it->minh);
432 if (it->minw > minw) minw = it->minw;
433 if (it->minh > minh) minh = it->minh;
435 evas_object_size_hint_min_set(obj, minw, minh);
436 evas_object_size_hint_max_set(obj, -1, -1);
440 _move(void *data __UNUSED__,
443 void *event_info __UNUSED__)
449 _resize(void *data __UNUSED__,
452 void *event_info __UNUSED__)
458 _title_clicked(void *data,
459 Evas_Object *obj __UNUSED__,
460 const char *emission __UNUSED__,
461 const char *source __UNUSED__)
463 Elm_Naviframe_Item *it = data;
464 evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_CLICKED, it);
468 _back_btn_clicked(void *data,
470 void *event_info __UNUSED__)
472 /* Since edje has the event queue, clicked event could be happend multiple times
473 on some heavy environment. This callback del will prevent those scenario and
474 guarantee only one clicked for it's own page. */
475 evas_object_smart_callback_del(obj, "clicked", _back_btn_clicked);
476 elm_naviframe_item_pop(data);
480 _back_btn_new(Evas_Object *obj)
484 btn = elm_button_add(obj);
485 if (!btn) return NULL;
486 evas_object_smart_callback_add(btn, "clicked", _back_btn_clicked, obj);
487 snprintf(buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
488 elm_object_style_set(btn, buf);
493 _title_content_del(void *data,
495 Evas_Object *obj __UNUSED__,
496 void *event_info __UNUSED__)
499 Elm_Naviframe_Content_Item_Pair *pair = data;
500 Elm_Naviframe_Item *it = pair->it;
501 snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
502 edje_object_signal_emit(VIEW(it), buf, "elm");
503 it->content_list = eina_inlist_remove(it->content_list,
504 EINA_INLIST_GET(pair));
505 eina_stringshare_del(pair->part);
510 _title_prev_btn_del(void *data,
512 Evas_Object *obj __UNUSED__,
513 void *event_info __UNUSED__)
515 Elm_Naviframe_Item *it = data;
516 it->back_btn = EINA_FALSE;
517 it->title_prev_btn = NULL;
518 edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
522 _title_next_btn_del(void *data,
524 Evas_Object *obj __UNUSED__,
525 void *event_info __UNUSED__)
527 Elm_Naviframe_Item *it = data;
528 it->title_next_btn = NULL;
529 edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
533 _title_icon_del(void *data,
535 Evas_Object *obj __UNUSED__,
536 void *event_info __UNUSED__)
538 Elm_Naviframe_Item *it = data;
539 it->title_icon = NULL;
540 edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
544 _item_content_del(void *data,
546 Evas_Object *obj __UNUSED__,
547 void *event_info __UNUSED__)
549 Elm_Naviframe_Item *it = data;
551 edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
555 _title_content_set(Elm_Naviframe_Item *it,
557 Evas_Object *content)
560 Elm_Naviframe_Content_Item_Pair *pair = NULL;
562 EINA_INLIST_FOREACH(it->content_list, pair)
563 if (!strcmp(part, pair->part)) break;
567 if (pair->content != content)
571 evas_object_event_callback_del(pair->content,
574 evas_object_event_callback_del(pair->content,
575 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
576 _changed_size_hints);
577 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
578 edje_object_signal_emit(VIEW(it), buf, "elm");
580 evas_object_del(pair->content);
581 if (!content) return;
586 if (!content) return;
587 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
590 ERR("Failed to allocate new content part of the item! : naviframe=%p", WIDGET(it));
594 eina_stringshare_replace(&pair->part, part);
595 it->content_list = eina_inlist_append(it->content_list,
596 EINA_INLIST_GET(pair));
598 if (pair->content != content)
600 elm_widget_sub_object_add(WIDGET(it), content);
601 evas_object_event_callback_add(content,
605 evas_object_event_callback_add(content,
606 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
610 edje_object_part_swallow(VIEW(it), part, content);
611 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
612 edje_object_signal_emit(VIEW(it), buf, "elm");
613 pair->content = content;
615 _sizing_eval(WIDGET(it));
619 _title_prev_btn_set(Elm_Naviframe_Item *it,
623 if (it->title_prev_btn == btn) return;
625 if (it->title_prev_btn)
626 evas_object_del(it->title_prev_btn);
628 it->title_prev_btn = btn;
631 elm_widget_sub_object_add(WIDGET(it), btn);
632 evas_object_event_callback_add(btn,
636 evas_object_event_callback_add(btn,
637 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
640 edje_object_part_swallow(VIEW(it), "elm.swallow.prev_btn", btn);
641 edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
642 it->back_btn = back_btn;
644 _sizing_eval(WIDGET(it));
648 _title_next_btn_set(Elm_Naviframe_Item *it, Evas_Object *btn)
650 if (it->title_next_btn == btn) return;
652 if (it->title_next_btn)
653 evas_object_del(it->title_next_btn);
655 it->title_next_btn = btn;
658 elm_widget_sub_object_add(WIDGET(it), btn);
659 evas_object_event_callback_add(btn,
663 evas_object_event_callback_add(btn,
664 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
667 edje_object_part_swallow(VIEW(it), "elm.swallow.next_btn", btn);
668 edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
670 _sizing_eval(WIDGET(it));
674 _title_icon_set(Elm_Naviframe_Item *it, Evas_Object *icon)
676 if (it->title_icon == icon) return;
679 evas_object_del(it->title_icon);
681 it->title_icon = icon;
684 elm_widget_sub_object_add(WIDGET(it), icon);
685 evas_object_event_callback_add(icon,
689 evas_object_event_callback_add(icon,
690 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
693 edje_object_part_swallow(VIEW(it), "elm.swallow.icon", icon);
694 edje_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
696 _sizing_eval(WIDGET(it));
700 _item_content_unset(Elm_Naviframe_Item *it)
702 Evas_Object *content = it->content;
703 if (!content) return NULL;
705 elm_widget_sub_object_del(WIDGET(it), content);
706 edje_object_part_unswallow(VIEW(it), content);
707 edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
708 evas_object_event_callback_del(content,
711 evas_object_event_callback_del(content,
712 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
713 _changed_size_hints);
714 _sizing_eval(WIDGET(it));
721 _title_prev_btn_unset(Elm_Naviframe_Item *it)
723 Evas_Object *content = it->title_prev_btn;
724 if (!content) return NULL;
726 elm_widget_sub_object_del(WIDGET(it), content);
727 edje_object_part_unswallow(VIEW(it), content);
728 edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
729 evas_object_event_callback_del(content,
731 _title_prev_btn_del);
732 evas_object_event_callback_del(content,
733 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
734 _changed_size_hints);
735 _sizing_eval(WIDGET(it));
737 it->title_prev_btn = NULL;
742 _title_next_btn_unset(Elm_Naviframe_Item *it)
744 Evas_Object *content = it->title_next_btn;
745 if (!content) return NULL;
747 elm_widget_sub_object_del(WIDGET(it), content);
748 edje_object_part_unswallow(VIEW(it), content);
749 edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
750 evas_object_event_callback_del(content,
752 _title_next_btn_del);
753 evas_object_event_callback_del(content,
754 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
755 _changed_size_hints);
756 _sizing_eval(WIDGET(it));
758 it->title_next_btn = NULL;
763 _title_icon_unset(Elm_Naviframe_Item *it)
765 Evas_Object *content = it->title_icon;
766 if (!content) return NULL;
768 elm_widget_sub_object_del(WIDGET(it), content);
769 edje_object_part_unswallow(VIEW(it), content);
770 edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
771 evas_object_event_callback_del(content,
774 evas_object_event_callback_del(content,
775 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
776 _changed_size_hints);
777 _sizing_eval(WIDGET(it));
778 it->title_icon = NULL;
784 _title_content_unset(Elm_Naviframe_Item *it, const char *part)
786 Elm_Naviframe_Content_Item_Pair *pair = NULL;
788 Evas_Object *content = NULL;
790 EINA_INLIST_FOREACH(it->content_list, pair)
792 if (!strcmp(part, pair->part))
794 content = pair->content;
795 eina_stringshare_del(pair->part);
796 it->content_list = eina_inlist_remove(it->content_list,
797 EINA_INLIST_GET(pair));
803 if (!content) return NULL;
805 elm_widget_sub_object_del(WIDGET(it), content);
806 edje_object_part_unswallow(VIEW(it), content);
807 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
808 edje_object_signal_emit(VIEW(it), buf, "elm");
809 evas_object_event_callback_del(content,
812 evas_object_event_callback_del(content,
813 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
814 _changed_size_hints);
815 _sizing_eval(WIDGET(it));
821 _item_del(Elm_Naviframe_Item *it)
824 Elm_Naviframe_Content_Item_Pair *content_pair;
825 Elm_Naviframe_Text_Item_Pair *text_pair;
829 wd = elm_widget_data_get(WIDGET(it));
832 if (it->title_prev_btn)
833 evas_object_del(it->title_prev_btn);
834 if (it->title_next_btn)
835 evas_object_del(it->title_next_btn);
837 evas_object_del(it->title_icon);
838 if ((it->content) && (!wd->preserve))
839 evas_object_del(it->content);
841 while (it->content_list)
843 content_pair = EINA_INLIST_CONTAINER_GET(it->content_list,
844 Elm_Naviframe_Content_Item_Pair);
845 evas_object_event_callback_del(content_pair->content,
848 evas_object_event_callback_del(content_pair->content,
849 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
850 _changed_size_hints);
851 evas_object_del(content_pair->content);
852 eina_stringshare_del(content_pair->part);
853 it->content_list = eina_inlist_remove(it->content_list,
858 while (it->text_list)
860 text_pair = EINA_INLIST_CONTAINER_GET(it->text_list,
861 Elm_Naviframe_Text_Item_Pair);
862 eina_stringshare_del(text_pair->part);
863 eina_stringshare_del(text_pair->text);
864 it->text_list = eina_inlist_remove(it->text_list,
869 eina_stringshare_del(it->style);
871 elm_widget_item_del(it);
875 _pushed_finished(void *data,
876 Evas_Object *obj __UNUSED__,
877 const char *emission __UNUSED__,
878 const char *source __UNUSED__)
881 Elm_Naviframe_Item *it = data;
884 wd = elm_widget_data_get(WIDGET(it));
887 evas_object_hide(VIEW(it));
888 evas_object_smart_callback_call(WIDGET(it),
891 if (wd->freeze_events)
892 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
896 _popped_finished(void *data,
897 Evas_Object *obj __UNUSED__,
898 const char *emission __UNUSED__,
899 const char *source __UNUSED__)
901 Elm_Naviframe_Item *it = data;
903 evas_object_smart_callback_call(WIDGET(it),
910 _show_finished(void *data,
911 Evas_Object *obj __UNUSED__,
912 const char *emission __UNUSED__,
913 const char *source __UNUSED__)
915 Elm_Naviframe_Item *it;
920 wd = elm_widget_data_get(WIDGET(it));
923 evas_object_smart_callback_call(WIDGET(it),
924 SIG_TRANSITION_FINISHED,
926 if (wd->freeze_events)
927 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
931 _changed_size_hints(void *data,
933 Evas_Object *obj __UNUSED__,
934 void *event_info __UNUSED__)
940 _item_content_set(Elm_Naviframe_Item *navi_it, Evas_Object *content)
942 if (navi_it->content == content) return;
943 if (navi_it->content) evas_object_del(navi_it->content);
944 elm_widget_sub_object_add(WIDGET(navi_it), content);
945 edje_object_part_swallow(VIEW(navi_it),
946 "elm.swallow.content",
949 edje_object_signal_emit(VIEW(navi_it),
950 "elm,state,content,show",
953 edje_object_signal_emit(VIEW(navi_it),
954 "elm,state,content,hide",
956 evas_object_event_callback_add(content,
960 evas_object_event_callback_add(content,
961 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
964 navi_it->content = content;
965 _sizing_eval(WIDGET(navi_it));
968 //FIXME: need to handle if this function is called while transition
970 _item_style_set(Elm_Naviframe_Item *navi_it, const char *item_style)
972 Elm_Naviframe_Content_Item_Pair *content_pair;
973 Elm_Naviframe_Text_Item_Pair *text_pair;
980 sprintf(buf, "item/basic");
981 eina_stringshare_replace(&navi_it->style, "basic");
985 if (strlen(item_style) > sizeof(buf))
986 WRN("too much long style name! : naviframe=%p", WIDGET(navi_it));
987 sprintf(buf, "item/%s", item_style);
988 eina_stringshare_replace(&navi_it->style, item_style);
990 _elm_theme_object_set(WIDGET(navi_it),
994 elm_widget_style_get(WIDGET(navi_it)));
996 EINA_INLIST_FOREACH(navi_it->text_list, text_pair)
997 _item_text_set_hook((Elm_Object_Item *) navi_it,
1001 EINA_INLIST_FOREACH(navi_it->content_list, content_pair)
1002 _item_content_set_hook((Elm_Object_Item *) navi_it,
1004 content_pair->content);
1006 if (navi_it->content)
1008 edje_object_part_swallow(VIEW(navi_it),
1009 "elm.swallow.content",
1011 edje_object_signal_emit(VIEW(navi_it),
1012 "elm,state,content,show",
1017 if (navi_it->title_prev_btn)
1019 edje_object_part_swallow(VIEW(navi_it),
1020 "elm.swallow.prev_btn",
1021 navi_it->title_prev_btn);
1022 edje_object_signal_emit(VIEW(navi_it),
1023 "elm,state,prev_btn,show",
1028 if (navi_it->title_next_btn)
1030 edje_object_part_swallow(VIEW(navi_it),
1031 "elm.swallow.next_btn",
1032 navi_it->title_next_btn);
1033 edje_object_signal_emit(VIEW(navi_it),
1034 "elm,state,next_btn,show",
1038 navi_it->title_visible = EINA_TRUE;
1039 _sizing_eval(WIDGET(navi_it));
1041 wd = elm_widget_data_get(WIDGET(navi_it));
1044 if (wd->freeze_events)
1045 evas_object_freeze_events_set(VIEW(navi_it), EINA_FALSE);
1048 static Elm_Naviframe_Item *
1049 _item_new(Evas_Object *obj,
1050 const char *title_label,
1051 Evas_Object *prev_btn,
1052 Evas_Object *next_btn,
1053 Evas_Object *content,
1054 const char *item_style)
1056 Widget_Data *wd = elm_widget_data_get(obj);
1059 Elm_Naviframe_Item *it = elm_widget_item_new(obj, Elm_Naviframe_Item);
1062 ERR("Failed to allocate new item! : naviframe=%p", obj);
1066 elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
1067 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
1068 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
1069 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
1070 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
1071 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
1074 VIEW(it) = edje_object_add(evas_object_evas_get(obj));
1075 edje_object_mirrored_set(VIEW(it), elm_widget_mirrored_get(obj));
1076 evas_object_smart_member_add(VIEW(it), wd->base);
1077 elm_widget_sub_object_add(obj, VIEW(it));
1078 edje_object_signal_callback_add(VIEW(it),
1079 "elm,action,show,finished",
1081 _show_finished, it);
1082 edje_object_signal_callback_add(VIEW(it),
1083 "elm,action,pushed,finished",
1085 _pushed_finished, it);
1086 edje_object_signal_callback_add(VIEW(it),
1087 "elm,action,popped,finished",
1089 _popped_finished, it);
1090 edje_object_signal_callback_add(VIEW(it),
1091 "elm,action,title,clicked",
1093 _title_clicked, it);
1095 _item_style_set(it, item_style);
1096 _item_text_set_hook((Elm_Object_Item *) it, "elm.text.title", title_label);
1099 if ((!prev_btn) && wd->auto_pushed && eina_inlist_count(wd->stack))
1101 prev_btn = _back_btn_new(obj);
1102 _title_prev_btn_set(it, prev_btn, EINA_TRUE);
1105 _title_prev_btn_set(it, prev_btn, EINA_FALSE);
1107 _title_next_btn_set(it, next_btn);
1108 _item_content_set(it, content);
1109 it->title_visible = EINA_TRUE;
1114 elm_naviframe_add(Evas_Object *parent)
1120 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
1121 ELM_SET_WIDTYPE(widtype, "naviframe");
1122 elm_widget_type_set(obj, "naviframe");
1123 elm_widget_sub_object_add(parent, obj);
1124 elm_widget_data_set(obj, wd);
1125 elm_widget_del_hook_set(obj, _del_hook);
1126 elm_widget_disable_hook_set(obj, _disable_hook);
1127 elm_widget_theme_hook_set(obj, _theme_hook);
1128 elm_widget_signal_emit_hook_set(obj, _emit_hook);
1131 wd->base = edje_object_add(e);
1132 edje_object_mirrored_set(wd->base, elm_widget_mirrored_get(obj));
1133 elm_widget_resize_object_set(obj, wd->base);
1134 _elm_theme_object_set(obj, wd->base, "naviframe", "base", "default");
1136 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, obj);
1137 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
1138 evas_object_smart_callbacks_descriptions_set(obj, _signals);
1140 wd->auto_pushed = EINA_TRUE;
1141 wd->freeze_events = EINA_TRUE;
1146 EAPI Elm_Object_Item *
1147 elm_naviframe_item_push(Evas_Object *obj,
1148 const char *title_label,
1149 Evas_Object *prev_btn,
1150 Evas_Object *next_btn,
1151 Evas_Object *content,
1152 const char *item_style)
1154 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1156 Elm_Naviframe_Item *prev_it, *it;
1158 wd = elm_widget_data_get(obj);
1159 if (!wd) return NULL;
1161 it = _item_new(obj, title_label, prev_btn, next_btn, content, item_style);
1162 if (!it) return NULL;
1164 evas_object_show(VIEW(it));
1166 prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1169 if (wd->freeze_events)
1171 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1172 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1174 edje_object_signal_emit(VIEW(prev_it),
1175 "elm,state,cur,pushed",
1177 edje_object_signal_emit(VIEW(it),
1178 "elm,state,new,pushed",
1180 edje_object_message_signal_process(VIEW(prev_it));
1181 edje_object_message_signal_process(VIEW(it));
1183 wd->stack = eina_inlist_append(wd->stack, EINA_INLIST_GET(it));
1185 return (Elm_Object_Item *) it;
1188 EAPI Elm_Object_Item *
1189 elm_naviframe_item_insert_before(Elm_Object_Item *before,
1190 const char *title_label,
1191 Evas_Object *prev_btn,
1192 Evas_Object *next_btn,
1193 Evas_Object *content,
1194 const char *item_style)
1196 ELM_OBJ_ITEM_CHECK_OR_RETURN(before, NULL);
1197 Elm_Naviframe_Item *it;
1200 wd = elm_widget_data_get(WIDGET(before));
1201 if (!wd) return NULL;
1203 it = _item_new(WIDGET(before), title_label, prev_btn, next_btn, content,
1205 if (!it) return NULL;
1208 eina_inlist_prepend_relative(wd->stack, EINA_INLIST_GET(it),
1209 EINA_INLIST_GET(((Elm_Naviframe_Item *) before)));
1210 _sizing_eval(WIDGET(before));
1211 return (Elm_Object_Item *) it;
1214 EAPI Elm_Object_Item *
1215 elm_naviframe_item_insert_after(Elm_Object_Item *after,
1216 const char *title_label,
1217 Evas_Object *prev_btn,
1218 Evas_Object *next_btn,
1219 Evas_Object *content,
1220 const char *item_style)
1222 ELM_OBJ_ITEM_CHECK_OR_RETURN(after, NULL);
1223 Elm_Naviframe_Item *it;
1226 wd = elm_widget_data_get(WIDGET(after));
1227 if (!wd) return NULL;
1229 it = _item_new(WIDGET(after), title_label, prev_btn, next_btn, content,
1231 if (!it) return NULL;
1233 if (elm_naviframe_top_item_get(WIDGET(after)) == after)
1235 evas_object_hide(VIEW(after));
1236 evas_object_show(VIEW(it));
1239 eina_inlist_append_relative(wd->stack, EINA_INLIST_GET(it),
1240 EINA_INLIST_GET(((Elm_Naviframe_Item *) after)));
1241 _sizing_eval(WIDGET(after));
1242 return (Elm_Object_Item *) it;
1246 elm_naviframe_item_pop(Evas_Object *obj)
1248 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1249 Elm_Naviframe_Item *it, *prev_it = NULL;
1251 Evas_Object *content = NULL;
1253 wd = elm_widget_data_get(obj);
1254 if (!wd) return NULL;
1256 it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(obj);
1257 if (!it) return NULL;
1258 elm_widget_tree_unfocusable_set(it->content, EINA_TRUE);
1260 content = it->content;
1262 if (wd->stack->last->prev)
1263 prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
1264 Elm_Naviframe_Item);
1265 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(it));
1268 if (wd->freeze_events)
1270 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1271 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1273 edje_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1274 evas_object_show(VIEW(prev_it));
1275 evas_object_raise(VIEW(prev_it));
1276 edje_object_signal_emit(VIEW(prev_it),
1277 "elm,state,prev,popped",
1279 edje_object_message_signal_process(VIEW(it));
1280 edje_object_message_signal_process(VIEW(prev_it));
1289 elm_naviframe_item_pop_to(Elm_Object_Item *it)
1291 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1292 Elm_Naviframe_Item *navi_it;
1294 Eina_Inlist *l, *prev_l;
1296 navi_it = (Elm_Naviframe_Item *) it;
1297 wd = elm_widget_data_get(WIDGET(navi_it));
1300 if (it == elm_naviframe_top_item_get(WIDGET(navi_it))) return;
1302 l = wd->stack->last->prev;
1306 if (EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item) ==
1307 ((Elm_Naviframe_Item *) it)) break;
1309 wd->stack = eina_inlist_remove(wd->stack, l);
1310 _item_del(EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item));
1313 elm_naviframe_item_pop(WIDGET(navi_it));
1317 elm_naviframe_item_promote(Elm_Object_Item *it)
1319 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1320 Elm_Naviframe_Item *navi_it;
1321 Elm_Naviframe_Item *prev_it;
1324 navi_it = (Elm_Naviframe_Item *) it;
1325 wd = elm_widget_data_get(navi_it->base.widget);
1328 if (it == elm_naviframe_top_item_get(navi_it->base.widget)) return;
1329 wd->stack = eina_inlist_demote(wd->stack, EINA_INLIST_GET(navi_it));
1330 prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
1331 Elm_Naviframe_Item);
1332 if (wd->freeze_events)
1334 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1335 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1337 edje_object_signal_emit(VIEW(prev_it),
1338 "elm,state,cur,pushed",
1340 evas_object_show(VIEW(navi_it));
1341 evas_object_raise(VIEW(navi_it));
1342 edje_object_signal_emit(VIEW(navi_it),
1343 "elm,state,new,pushed",
1345 edje_object_message_signal_process(VIEW(prev_it));
1346 edje_object_message_signal_process(VIEW(navi_it));
1350 elm_naviframe_item_del(Elm_Object_Item *it)
1352 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1353 Elm_Naviframe_Item *navi_it;
1356 navi_it =(Elm_Naviframe_Item *) it;
1357 wd = elm_widget_data_get(WIDGET(navi_it));
1360 if (it == elm_naviframe_top_item_get(WIDGET(navi_it)))
1362 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
1364 //If the item is only one, the stack will be empty
1365 if (!wd->stack) return;
1366 navi_it = EINA_INLIST_CONTAINER_GET(wd->stack->last,
1367 Elm_Naviframe_Item);
1368 evas_object_show(VIEW(navi_it));
1369 evas_object_raise(VIEW(navi_it));
1370 edje_object_signal_emit(VIEW(navi_it), "elm,state,visible", "elm");
1374 wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(navi_it));
1380 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj, Eina_Bool preserve)
1382 ELM_CHECK_WIDTYPE(obj, widtype);
1383 Widget_Data *wd = elm_widget_data_get(obj);
1385 wd->preserve = !!preserve;
1389 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
1391 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1392 Widget_Data *wd = elm_widget_data_get(obj);
1393 if (!wd) return EINA_FALSE;
1394 return wd->preserve;
1397 EAPI Elm_Object_Item*
1398 elm_naviframe_top_item_get(const Evas_Object *obj)
1400 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1401 Widget_Data *wd = elm_widget_data_get(obj);
1402 if ((!wd) || (!wd->stack)) return NULL;
1403 return (Elm_Object_Item *) (EINA_INLIST_CONTAINER_GET(wd->stack->last,
1404 Elm_Naviframe_Item));
1407 EAPI Elm_Object_Item*
1408 elm_naviframe_bottom_item_get(const Evas_Object *obj)
1410 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1411 Widget_Data *wd = elm_widget_data_get(obj);
1412 if ((!wd) || (!wd->stack)) return NULL;
1413 return (Elm_Object_Item *) (EINA_INLIST_CONTAINER_GET(wd->stack,
1414 Elm_Naviframe_Item));
1418 elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style)
1420 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1421 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1423 //Return if new style is exsiting one.
1425 if (!strcmp(item_style, navi_it->style)) return;
1428 if (!strcmp("basic", navi_it->style)) return;
1430 _item_style_set(navi_it, item_style);
1434 elm_naviframe_item_style_get(const Elm_Object_Item *it)
1436 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
1437 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1438 return navi_it->style;
1442 elm_naviframe_item_title_visible_set(Elm_Object_Item *it, Eina_Bool visible)
1444 ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
1445 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1447 visible = !!visible;
1448 if (navi_it->title_visible == visible) return;
1450 navi_it->title_visible = visible;
1451 _item_title_visible_update(navi_it);
1455 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
1457 ELM_OBJ_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
1458 Elm_Naviframe_Item *navi_it = (Elm_Naviframe_Item *) it;
1459 return navi_it->title_visible;
1463 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj, Eina_Bool auto_pushed)
1465 ELM_CHECK_WIDTYPE(obj, widtype);
1466 Widget_Data *wd = elm_widget_data_get(obj);
1468 wd->auto_pushed = !!auto_pushed;
1472 elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
1474 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1475 Widget_Data *wd = elm_widget_data_get(obj);
1476 if (!wd) return EINA_FALSE;
1477 return wd->auto_pushed;
1481 elm_naviframe_items_get(const Evas_Object *obj)
1483 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1484 Widget_Data *wd = elm_widget_data_get(obj);
1485 if (!wd) return NULL;
1490 elm_naviframe_event_enabled_set(Evas_Object *obj, Eina_Bool enabled)
1492 ELM_CHECK_WIDTYPE(obj, widtype);
1493 Widget_Data *wd = elm_widget_data_get(obj);
1495 enabled = !!enabled;
1496 if (wd->freeze_events == !enabled) return;
1497 wd->freeze_events = !enabled;
1501 elm_naviframe_event_enabled_get(const Evas_Object *obj)
1503 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1504 Widget_Data *wd = elm_widget_data_get(obj);
1505 if (!wd) return EINA_FALSE;
1506 return !wd->freeze_events;