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 (nit->content && !sd->on_deletion)
464 nit->content_unfocusable =
465 elm_widget_tree_unfocusable_get(nit->content);
466 elm_widget_tree_unfocusable_set(nit->content, EINA_TRUE);
469 if (sd->stack->last->prev)
470 prev_it = EINA_INLIST_CONTAINER_GET
471 (sd->stack->last->prev, Elm_Naviframe_Item);
473 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
474 if (!sd->stack) elm_widget_resize_object_set(WIDGET(it), sd->dummy_edje);
476 if (top && !sd->on_deletion) /* must raise another one */
478 if (!prev_it) goto end;
480 if (sd->freeze_events)
482 evas_object_freeze_events_set(VIEW(prev_it), EINA_FALSE);
484 elm_widget_resize_object_set(WIDGET(prev_it), VIEW(prev_it));
485 evas_object_show(VIEW(prev_it));
486 evas_object_raise(VIEW(prev_it));
488 elm_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
499 _item_content_set(Elm_Naviframe_Item *it,
500 Evas_Object *content)
502 if (it->content == content) return;
504 if (it->content) evas_object_del(it->content);
505 it->content = content;
507 if (!content) return;
509 elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
510 elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
512 evas_object_event_callback_add
513 (content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
517 _item_title_prev_btn_set(Elm_Naviframe_Item *it,
520 if (it->title_prev_btn == btn) return;
521 if (it->title_prev_btn) evas_object_del(it->title_prev_btn);
522 it->title_prev_btn = btn;
525 elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
526 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
527 evas_object_event_callback_add
528 (btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
532 _item_title_next_btn_set(Elm_Naviframe_Item *it,
535 if (it->title_next_btn == btn) return;
536 if (it->title_next_btn) evas_object_del(it->title_next_btn);
537 it->title_next_btn = btn;
540 elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
541 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
543 evas_object_event_callback_add
544 (btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
548 _item_title_icon_set(Elm_Naviframe_Item *it,
551 if (it->title_icon == icon) return;
552 if (it->title_icon) evas_object_del(it->title_icon);
553 it->title_icon = icon;
556 elm_object_part_content_set(VIEW(it), ICON_PART, icon);
557 elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
559 evas_object_event_callback_add
560 (icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
564 _item_content_unset(Elm_Naviframe_Item *it)
566 Evas_Object *content = it->content;
568 if (!content) return NULL;
570 elm_object_part_content_unset(VIEW(it), CONTENT_PART);
571 elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
573 evas_object_event_callback_del
574 (content, EVAS_CALLBACK_DEL, _item_content_del_cb);
581 _item_title_prev_btn_unset(Elm_Naviframe_Item *it)
583 Evas_Object *content = it->title_prev_btn;
585 if (!content) return NULL;
587 elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
588 elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
590 evas_object_event_callback_del
591 (content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
593 it->title_prev_btn = NULL;
598 _item_title_next_btn_unset(Elm_Naviframe_Item *it)
600 Evas_Object *content = it->title_next_btn;
602 if (!content) return NULL;
604 elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
605 elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
607 evas_object_event_callback_del
608 (content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
610 it->title_next_btn = NULL;
615 _item_title_icon_unset(Elm_Naviframe_Item *it)
617 Evas_Object *content = it->title_icon;
619 if (!content) return NULL;
621 elm_object_part_content_unset(VIEW(it), ICON_PART);
622 elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
624 evas_object_event_callback_del
625 (content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
627 it->title_icon = NULL;
631 /* since we have each item as layout, we can't reusing the layout's
632 * aliasing, so let's do it ourselves */
634 _part_aliasing_eval(const char **part)
636 if (!*part || !strcmp("default", *part))
637 *part = CONTENT_PART;
638 else if (!strcmp(*part, "prev_btn"))
639 *part = PREV_BTN_PART;
640 else if (!strcmp(*part, "next_btn"))
641 *part = NEXT_BTN_PART;
642 else if (!strcmp(*part, "icon"))
647 _title_content_set(Elm_Naviframe_Item *it,
649 Evas_Object *content)
651 Elm_Naviframe_Content_Item_Pair *pair = NULL;
654 EINA_INLIST_FOREACH(it->content_list, pair)
655 if (!strcmp(part, pair->part)) break;
658 if (pair->content == content) return;
660 evas_object_event_callback_del(pair->content,
663 if (content) elm_object_part_content_set(VIEW(it), part, content);
667 if (!content) return;
669 //Remove the pair if new content was swallowed into other part.
670 EINA_INLIST_FOREACH(it->content_list, pair)
672 if (pair->content == content)
674 eina_stringshare_del(pair->part);
675 it->content_list = eina_inlist_remove(it->content_list,
676 EINA_INLIST_GET(pair));
677 evas_object_event_callback_del(pair->content,
686 pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
689 ERR("Failed to allocate new content part of the item! : naviframe=%p",
694 eina_stringshare_replace(&pair->part, part);
695 it->content_list = eina_inlist_append(it->content_list,
696 EINA_INLIST_GET(pair));
697 elm_object_part_content_set(VIEW(it), part, content);
698 snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
699 elm_object_signal_emit(VIEW(it), buf, "elm");
701 pair->content = content;
702 evas_object_event_callback_add(content,
708 if (_elm_config->access_mode)
709 _access_obj_process(it, EINA_TRUE);
713 _item_content_set_hook(Elm_Object_Item *it,
715 Evas_Object *content)
717 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
719 _part_aliasing_eval(&part);
722 if (!part || !strcmp(CONTENT_PART, part))
723 _item_content_set(nit, content);
724 else if (!strcmp(part, PREV_BTN_PART))
725 _item_title_prev_btn_set(nit, content);
726 else if (!strcmp(part, NEXT_BTN_PART))
727 _item_title_next_btn_set(nit, content);
728 else if (!strcmp(part, ICON_PART))
729 _item_title_icon_set(nit, content);
731 _title_content_set(nit, part, content);
733 elm_layout_sizing_eval(WIDGET(it));
737 _item_content_get_hook(const Elm_Object_Item *it,
740 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
742 _part_aliasing_eval(&part);
745 if (!part || !strcmp(CONTENT_PART, part))
747 else if (!strcmp(part, PREV_BTN_PART))
748 return nit->title_prev_btn;
749 else if (!strcmp(part, NEXT_BTN_PART))
750 return nit->title_next_btn;
751 else if (!strcmp(part, ICON_PART))
752 return nit->title_icon;
755 return elm_object_part_content_get(VIEW(nit), part);
759 _title_content_unset(Elm_Naviframe_Item *it, const char *part)
761 Elm_Naviframe_Content_Item_Pair *pair = NULL;
763 Evas_Object *content = NULL;
765 EINA_INLIST_FOREACH(it->content_list, pair)
767 if (!strcmp(part, pair->part))
769 content = pair->content;
770 eina_stringshare_del(pair->part);
771 it->content_list = eina_inlist_remove(it->content_list,
772 EINA_INLIST_GET(pair));
778 if (!content) return NULL;
780 elm_object_part_content_unset(VIEW(it), part);
781 snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
782 elm_object_signal_emit(VIEW(it), buf, "elm");
783 evas_object_event_callback_del(content,
790 _item_content_unset_hook(Elm_Object_Item *it,
793 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
794 Evas_Object *o = NULL;
796 _part_aliasing_eval(&part);
799 if (!part || !strcmp(CONTENT_PART, part))
800 o = _item_content_unset(nit);
801 else if (!strcmp(part, PREV_BTN_PART))
802 o = _item_title_prev_btn_unset(nit);
803 else if (!strcmp(part, NEXT_BTN_PART))
804 o = _item_title_next_btn_unset(nit);
805 else if (!strcmp(part, ICON_PART))
806 o = _item_title_icon_unset(nit);
808 o = _title_content_unset(nit, part);
810 elm_layout_sizing_eval(WIDGET(it));
816 _item_signal_emit_hook(Elm_Object_Item *it,
817 const char *emission,
820 elm_object_signal_emit(VIEW(it), emission, source);
824 _elm_naviframe_smart_sizing_eval(Evas_Object *obj)
826 Evas_Coord minw = -1, minh = -1;
827 Elm_Naviframe_Item *it;
828 Evas_Coord x, y, w, h;
830 ELM_NAVIFRAME_DATA_GET(obj, sd);
832 if (sd->on_deletion) return;
834 evas_object_geometry_get(obj, &x, &y, &w, &h);
835 EINA_INLIST_FOREACH(sd->stack, it)
837 evas_object_move(VIEW(it), x, y);
838 evas_object_resize(VIEW(it), w, h);
839 edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
840 &it->minw, &it->minh);
841 if (it->minw > minw) minw = it->minw;
842 if (it->minh > minh) minh = it->minh;
845 evas_object_size_hint_min_set(obj, minw, minh);
846 evas_object_size_hint_max_set(obj, -1, -1);
850 _on_item_back_btn_clicked(void *data,
852 void *event_info __UNUSED__)
854 /* Since edje has the event queue, clicked event could be happend
855 multiple times on some heavy environment. This callback del will
856 prevent those scenario and guarantee only one clicked for it's own
858 evas_object_smart_callback_del(obj, SIG_CLICKED, _on_item_back_btn_clicked);
859 elm_naviframe_item_pop(data);
863 _back_btn_new(Evas_Object *obj, const char *title_label)
865 Evas_Object *btn, *ed;
868 btn = elm_button_add(obj);
870 if (!btn) return NULL;
871 evas_object_smart_callback_add
872 (btn, SIG_CLICKED, _on_item_back_btn_clicked, obj);
874 (buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
875 elm_object_style_set(btn, buf);
877 elm_layout_text_set(btn, NULL, title_label);
879 elm_object_domain_translatable_text_set(btn, PACKAGE, N_("Back"));
881 /* HACK NOTE: this explicit check only exists to avoid an ERR()
882 * message from elm_layout_content_set().
884 * The button was ALWAYS supposed to support an elm.swallow.content, but
885 * default naviframe/back_btn/default theme did not provide such, then
886 * old themes would emit such error message.
888 * Once we can break the theme API, remove this check and always
891 ed = elm_layout_edje_get(btn);
892 if (edje_object_part_exists(ed, CONTENT_PART))
894 Evas_Object *ico = elm_icon_add(btn);
895 elm_icon_standard_set(ico, "arrow_left");
896 elm_layout_content_set(btn, CONTENT_PART, ico);
903 _elm_naviframe_smart_signal_callback_add(Evas_Object *obj,
904 const char *emission,
906 Edje_Signal_Cb func_cb,
909 ELM_NAVIFRAME_DATA_GET(obj, sd);
912 if (!sd->stack) return;
914 _elm_naviframe_parent_sc->callback_add(obj, emission, source, func_cb, data);
916 it = elm_naviframe_top_item_get(obj);
917 if (!it) return EINA_FALSE;
919 elm_object_signal_callback_add(VIEW(it), emission, source, func_cb, data);
923 _elm_naviframe_smart_signal(Evas_Object *obj,
924 const char *emission,
927 ELM_NAVIFRAME_DATA_GET(obj, sd);
929 if (!sd->stack) return;
931 _elm_naviframe_parent_sc->signal(obj, emission, source);
934 /* content/text smart functions proxying things to the top item, which
935 * is the resize object of the layout */
937 _elm_naviframe_smart_text_set(Evas_Object *obj,
943 it = elm_naviframe_top_item_get(obj);
944 if (!it) return EINA_FALSE;
946 elm_object_item_part_text_set(it, part, label);
948 return !strcmp(elm_object_item_part_text_get(it, part), label);
952 _elm_naviframe_smart_text_get(const Evas_Object *obj,
955 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
957 if (!it) return NULL;
959 return elm_object_item_part_text_get(it, part);
962 /* we have to keep a "manual" set here because of the callbacks on the
965 _elm_naviframe_smart_content_set(Evas_Object *obj,
967 Evas_Object *content)
971 it = elm_naviframe_top_item_get(obj);
972 if (!it) return EINA_FALSE;
974 elm_object_item_part_content_set(it, part, content);
976 return content == elm_object_item_part_content_get(it, part);
980 _elm_naviframe_smart_content_get(const Evas_Object *obj,
983 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
985 if (!it) return NULL;
987 return elm_object_item_part_content_get(it, part);
991 _elm_naviframe_smart_content_unset(Evas_Object *obj,
994 Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
996 if (!it) return NULL;
998 return elm_object_item_part_content_unset(it, part);
1002 _on_item_title_clicked(void *data,
1003 Evas_Object *obj __UNUSED__,
1004 const char *emission __UNUSED__,
1005 const char *source __UNUSED__)
1007 Elm_Naviframe_Item *it = data;
1009 evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_CLICKED, it);
1012 /* "elm,state,cur,pushed"
1015 _on_item_push_finished(void *data,
1016 Evas_Object *obj __UNUSED__,
1017 const char *emission __UNUSED__,
1018 const char *source __UNUSED__)
1020 Elm_Naviframe_Item *it = data;
1024 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1026 evas_object_hide(VIEW(it));
1029 elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
1031 if (sd->freeze_events)
1032 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1035 /* "elm,state,cur,popped"
1038 _on_item_pop_finished(void *data,
1039 Evas_Object *obj __UNUSED__,
1040 const char *emission __UNUSED__,
1041 const char *source __UNUSED__)
1043 Elm_Naviframe_Item *it = data;
1045 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1047 if (sd->preserve && it->content)
1048 elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
1049 sd->popping = eina_list_remove(sd->popping, it);
1051 elm_widget_item_del(data);
1054 /* "elm,state,new,pushed",
1055 * "elm,state,prev,popped
1058 _on_item_show_finished(void *data,
1059 Evas_Object *obj __UNUSED__,
1060 const char *emission __UNUSED__,
1061 const char *source __UNUSED__)
1063 Elm_Naviframe_Item *it = data;
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(it->content, it->content_unfocusable);
1071 if (sd->freeze_events)
1072 evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
1074 evas_object_smart_callback_call(WIDGET(it), SIG_TRANSITION_FINISHED, data);
1078 _on_item_size_hints_changed(void *data,
1080 Evas_Object *obj __UNUSED__,
1081 void *event_info __UNUSED__)
1083 elm_layout_sizing_eval(data);
1087 _item_dispmode_set(Elm_Naviframe_Item *it, Evas_Display_Mode dispmode)
1089 if (it->dispmode == dispmode) return;
1092 case EVAS_DISPLAY_MODE_COMPRESS:
1093 elm_object_signal_emit(VIEW(it), "display,mode,compress", "");
1096 elm_object_signal_emit(VIEW(it), "display,mode,default", "");
1099 it->dispmode = dispmode;
1102 static Elm_Naviframe_Item *
1103 _item_new(Evas_Object *obj,
1104 const Elm_Naviframe_Item *prev_it,
1105 const char *title_label,
1106 Evas_Object *prev_btn,
1107 Evas_Object *next_btn,
1108 Evas_Object *content,
1109 const char *item_style)
1111 Elm_Naviframe_Item *it;
1113 ELM_NAVIFRAME_DATA_GET(obj, sd);
1115 it = elm_widget_item_new(obj, Elm_Naviframe_Item);
1118 ERR("Failed to allocate new item! : naviframe=%p", obj);
1122 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
1123 elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
1124 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
1125 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
1126 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
1127 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
1128 elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
1131 VIEW(it) = elm_layout_add(obj);
1132 evas_object_smart_member_add(VIEW(it), obj);
1134 evas_object_event_callback_add
1135 (VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1136 _on_item_size_hints_changed, obj);
1138 elm_object_signal_callback_add
1139 (VIEW(it), "elm,action,show,finished", "", _on_item_show_finished, it);
1140 elm_object_signal_callback_add
1141 (VIEW(it), "elm,action,pushed,finished", "", _on_item_push_finished, it);
1142 elm_object_signal_callback_add
1143 (VIEW(it), "elm,action,popped,finished", "", _on_item_pop_finished, it);
1144 elm_object_signal_callback_add
1145 (VIEW(it), "elm,action,title,clicked", "", _on_item_title_clicked, it);
1147 _item_style_set(it, item_style);
1150 _item_text_set_hook((Elm_Object_Item *)it, TITLE_PART, title_label);
1153 if ((!prev_btn) && sd->auto_pushed && prev_it)
1155 const char *prev_title = prev_it->title_label;
1156 prev_btn = _back_btn_new(obj, prev_title);
1161 _item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
1163 if (!elm_layout_text_get(prev_btn, NULL))
1164 _elm_access_text_set
1165 (_elm_access_object_get(prev_btn), ELM_ACCESS_INFO, E_("Back"));
1170 _item_content_set_hook((Elm_Object_Item *)it, NEXT_BTN_PART, next_btn);
1172 if (!elm_layout_text_get(next_btn, NULL))
1173 _elm_access_text_set
1174 (_elm_access_object_get(next_btn), ELM_ACCESS_INFO, E_("Next"));
1177 _item_content_set(it, content);
1178 _item_dispmode_set(it, sd->dispmode);
1180 it->title_visible = EINA_TRUE;
1186 _on_obj_size_hints_changed(void *data __UNUSED__, Evas *e __UNUSED__,
1187 Evas_Object *obj, void *event_info __UNUSED__)
1189 Elm_Naviframe_Item *it;
1190 Evas_Display_Mode dispmode;
1192 ELM_NAVIFRAME_DATA_GET(obj, sd);
1194 dispmode = evas_object_size_hint_display_mode_get(obj);
1195 if (sd->dispmode == dispmode) return;
1197 sd->dispmode = dispmode;
1199 EINA_INLIST_FOREACH(sd->stack, it)
1200 _item_dispmode_set(it, dispmode);
1204 _elm_naviframe_smart_focus_next(const Evas_Object *obj,
1205 Elm_Focus_Direction dir,
1210 Eina_List *l = NULL;
1211 Elm_Naviframe_Item *top_it;
1212 Elm_Naviframe_Content_Item_Pair *content_pair = NULL;
1213 void *(*list_data_get)(const Eina_List *list);
1215 top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1216 if (!top_it) return EINA_FALSE;
1218 if (!top_it->title_visible)
1220 return elm_widget_focus_next_get(top_it->content, dir, next);
1223 list_data_get = eina_list_data_get;
1226 if (_elm_config->access_mode)
1228 ao = _access_object_get(top_it, TITLE_ACCESS_PART);
1229 if (ao) l = eina_list_append(l, ao);
1232 /* icon would be able to have an widget. ex: segment control */
1233 if ((top_it->title_icon) &&
1234 (elm_widget_can_focus_get(top_it->title_icon) ||
1235 elm_widget_child_can_focus_get(top_it->title_icon)))
1236 l = eina_list_append(l, top_it->title_icon);
1238 if (top_it->title_prev_btn)
1239 l = eina_list_append(l, top_it->title_prev_btn);
1240 if (top_it->title_next_btn)
1241 l = eina_list_append(l, top_it->title_next_btn);
1242 if (top_it->content)
1243 l = eina_list_append(l, top_it->content);
1244 EINA_INLIST_FOREACH(top_it->content_list, content_pair)
1246 if (elm_object_part_content_get(VIEW(top_it), content_pair->part))
1247 l = eina_list_append(l, elm_object_part_content_get(VIEW(top_it),
1248 content_pair->part));
1250 l = eina_list_append(l, VIEW(top_it));
1252 ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
1259 _elm_naviframe_smart_add(Evas_Object *obj)
1261 EVAS_SMART_DATA_ALLOC(obj, Elm_Naviframe_Smart_Data);
1263 ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->base.add(obj);
1265 priv->dummy_edje = ELM_WIDGET_DATA(priv)->resize_obj;
1266 priv->auto_pushed = EINA_TRUE;
1267 priv->freeze_events = EINA_TRUE;
1269 evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
1270 _on_obj_size_hints_changed, obj);
1271 elm_widget_can_focus_set(obj, EINA_TRUE);
1275 _pop_transition_cb(void *data)
1277 Elm_Naviframe_Item *prev_it, *it;
1278 it = (Elm_Naviframe_Item *)data;
1280 it->animator = NULL;
1282 prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(WIDGET(it));
1285 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred",
1287 //FIXME: Remove the below line once edje_object_message_signal_process is fixed.
1288 //This API crashes when in the midst of this API processing if edje object passed here is deleted.
1289 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1291 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm");
1293 //FIXME: Remove the below line once edje_object_message_signal_process is fixed.
1294 //This API crashes when in the midst of this API processing if edje object passed here is deleted.
1295 //edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1297 return ECORE_CALLBACK_CANCEL;
1301 _elm_naviframe_smart_del(Evas_Object *obj)
1303 Elm_Naviframe_Item *it;
1305 ELM_NAVIFRAME_DATA_GET(obj, sd);
1307 sd->on_deletion = EINA_TRUE;
1311 it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item);
1312 elm_widget_item_del(it);
1315 //All popping items which are not called yet by animator.
1316 EINA_LIST_FREE(sd->popping, it)
1318 if (it->animator) ecore_animator_del(it->animator);
1319 elm_widget_item_del(it);
1321 eina_list_free(sd->popping);
1323 evas_object_del(sd->dummy_edje);
1325 ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->base.del(obj);
1329 _elm_naviframe_smart_access(Evas_Object *obj, Eina_Bool is_access)
1331 Elm_Naviframe_Item *it;
1333 ELM_NAVIFRAME_CHECK(obj);
1334 ELM_NAVIFRAME_DATA_GET(obj, sd);
1336 EINA_INLIST_FOREACH(sd->stack, it)
1337 _access_obj_process(it, is_access);
1341 _elm_naviframe_smart_event(Evas_Object *obj,
1342 Evas_Object *src __UNUSED__,
1343 Evas_Callback_Type type,
1346 Elm_Naviframe_Item *it;
1347 Evas_Event_Key_Down *ev = event_info;
1349 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
1350 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
1351 if (strcmp(ev->keyname, "BackSpace")) return EINA_FALSE;
1353 it = elm_naviframe_top_item_get(obj);
1354 if (!it) return EINA_FALSE;
1356 if (it->title_prev_btn)
1357 evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
1359 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
1365 _elm_naviframe_smart_set_user(Elm_Naviframe_Smart_Class *sc)
1367 ELM_WIDGET_CLASS(sc)->base.add = _elm_naviframe_smart_add;
1368 ELM_WIDGET_CLASS(sc)->base.del = _elm_naviframe_smart_del;
1370 ELM_WIDGET_CLASS(sc)->theme = _elm_naviframe_smart_theme;
1371 ELM_WIDGET_CLASS(sc)->focus_next = _elm_naviframe_smart_focus_next;
1372 ELM_WIDGET_CLASS(sc)->access = _elm_naviframe_smart_access;
1373 ELM_WIDGET_CLASS(sc)->event = _elm_naviframe_smart_event;
1375 ELM_CONTAINER_CLASS(sc)->content_set = _elm_naviframe_smart_content_set;
1376 ELM_CONTAINER_CLASS(sc)->content_get = _elm_naviframe_smart_content_get;
1377 ELM_CONTAINER_CLASS(sc)->content_unset = _elm_naviframe_smart_content_unset;
1379 ELM_LAYOUT_CLASS(sc)->signal = _elm_naviframe_smart_signal;
1380 ELM_LAYOUT_CLASS(sc)->callback_add = _elm_naviframe_smart_signal_callback_add;
1381 ELM_LAYOUT_CLASS(sc)->text_set = _elm_naviframe_smart_text_set;
1382 ELM_LAYOUT_CLASS(sc)->text_get = _elm_naviframe_smart_text_get;
1383 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_naviframe_smart_sizing_eval;
1387 _push_transition_cb(void *data)
1389 Elm_Naviframe_Item *prev_it, *it = data;
1391 ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
1393 it->animator = NULL;
1395 if (sd->stack->last->prev)
1397 prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last->prev,
1398 Elm_Naviframe_Item);
1399 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
1401 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1403 elm_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
1404 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1406 return ECORE_CALLBACK_CANCEL;
1409 EAPI const Elm_Naviframe_Smart_Class *
1410 elm_naviframe_smart_class_get(void)
1412 static Elm_Naviframe_Smart_Class _sc =
1413 ELM_NAVIFRAME_SMART_CLASS_INIT_NAME_VERSION
1414 (ELM_NAVIFRAME_SMART_NAME);
1415 static const Elm_Naviframe_Smart_Class *class = NULL;
1416 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
1421 _elm_naviframe_smart_set(&_sc);
1422 esc->callbacks = _smart_callbacks;
1429 elm_naviframe_add(Evas_Object *parent)
1433 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1435 obj = elm_widget_add(_elm_naviframe_smart_class_new(), parent);
1436 if (!obj) return NULL;
1438 if (!elm_widget_sub_object_add(parent, obj))
1439 ERR("could not add %p as sub object of %p", obj, parent);
1444 EAPI Elm_Object_Item *
1445 elm_naviframe_item_push(Evas_Object *obj,
1446 const char *title_label,
1447 Evas_Object *prev_btn,
1448 Evas_Object *next_btn,
1449 Evas_Object *content,
1450 const char *item_style)
1452 Elm_Naviframe_Item *prev_it, *it;
1454 ELM_NAVIFRAME_CHECK(obj) NULL;
1456 ELM_NAVIFRAME_DATA_GET(obj, sd);
1458 prev_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1459 it = _item_new(obj, prev_it,
1460 title_label, prev_btn, next_btn, content, item_style);
1461 if (!it) return NULL;
1463 evas_object_show(VIEW(it));
1464 elm_widget_resize_object_set(obj, VIEW(it));
1465 evas_object_smart_member_add(sd->dummy_edje, obj);
1469 /* re-add as smart member */
1470 evas_object_smart_member_add(VIEW(prev_it), obj);
1472 if (sd->freeze_events)
1474 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1475 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1478 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
1479 elm_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
1480 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1481 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1483 if (prev_it->content)
1485 prev_it->content_unfocusable =
1486 elm_widget_tree_unfocusable_get(prev_it->content);
1487 elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
1490 it->animator = ecore_animator_add(_push_transition_cb, it);
1493 sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it));
1494 evas_object_raise(VIEW(it));
1497 if (_elm_config->access_mode) _access_focus_set(it);
1499 elm_layout_sizing_eval(obj);
1501 return (Elm_Object_Item *)it;
1504 EAPI Elm_Object_Item *
1505 elm_naviframe_item_insert_before(Evas_Object *obj,
1506 Elm_Object_Item *before,
1507 const char *title_label,
1508 Evas_Object *prev_btn,
1509 Evas_Object *next_btn,
1510 Evas_Object *content,
1511 const char *item_style)
1513 Elm_Naviframe_Item *it, *prev_it = NULL;
1515 ELM_NAVIFRAME_CHECK(obj) NULL;
1516 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
1517 ELM_NAVIFRAME_DATA_GET(obj, sd);
1519 it = (Elm_Naviframe_Item *)before;
1520 if (EINA_INLIST_GET(it)->prev)
1521 prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
1522 Elm_Naviframe_Item);
1523 it = _item_new(obj, prev_it,
1524 title_label, prev_btn, next_btn, content, item_style);
1525 if (!it) return NULL;
1527 sd->stack = eina_inlist_prepend_relative
1528 (sd->stack, EINA_INLIST_GET(it),
1529 EINA_INLIST_GET(((Elm_Naviframe_Item *)before)));
1531 elm_layout_sizing_eval(obj);
1533 return (Elm_Object_Item *)it;
1536 EAPI Elm_Object_Item *
1537 elm_naviframe_item_insert_after(Evas_Object *obj,
1538 Elm_Object_Item *after,
1539 const char *title_label,
1540 Evas_Object *prev_btn,
1541 Evas_Object *next_btn,
1542 Evas_Object *content,
1543 const char *item_style)
1545 Elm_Naviframe_Item *it;
1546 Eina_Bool top_inserted = EINA_FALSE;
1548 ELM_NAVIFRAME_CHECK(obj) NULL;
1549 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
1550 ELM_NAVIFRAME_DATA_GET(obj, sd);
1552 it = _item_new(obj, (Elm_Naviframe_Item *)after,
1553 title_label, prev_btn, next_btn, content, item_style);
1554 if (!it) return NULL;
1556 if (elm_naviframe_top_item_get(obj) == after) top_inserted = EINA_TRUE;
1558 sd->stack = eina_inlist_append_relative
1559 (sd->stack, EINA_INLIST_GET(it),
1560 EINA_INLIST_GET(((Elm_Naviframe_Item *)after)));
1564 elm_widget_resize_object_set(obj, VIEW(it));
1565 evas_object_smart_member_add(sd->dummy_edje, obj);
1566 evas_object_show(VIEW(it));
1567 evas_object_hide(VIEW(after));
1571 if (_elm_config->access_mode) _access_focus_set(it);
1573 elm_layout_sizing_eval(obj);
1575 return (Elm_Object_Item *)it;
1579 elm_naviframe_item_pop(Evas_Object *obj)
1581 Elm_Naviframe_Item *it, *prev_it = NULL;
1582 Evas_Object *content = NULL;
1584 ELM_NAVIFRAME_CHECK(obj) NULL;
1585 ELM_NAVIFRAME_DATA_GET(obj, sd);
1587 it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
1588 if (!it) return NULL;
1590 if (it->pop_cb) it->pop_cb(it->pop_data, (Elm_Object_Item *)it);
1593 content = it->content;
1595 evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
1599 it->content_unfocusable = elm_widget_tree_unfocusable_get(it->content);
1600 elm_widget_tree_unfocusable_set(it->content, EINA_TRUE);
1603 if (sd->stack->last->prev)
1604 prev_it = EINA_INLIST_CONTAINER_GET
1605 (sd->stack->last->prev, Elm_Naviframe_Item);
1607 sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
1608 if (!sd->stack) elm_widget_resize_object_set(obj, sd->dummy_edje);
1612 if (sd->freeze_events)
1614 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1615 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1618 elm_widget_resize_object_set(obj, VIEW(prev_it));
1619 evas_object_smart_member_add(sd->dummy_edje, obj);
1620 evas_object_raise(VIEW(prev_it));
1623 if (_elm_config->access_mode) _access_focus_set(prev_it);
1625 /* these 2 signals MUST take place simultaneously */
1626 elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
1627 evas_object_show(VIEW(prev_it));
1628 elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
1630 edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
1631 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1633 if (it->animator) ecore_animator_del(it->animator);
1634 it->animator = ecore_animator_add(_pop_transition_cb, it);
1635 sd->popping = eina_list_append(sd->popping, it);
1638 elm_widget_item_del(it);
1644 elm_naviframe_item_pop_to(Elm_Object_Item *it)
1646 Elm_Naviframe_Item *nit;
1647 Eina_Inlist *l, *prev_l;
1649 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1651 nit = (Elm_Naviframe_Item *)it;
1652 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
1654 if (it == elm_naviframe_top_item_get(WIDGET(nit))) return;
1656 l = sd->stack->last->prev;
1658 sd->on_deletion = EINA_TRUE;
1662 Elm_Naviframe_Item *iit = EINA_INLIST_CONTAINER_GET
1663 (l, Elm_Naviframe_Item);
1665 if (iit == nit) break;
1668 sd->stack = eina_inlist_remove(sd->stack, l);
1670 elm_widget_item_del(iit);
1675 sd->on_deletion = EINA_FALSE;
1677 elm_naviframe_item_pop(WIDGET(nit));
1681 elm_naviframe_item_promote(Elm_Object_Item *it)
1683 Elm_Naviframe_Item *nit;
1684 Elm_Naviframe_Item *prev_it;
1686 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1688 nit = (Elm_Naviframe_Item *)it;
1689 ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
1691 if (it == elm_naviframe_top_item_get(WIDGET(nit))) return;
1693 /* remember, last is 1st on the naviframe, push it to last pos. */
1694 sd->stack = eina_inlist_demote(sd->stack, EINA_INLIST_GET(nit));
1696 elm_widget_resize_object_set(WIDGET(it), VIEW(nit));
1697 evas_object_smart_member_add(sd->dummy_edje, WIDGET(it));
1699 /* this was the previous top one */
1700 prev_it = EINA_INLIST_CONTAINER_GET
1701 (sd->stack->last->prev, Elm_Naviframe_Item);
1703 /* re-add as smart member */
1704 evas_object_smart_member_add(VIEW(prev_it), WIDGET(it));
1706 if (prev_it->content)
1708 prev_it->content_unfocusable =
1709 elm_widget_tree_unfocusable_get(prev_it->content);
1710 elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
1713 if (sd->freeze_events)
1715 evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
1716 evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
1719 elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
1721 evas_object_show(VIEW(nit));
1722 evas_object_raise(VIEW(nit));
1724 elm_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
1726 edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
1727 edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
1728 if (nit->animator) ecore_animator_del(nit->animator);
1729 nit->animator = ecore_animator_add(_push_transition_cb, nit);
1732 if (_elm_config->access_mode) _access_focus_set(nit);
1736 elm_naviframe_item_simple_promote(Evas_Object *obj,
1737 Evas_Object *content)
1739 Elm_Naviframe_Item *itr;
1741 ELM_NAVIFRAME_CHECK(obj);
1742 ELM_NAVIFRAME_DATA_GET(obj, sd);
1744 EINA_INLIST_FOREACH(sd->stack, itr)
1746 if (elm_object_item_content_get((Elm_Object_Item *)itr) == content)
1748 elm_naviframe_item_promote((Elm_Object_Item *)itr);
1755 elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj,
1758 ELM_NAVIFRAME_CHECK(obj);
1759 ELM_NAVIFRAME_DATA_GET(obj, sd);
1761 sd->preserve = !!preserve;
1765 elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
1767 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1768 ELM_NAVIFRAME_DATA_GET(obj, sd);
1770 return sd->preserve;
1773 EAPI Elm_Object_Item *
1774 elm_naviframe_top_item_get(const Evas_Object *obj)
1776 ELM_NAVIFRAME_CHECK(obj) NULL;
1777 ELM_NAVIFRAME_DATA_GET(obj, sd);
1779 if (!sd->stack) return NULL;
1780 return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
1781 (sd->stack->last, Elm_Naviframe_Item));
1784 EAPI Elm_Object_Item *
1785 elm_naviframe_bottom_item_get(const Evas_Object *obj)
1787 ELM_NAVIFRAME_CHECK(obj) NULL;
1788 ELM_NAVIFRAME_DATA_GET(obj, sd);
1790 if (!sd->stack) return NULL;
1791 return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
1792 (sd->stack, Elm_Naviframe_Item));
1796 elm_naviframe_item_style_set(Elm_Object_Item *it,
1797 const char *item_style)
1799 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1801 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1803 if (item_style && !strcmp(item_style, nit->style)) return;
1806 if (!strcmp("basic", nit->style)) return;
1808 _item_style_set(nit, item_style);
1809 _item_signals_emit(nit);
1810 _item_title_visible_update(nit);
1814 elm_naviframe_item_style_get(const Elm_Object_Item *it)
1816 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1818 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, NULL);
1824 elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
1827 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1829 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1831 visible = !!visible;
1832 if (nit->title_visible == visible) return;
1834 nit->title_visible = visible;
1835 _item_title_visible_update(nit);
1839 elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
1841 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1843 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
1845 return nit->title_visible;
1849 elm_naviframe_item_pop_cb_set(Elm_Object_Item *it, Elm_Naviframe_Item_Pop_Cb func, void *data)
1851 Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
1853 ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
1856 nit->pop_data = data;
1860 elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj,
1861 Eina_Bool auto_pushed)
1863 ELM_NAVIFRAME_CHECK(obj);
1864 ELM_NAVIFRAME_DATA_GET(obj, sd);
1866 sd->auto_pushed = !!auto_pushed;
1870 elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
1872 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1873 ELM_NAVIFRAME_DATA_GET(obj, sd);
1875 return sd->auto_pushed;
1879 elm_naviframe_items_get(const Evas_Object *obj)
1881 Eina_List *ret = NULL;
1882 Elm_Naviframe_Item *itr;
1884 ELM_NAVIFRAME_CHECK(obj) NULL;
1885 ELM_NAVIFRAME_DATA_GET(obj, sd);
1887 EINA_INLIST_FOREACH(sd->stack, itr)
1888 ret = eina_list_append(ret, itr);
1894 elm_naviframe_event_enabled_set(Evas_Object *obj,
1897 ELM_NAVIFRAME_CHECK(obj);
1898 ELM_NAVIFRAME_DATA_GET(obj, sd);
1900 enabled = !!enabled;
1901 if (sd->freeze_events == !enabled) return;
1902 sd->freeze_events = !enabled;
1906 elm_naviframe_event_enabled_get(const Evas_Object *obj)
1908 ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
1909 ELM_NAVIFRAME_DATA_GET(obj, sd);
1911 return !sd->freeze_events;