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 (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
1360 //Tizen Only: Need to customize the "Escape" Key
1361 if (strcmp(ev->keyname, "Escape")) return EINA_FALSE;
1363 it = elm_naviframe_top_item_get(obj);
1364 if (!it) return EINA_FALSE;
1366 if (it->title_prev_btn)
1367 evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
1369 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1375 _elm_naviframe_smart_activate(Evas_Object *obj, Elm_Activate act)
1377 Elm_Naviframe_Item *it;
1379 if (act != ELM_ACTIVATE_BACK) return EINA_FALSE;
1380 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
1382 it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1383 if (!it) return EINA_FALSE;
1385 if (it->title_prev_btn)
1386 evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
1392 _elm_naviframe_smart_set_user(Elm_Naviframe_Smart_Class *sc)
1394 ELM_WIDGET_CLASS(sc)->base.add = _elm_naviframe_smart_add;
1395 ELM_WIDGET_CLASS(sc)->base.del = _elm_naviframe_smart_del;
1397 ELM_WIDGET_CLASS(sc)->theme = _elm_naviframe_smart_theme;
1398 ELM_WIDGET_CLASS(sc)->focus_next = _elm_naviframe_smart_focus_next;
1399 ELM_WIDGET_CLASS(sc)->focus_direction = _elm_naviframe_smart_focus_direction;
1400 ELM_WIDGET_CLASS(sc)->access = _elm_naviframe_smart_access;
1401 ELM_WIDGET_CLASS(sc)->event = _elm_naviframe_smart_event;
1402 ELM_WIDGET_CLASS(sc)->activate = _elm_naviframe_smart_activate;
1404 ELM_CONTAINER_CLASS(sc)->content_set = _elm_naviframe_smart_content_set;
1405 ELM_CONTAINER_CLASS(sc)->content_get = _elm_naviframe_smart_content_get;
1406 ELM_CONTAINER_CLASS(sc)->content_unset = _elm_naviframe_smart_content_unset;
1408 ELM_LAYOUT_CLASS(sc)->signal = _elm_naviframe_smart_signal;
1409 ELM_LAYOUT_CLASS(sc)->callback_add = _elm_naviframe_smart_signal_callback_add;
1410 ELM_LAYOUT_CLASS(sc)->text_set = _elm_naviframe_smart_text_set;
1411 ELM_LAYOUT_CLASS(sc)->text_get = _elm_naviframe_smart_text_get;
1412 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_naviframe_smart_sizing_eval;
1416 _push_transition_cb(void *data)
1418 Elm_Naviframe_Item *prev_it, *it = data;
1420 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1422 it->animator = NULL;
1424 if (sd->stack->last->prev)
1426 prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last->prev,
1427 Elm_Naviframe_Item);
1428 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
1430 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1432 elm_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
1433 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1435 return ECORE_CALLBACK_CANCEL;
1438 EAPI const Elm_Naviframe_Smart_Class *
1439 elm_naviframe_smart_class_get(void)
1441 static Elm_Naviframe_Smart_Class _sc =
1442 ELM_NAVIFRAME_SMART_CLASS_INIT_NAME_VERSION
1443 (ELM_NAVIFRAME_SMART_NAME);
1444 static const Elm_Naviframe_Smart_Class *class = NULL;
1445 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
1450 _elm_naviframe_smart_set(&_sc);
1451 esc->callbacks = _smart_callbacks;
1458 elm_naviframe_add(Evas_Object *parent)
1462 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1464 obj = elm_widget_add(_elm_naviframe_smart_class_new(), parent);
1465 if (!obj) return NULL;
1467 if (!elm_widget_sub_object_add(parent, obj))
1468 ERR("could not add %p as sub object of %p", obj, parent);
1470 _elm_widget_orient_signal_emit(obj);
1475 EAPI Elm_Object_Item *
1476 elm_naviframe_item_push(Evas_Object *obj,
1477 const char *title_label,
1478 Evas_Object *prev_btn,
1479 Evas_Object *next_btn,
1480 Evas_Object *content,
1481 const char *item_style)
1483 Elm_Naviframe_Item *prev_it, *it;
1485 ELM_NAVIFRAME_CHECK(obj) NULL;
1487 ELM_NAVIFRAME_DATA_GET(obj, sd);
1489 prev_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1490 it = _item_new(obj, prev_it,
1491 title_label, prev_btn, next_btn, content, item_style);
1492 if (!it) return NULL;
1494 evas_object_show(VIEW(it));
1495 elm_widget_resize_object_set(obj, VIEW(it));
1497 elm_widget_sub_object_add(obj, VIEW(prev_it));
1498 evas_object_smart_member_add(sd->dummy_edje, obj);
1502 /* re-add as smart member */
1503 evas_object_smart_member_add(VIEW(prev_it), obj);
1505 if (sd->freeze_events)
1507 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1508 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1511 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
1512 elm_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
1513 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1514 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1516 prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
1517 elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE);
1519 it->animator = ecore_animator_add(_push_transition_cb, it);
1522 elm_object_focus_set(VIEW(it), EINA_TRUE);
1524 sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it));
1525 evas_object_raise(VIEW(it));
1528 if (_elm_config->access_mode) _access_focus_set(it);
1530 elm_layout_sizing_eval(obj);
1532 return (Elm_Object_Item *)it;
1535 EAPI Elm_Object_Item *
1536 elm_naviframe_item_insert_before(Evas_Object *obj,
1537 Elm_Object_Item *before,
1538 const char *title_label,
1539 Evas_Object *prev_btn,
1540 Evas_Object *next_btn,
1541 Evas_Object *content,
1542 const char *item_style)
1544 Elm_Naviframe_Item *it, *prev_it = NULL;
1546 ELM_NAVIFRAME_CHECK(obj) NULL;
1547 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
1548 ELM_NAVIFRAME_DATA_GET(obj, sd);
1550 it = (Elm_Naviframe_Item *)before;
1551 if (EINA_INLIST_GET(it)->prev)
1552 prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
1553 Elm_Naviframe_Item);
1554 it = _item_new(obj, prev_it,
1555 title_label, prev_btn, next_btn, content, item_style);
1556 if (!it) return NULL;
1558 sd->stack = eina_inlist_prepend_relative
1559 (sd->stack, EINA_INLIST_GET(it),
1560 EINA_INLIST_GET(((Elm_Naviframe_Item *)before)));
1562 elm_layout_sizing_eval(obj);
1564 return (Elm_Object_Item *)it;
1567 EAPI Elm_Object_Item *
1568 elm_naviframe_item_insert_after(Evas_Object *obj,
1569 Elm_Object_Item *after,
1570 const char *title_label,
1571 Evas_Object *prev_btn,
1572 Evas_Object *next_btn,
1573 Evas_Object *content,
1574 const char *item_style)
1576 Elm_Naviframe_Item *it;
1577 Eina_Bool top_inserted = EINA_FALSE;
1579 ELM_NAVIFRAME_CHECK(obj) NULL;
1580 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
1581 ELM_NAVIFRAME_DATA_GET(obj, sd);
1583 it = _item_new(obj, (Elm_Naviframe_Item *)after,
1584 title_label, prev_btn, next_btn, content, item_style);
1585 if (!it) return NULL;
1587 if (elm_naviframe_top_item_get(obj) == after) top_inserted = EINA_TRUE;
1589 sd->stack = eina_inlist_append_relative
1590 (sd->stack, EINA_INLIST_GET(it),
1591 EINA_INLIST_GET(((Elm_Naviframe_Item *)after)));
1595 elm_widget_resize_object_set(obj, VIEW(it));
1596 elm_widget_sub_object_add(obj, VIEW(after));
1597 evas_object_smart_member_add(sd->dummy_edje, obj);
1598 evas_object_show(VIEW(it));
1599 evas_object_hide(VIEW(after));
1600 elm_object_focus_set(VIEW(it), EINA_TRUE);
1604 if (_elm_config->access_mode) _access_focus_set(it);
1606 elm_layout_sizing_eval(obj);
1608 return (Elm_Object_Item *)it;
1612 elm_naviframe_item_pop(Evas_Object *obj)
1614 Elm_Naviframe_Item *it, *prev_it = NULL;
1615 Evas_Object *content = NULL;
1617 ELM_NAVIFRAME_CHECK(obj) NULL;
1618 ELM_NAVIFRAME_DATA_GET(obj, sd);
1620 it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1621 if (!it) return NULL;
1623 if (it->pop_cb) it->pop_cb(it->pop_data, (Elm_Object_Item *)it);
1626 content = it->content;
1628 evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
1630 it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(it));
1631 elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
1633 if (sd->stack->last->prev)
1634 prev_it = EINA_INLIST_CONTAINER_GET
1635 (sd->stack->last->prev, Elm_Naviframe_Item);
1637 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
1638 if (!sd->stack) elm_widget_resize_object_set(obj, sd->dummy_edje);
1642 if (sd->freeze_events)
1644 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1645 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1648 elm_widget_resize_object_set(obj, VIEW(prev_it));
1649 evas_object_smart_member_add(sd->dummy_edje, obj);
1650 evas_object_raise(VIEW(prev_it));
1653 if (_elm_config->access_mode) _access_focus_set(prev_it);
1655 /* these 2 signals MUST take place simultaneously */
1656 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1657 evas_object_show(VIEW(prev_it));
1658 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
1660 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1661 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1663 if (it->animator) ecore_animator_del(it->animator);
1664 it->animator = ecore_animator_add(_pop_transition_cb, it);
1665 sd->popping = eina_list_append(sd->popping, it);
1668 elm_widget_item_del(it);
1674 elm_naviframe_item_pop_to(Elm_Object_Item *it)
1676 Elm_Naviframe_Item *nit;
1677 Eina_Inlist *l, *prev_l;
1679 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1681 nit = (Elm_Naviframe_Item *)it;
1682 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
1684 if (it == elm_naviframe_top_item_get(WIDGET(nit))) return;
1686 l = sd->stack->last->prev;
1688 sd->on_deletion = EINA_TRUE;
1692 Elm_Naviframe_Item *iit = EINA_INLIST_CONTAINER_GET
1693 (l, Elm_Naviframe_Item);
1695 if (iit == nit) break;
1698 sd->stack = eina_inlist_remove(sd->stack, l);
1700 elm_widget_item_del(iit);
1705 sd->on_deletion = EINA_FALSE;
1707 elm_naviframe_item_pop(WIDGET(nit));
1711 elm_naviframe_item_promote(Elm_Object_Item *it)
1713 Elm_Object_Item *prev_top;
1714 Elm_Naviframe_Item *nit;
1715 Elm_Naviframe_Item *prev_it;
1717 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1719 nit = (Elm_Naviframe_Item *)it;
1720 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
1722 prev_top = elm_naviframe_top_item_get(WIDGET(nit));
1723 if (it == prev_top) return;
1725 /* remember, last is 1st on the naviframe, push it to last pos. */
1726 sd->stack = eina_inlist_demote(sd->stack, EINA_INLIST_GET(nit));
1728 elm_widget_resize_object_set(WIDGET(it), VIEW(nit));
1729 elm_widget_sub_object_add(WIDGET(it), VIEW(prev_top));
1730 evas_object_smart_member_add(sd->dummy_edje, WIDGET(it));
1732 /* this was the previous top one */
1733 prev_it = EINA_INLIST_CONTAINER_GET
1734 (sd->stack->last->prev, Elm_Naviframe_Item);
1736 /* re-add as smart member */
1737 evas_object_smart_member_add(VIEW(prev_it), WIDGET(it));
1739 prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
1740 elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
1742 if (sd->freeze_events)
1744 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1745 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1748 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
1750 evas_object_show(VIEW(nit));
1751 evas_object_raise(VIEW(nit));
1753 elm_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
1755 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1756 edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
1757 if (nit->animator) ecore_animator_del(nit->animator);
1758 nit->animator = ecore_animator_add(_push_transition_cb, nit);
1761 if (_elm_config->access_mode) _access_focus_set(nit);
1765 elm_naviframe_item_simple_promote(Evas_Object *obj,
1766 Evas_Object *content)
1768 Elm_Naviframe_Item *itr;
1770 ELM_NAVIFRAME_CHECK(obj);
1771 ELM_NAVIFRAME_DATA_GET(obj, sd);
1773 EINA_INLIST_FOREACH(sd->stack, itr)
1775 if (elm_object_item_content_get((Elm_Object_Item *)itr) == content)
1777 elm_naviframe_item_promote((Elm_Object_Item *)itr);
1784 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj,
1787 ELM_NAVIFRAME_CHECK(obj);
1788 ELM_NAVIFRAME_DATA_GET(obj, sd);
1790 sd->preserve = !!preserve;
1794 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
1796 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1797 ELM_NAVIFRAME_DATA_GET(obj, sd);
1799 return sd->preserve;
1802 EAPI Elm_Object_Item *
1803 elm_naviframe_top_item_get(const Evas_Object *obj)
1805 ELM_NAVIFRAME_CHECK(obj) NULL;
1806 ELM_NAVIFRAME_DATA_GET(obj, sd);
1808 if (!sd->stack) return NULL;
1809 return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
1810 (sd->stack->last, Elm_Naviframe_Item));
1813 EAPI Elm_Object_Item *
1814 elm_naviframe_bottom_item_get(const Evas_Object *obj)
1816 ELM_NAVIFRAME_CHECK(obj) NULL;
1817 ELM_NAVIFRAME_DATA_GET(obj, sd);
1819 if (!sd->stack) return NULL;
1820 return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
1821 (sd->stack, Elm_Naviframe_Item));
1825 elm_naviframe_item_style_set(Elm_Object_Item *it,
1826 const char *item_style)
1828 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1830 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1832 if (item_style && !strcmp(item_style, nit->style)) return;
1835 if (!strcmp("basic", nit->style)) return;
1837 _item_style_set(nit, item_style);
1838 _item_signals_emit(nit);
1839 _item_title_visible_update(nit);
1843 elm_naviframe_item_style_get(const Elm_Object_Item *it)
1845 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1847 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, NULL);
1853 elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
1856 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1858 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1860 visible = !!visible;
1861 if (nit->title_visible == visible) return;
1863 nit->title_visible = visible;
1864 _item_title_visible_update(nit);
1868 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
1870 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1872 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
1874 return nit->title_visible;
1878 elm_naviframe_item_pop_cb_set(Elm_Object_Item *it, Elm_Naviframe_Item_Pop_Cb func, void *data)
1880 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1882 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1885 nit->pop_data = data;
1889 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj,
1890 Eina_Bool auto_pushed)
1892 ELM_NAVIFRAME_CHECK(obj);
1893 ELM_NAVIFRAME_DATA_GET(obj, sd);
1895 sd->auto_pushed = !!auto_pushed;
1899 elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
1901 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1902 ELM_NAVIFRAME_DATA_GET(obj, sd);
1904 return sd->auto_pushed;
1908 elm_naviframe_items_get(const Evas_Object *obj)
1910 Eina_List *ret = NULL;
1911 Elm_Naviframe_Item *itr;
1913 ELM_NAVIFRAME_CHECK(obj) NULL;
1914 ELM_NAVIFRAME_DATA_GET(obj, sd);
1916 EINA_INLIST_FOREACH(sd->stack, itr)
1917 ret = eina_list_append(ret, itr);
1923 elm_naviframe_event_enabled_set(Evas_Object *obj,
1926 ELM_NAVIFRAME_CHECK(obj);
1927 ELM_NAVIFRAME_DATA_GET(obj, sd);
1929 enabled = !!enabled;
1930 if (sd->freeze_events == !enabled) return;
1931 sd->freeze_events = !enabled;
1935 elm_naviframe_event_enabled_get(const Evas_Object *obj)
1937 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1938 ELM_NAVIFRAME_DATA_GET(obj, sd);
1940 return !sd->freeze_events;