1 #include <Elementary.h>
\r
2 #include "elm_priv.h"
\r
5 * @defgroup Navigationbar_ex Navigationbar_ex
\r
6 * @ingroup Elementary
\r
8 * The NavigationBar_ex is an object that allows flipping (with animation) between 1 or
\r
9 * more pages of objects, much like a stack of windows within the window as well display
\r
10 * the title area for the page consisting of buttons, title, titleobjects etc:-.
\r
12 * Objects can be pushed or popped from the stack or deleted as normal.
\r
13 * Pushes and pops will animate and a pop will delete the object once the
\r
14 * animation is finished if delete_on_pop is set else the content is unset and the
\r
15 * content pointer is sent as event information in the hide,finished signal.
\r
16 * Any object in the Navigationbar_ex can be promoted to the top
\r
17 * (from its current stacking position) as well. Objects are pushed to the
\r
18 * top with elm_navigationbar_ex_item_push() and when the top item is no longer
\r
19 * wanted, simply pop it with elm_navigationbar_ex_item_pop() and it will also be
\r
20 * deleted/unset depending on delete_on_pop variable.
\r
21 * Any object you wish to promote to the top that is already in the
\r
22 * navigationbar, simply use elm_navigationbar_ex_item_promote(). If an object is no longer
\r
23 * needed and is not the top item, just delete it as normal. You can query
\r
24 * which objects are the top and bottom with elm_navigationbar_ex_item_bottom_get()
\r
25 * and elm_navigationbar_ex_item_top_get().
\r
28 typedef struct _Widget_Data Widget_Data;
\r
29 typedef struct _function_button fn_button;
\r
33 Eina_List *stack, *to_delete;
\r
34 Elm_Navigationbar_ex_Item *top, *oldtop;
\r
35 Evas_Object *rect, *clip;
\r
36 Eina_Bool del_on_pop : 1;
\r
37 Eina_Bool disable_animation: 1;
\r
40 struct _Elm_Navigationbar_ex_Item
\r
42 Evas_Object *obj, *base, *content;
\r
43 Evas_Object *ct_base;
\r
44 Evas_Coord minw, minh;
\r
46 const char *subtitle;
\r
47 const char *item_style;
\r
48 Eina_List *fnbtn_list;
\r
49 Evas_Object *title_obj;
\r
51 Eina_Bool popme : 1;
\r
52 Eina_Bool titleobj_visible:1;
\r
55 struct _function_button
\r
61 static const char *widtype = NULL;
\r
62 static void _del_hook(Evas_Object *obj);
\r
63 static void _theme_hook(Evas_Object *obj);
\r
64 static void _sizing_eval(Evas_Object *obj);
\r
65 static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
\r
66 static void _sub_del(void *data, Evas_Object *obj, void *event_info);
\r
68 static const char SIG_HIDE_FINISHED[] = "hide,finished";
\r
69 static const char SIG_TITLE_OBJ_VISIBLE_CHANGED[] = "titleobj,visible,changed";
\r
71 static const Evas_Smart_Cb_Description _signals[] = {
\r
72 {SIG_HIDE_FINISHED, ""},
\r
73 {SIG_TITLE_OBJ_VISIBLE_CHANGED, ""},
\r
78 _del_hook(Evas_Object *obj)
\r
80 Widget_Data *wd = elm_widget_data_get(obj);
\r
86 _content_unset(Elm_Navigationbar_ex_Item* item)
\r
88 if (!item) return NULL;
\r
89 Evas_Object *content = NULL;
\r
90 if (!item->content) return NULL;
\r
91 content = item->content;
\r
92 elm_widget_sub_object_del(item->obj,item->content);
\r
93 edje_object_part_unswallow(item->ct_base,item->content);
\r
94 item->content = NULL;
\r
95 evas_object_hide(content);
\r
100 _theme_hook(Evas_Object *obj)
\r
102 Widget_Data *wd = elm_widget_data_get(obj);
\r
106 Elm_Navigationbar_ex_Item *it;
\r
108 EINA_LIST_FOREACH(wd->stack, l, it)
\r
112 edje_object_scale_set(it->base, elm_widget_scale_get(obj) *
\r
113 _elm_config->scale);
\r
114 strncpy(buf, "item/", sizeof(buf));
\r
115 strncat(buf, it->item_style, sizeof(buf) - strlen(buf));
\r
116 _elm_theme_object_set(obj, it->base, "navigationbar_ex", buf, elm_widget_style_get(obj));
\r
117 _elm_theme_object_set(obj, it->ct_base, "navigationbar_ex", "content", elm_widget_style_get(obj));
\r
118 EINA_LIST_FOREACH(it->fnbtn_list, bl, btn)
\r
120 if (btn->btn_id == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)
\r
122 snprintf(buf_fn, sizeof(buf_fn), "navigationbar_backbutton/%s", elm_widget_style_get(obj));
\r
123 elm_object_style_set(btn->btn, buf_fn);
\r
127 snprintf(buf_fn, sizeof(buf_fn), "navigationbar_functionbutton/%s", elm_widget_style_get(obj));
\r
128 elm_object_style_set(btn->btn, buf_fn);
\r
136 _sizing_eval(Evas_Object *obj)
\r
138 Widget_Data *wd = elm_widget_data_get(obj);
\r
139 Evas_Coord minw = -1, minh = -1;
\r
141 Elm_Navigationbar_ex_Item *it;
\r
143 EINA_LIST_FOREACH(wd->stack, l, it)
\r
145 if (it->minw > minw) minw = it->minw;
\r
146 if (it->minh > minh) minh = it->minh;
\r
148 evas_object_size_hint_min_set(obj, minw, minh);
\r
149 evas_object_size_hint_max_set(obj, -1, -1);
\r
153 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
\r
155 Elm_Navigationbar_ex_Item *it = data;
\r
156 Evas_Coord minw = -1, minh = -1;
\r
157 evas_object_size_hint_min_get(it->content, &minw, &minh);
\r
158 // FIXME: why is this needed? how does edje get this unswallowed or
\r
159 // lose its callbacks to edje
\r
160 edje_object_part_swallow(it->ct_base, "elm.swallow.content", it->content);
\r
161 edje_object_size_min_calc(it->base, &it->minw, &it->minh);
\r
162 _sizing_eval(it->obj);
\r
166 _eval_top(Evas_Object *obj)
\r
168 Widget_Data *wd = elm_widget_data_get(obj);
\r
169 Eina_Bool animate = EINA_TRUE;
\r
170 Elm_Navigationbar_ex_Item *ittop = NULL;
\r
172 if (!wd->stack) return;
\r
173 ittop = eina_list_last(wd->stack)->data;
\r
174 if (ittop != wd->top)
\r
176 Evas_Object *o1, *o2;
\r
177 const char *onshow, *onhide;
\r
181 o1 = wd->top->ct_base;
\r
182 o2 = wd->top->base;/*make use of the signals sent for animation*/
\r
184 /*issue to fix, hide signal does not come for t_base, increasing time helps
\r
185 in getting correct events in pop*/
\r
186 if (wd->disable_animation)
\r
188 edje_object_signal_emit(o2, "elm,action,hide,noanimate", "elm");
\r
189 edje_object_signal_emit(o1, "elm,action,hide,noanimate", "elm");
\r
191 else if (wd->top->popme)
\r
193 edje_object_signal_emit(o2, "elm,action,pop", "elm");
\r
194 edje_object_signal_emit(o1, "elm,action,pop", "elm");
\r
198 edje_object_signal_emit(o2, "elm,action,hide", "elm");
\r
199 edje_object_signal_emit(o1, "elm,action,hide", "elm");
\r
201 onhide = edje_object_data_get(o1, "onhide");
\r
204 if (!strcmp(onhide, "raise")) {
\r
205 evas_object_raise(o2);
\r
206 evas_object_raise(o1);
\r
208 else if (!strcmp(onhide, "lower")) {
\r
209 evas_object_lower(o2);
\r
210 evas_object_lower(o1);
\r
216 animate = EINA_FALSE;
\r
218 wd->oldtop = wd->top;
\r
220 o1 = wd->top->ct_base;
\r
221 o2 = wd->top->base;
\r
222 evas_object_show(o2);
\r
223 evas_object_show(o1);
\r
225 if ((!animate)||(wd->disable_animation))
\r
227 edje_object_signal_emit(o2, "elm,action,show,noanimate", "elm");
\r
228 edje_object_signal_emit(o1, "elm,action,show,noanimate", "elm");
\r
230 else if (wd->oldtop)
\r
232 if (elm_object_focus_get(wd->oldtop->content))
\r
233 elm_object_focus(wd->top->content);
\r
234 if (wd->oldtop->popme)
\r
236 edje_object_signal_emit(o2, "elm,action,show", "elm");
\r
237 edje_object_signal_emit(o1, "elm,action,show", "elm");
\r
241 edje_object_signal_emit(o2, "elm,action,push", "elm");
\r
242 edje_object_signal_emit(o1, "elm,action,push", "elm");
\r
247 edje_object_signal_emit(o2, "elm,action,push", "elm");
\r
248 edje_object_signal_emit(o1, "elm,action,push", "elm");
\r
250 onshow = edje_object_data_get(o1, "onshow");
\r
253 if (!strcmp(onshow, "raise")) {
\r
254 evas_object_raise(o2);
\r
255 evas_object_raise(o1);
\r
257 else if (!strcmp(onshow, "lower")) {
\r
258 evas_object_lower(o2);
\r
259 evas_object_lower(o1);
\r
266 _move(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
\r
268 Widget_Data *wd = elm_widget_data_get(data);
\r
271 Elm_Navigationbar_ex_Item *it;
\r
273 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
\r
274 EINA_LIST_FOREACH(wd->stack, l, it)
\r
275 evas_object_move(it->base, x, y);
\r
279 _sub_del(void *data, Evas_Object *obj __UNUSED__, void *event_info)
\r
281 Widget_Data *wd = elm_widget_data_get(data);
\r
282 Evas_Object *sub = event_info;
\r
283 Eina_List *l,*list;
\r
284 fn_button *btn_data;
\r
285 Elm_Navigationbar_ex_Item *it;
\r
287 EINA_LIST_FOREACH(wd->stack, l, it)
\r
289 if (it->content == sub)
\r
291 wd->stack = eina_list_remove_list(wd->stack, l);
\r
292 evas_object_event_callback_del_full
\r
293 (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, it);
\r
294 if (it->title) eina_stringshare_del(it->title);
\r
295 if (it->subtitle) eina_stringshare_del(it->subtitle);
\r
296 EINA_LIST_FOREACH(it->fnbtn_list, list, btn_data)
\r
298 evas_object_del(btn_data->btn);
\r
302 if (it->item_style) eina_stringshare_del(it->item_style);
\r
303 if (it->title_obj) evas_object_del(it->title_obj);
\r
304 if (it->icon) evas_object_del(it->icon);
\r
305 evas_object_del(it->ct_base);
\r
306 evas_object_del(it->base);
\r
307 _eval_top(it->obj);
\r
315 _resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
\r
317 Widget_Data *wd = elm_widget_data_get(data);
\r
320 Elm_Navigationbar_ex_Item *it;
\r
322 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
\r
323 EINA_LIST_FOREACH(wd->stack, l, it) evas_object_resize(it->base, w, h);
\r
327 _signal_hide_finished(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
\r
329 Elm_Navigationbar_ex_Item *it = data;
\r
330 Evas_Object *obj2 = it->obj;
\r
331 Widget_Data *wd = elm_widget_data_get(it->obj);
\r
332 evas_object_hide(it->ct_base);
\r
333 evas_object_hide(it->base);
\r
334 edje_object_signal_emit(it->base, "elm,action,reset", "elm");
\r
335 edje_object_signal_emit(it->ct_base, "elm,action,reset", "elm");
\r
336 evas_object_smart_callback_call(obj2, SIG_HIDE_FINISHED, it->content);
\r
337 edje_object_message_signal_process(it->base);
\r
338 edje_object_message_signal_process(it->ct_base);
\r
341 if (wd->del_on_pop)
\r
343 evas_object_del(it->content);
\r
347 _content_unset(it);
\r
350 _sizing_eval(obj2);
\r
354 _item_promote(Elm_Navigationbar_ex_Item* item)
\r
357 Widget_Data *wd = elm_widget_data_get(item->obj);
\r
359 Elm_Navigationbar_ex_Item *it;
\r
361 EINA_LIST_FOREACH(wd->stack, l, it)
\r
365 wd->stack = eina_list_remove_list(wd->stack, l);
\r
366 wd->stack = eina_list_append(wd->stack, it);
\r
367 _eval_top(it->obj);
\r
374 _process_deletions(Widget_Data *wd)
\r
377 Elm_Navigationbar_ex_Item *it;
\r
378 fn_button *btn_data;
\r
380 EINA_LIST_FREE(wd->to_delete, it)
\r
382 evas_object_event_callback_del_full
\r
383 (it->content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, it);
\r
384 if (it->title) eina_stringshare_del(it->title);
\r
385 if (it->subtitle) eina_stringshare_del(it->subtitle);
\r
386 if (it->item_style) eina_stringshare_del(it->item_style);
\r
387 EINA_LIST_FOREACH(it->fnbtn_list, list, btn_data)
\r
389 evas_object_del(btn_data->btn);
\r
393 if (it->title_obj) evas_object_del(it->title_obj);
\r
394 if (it->content) evas_object_del(it->content);
\r
395 if (it->icon) evas_object_del(it->icon);
\r
396 evas_object_del(it->ct_base);
\r
397 evas_object_del(it->base);
\r
398 _eval_top(it->obj);
\r
405 _switch_titleobj_visibility(void *data, Evas_Object *obj , const char *emission, const char *source)
\r
407 Elm_Navigationbar_ex_Item *item = (Elm_Navigationbar_ex_Item *)data;
\r
409 if(!item->title_obj) return;
\r
410 if(!item->titleobj_visible)
\r
412 edje_object_signal_emit(item->base, "elm,state,show,title", "elm");
\r
413 evas_object_smart_callback_call(item->obj, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_TRUE);
\r
414 item->titleobj_visible = EINA_TRUE;
\r
418 edje_object_signal_emit(item->base, "elm,state,hide,title", "elm");
\r
419 evas_object_smart_callback_call(item->obj, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_FALSE);
\r
420 item->titleobj_visible = EINA_FALSE;
\r
425 * Add a new navigationbar_ex to the parent
\r
427 * @param[in] parent The parent object
\r
428 * @return The new object or NULL if it cannot be created
\r
430 * @ingroup Navigationbar_ex
\r
433 elm_navigationbar_ex_add(Evas_Object *parent)
\r
439 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
\r
441 wd = ELM_NEW(Widget_Data);
\r
442 e = evas_object_evas_get(parent);
\r
443 obj = elm_widget_add(e);
\r
444 ELM_SET_WIDTYPE(widtype, "navigationbar_ex");
\r
445 elm_widget_type_set(obj, "navigationbar_ex");
\r
446 elm_widget_sub_object_add(parent, obj);
\r
447 elm_widget_data_set(obj, wd);
\r
448 elm_widget_del_hook_set(obj, _del_hook);
\r
449 elm_widget_theme_hook_set(obj, _theme_hook);
\r
450 elm_widget_can_focus_set(obj, EINA_FALSE);
\r
451 wd->clip = evas_object_rectangle_add(e);
\r
452 elm_widget_resize_object_set(obj, wd->clip);
\r
453 elm_widget_sub_object_add(obj, wd->clip);
\r
455 wd->rect = evas_object_rectangle_add(e);
\r
456 elm_widget_sub_object_add(obj, wd->rect);
\r
457 evas_object_color_set(wd->rect, 255, 255, 255, 0);
\r
458 evas_object_clip_set(wd->rect, wd->clip);
\r
460 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, obj);
\r
461 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
\r
463 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
\r
464 wd->del_on_pop = EINA_TRUE;
\r
470 * Push an object along with its style to the top of the Navigationbar_ex stack (and show it)
\r
472 * The object pushed becomes a child of the Navigationbar_ex and will be controlled
\r
473 * it will be deleted when the Navigationbar_ex is deleted or when content is popped(depending on del_
\r
474 * on_pop variable).
\r
476 * @param[in] obj The Navigationbar_ex object
\r
477 * @param[in] content The object to push
\r
478 * @param[in] item_style The style of the page
\r
479 * @return The Navigationbar_ex Item or NULL
\r
480 * @ingroup Navigationbar_ex
\r
482 EAPI Elm_Navigationbar_ex_Item*
\r
483 elm_navigationbar_ex_item_push(Evas_Object *obj, Evas_Object *content, const char* item_style)
\r
485 ELM_CHECK_WIDTYPE(obj, widtype)NULL;
\r
486 Widget_Data *wd = elm_widget_data_get(obj);
\r
487 Elm_Navigationbar_ex_Item *it = ELM_NEW(Elm_Navigationbar_ex_Item);
\r
488 Evas_Coord x, y, w, h;
\r
490 if (!wd) return NULL;
\r
491 if (!content) return NULL;
\r
492 if (!item_style) return NULL;
\r
493 if (!it) return NULL;
\r
495 it->content = content;
\r
496 it->base = edje_object_add(evas_object_evas_get(obj));
\r
497 it->ct_base = edje_object_add(evas_object_evas_get(obj));
\r
498 it->titleobj_visible = EINA_TRUE;
\r
500 evas_object_smart_member_add(it->base, obj);
\r
501 evas_object_smart_member_add(it->ct_base, obj);
\r
503 evas_object_geometry_get(obj, &x, &y, &w, &h);
\r
504 evas_object_move(it->base, x, y);
\r
505 evas_object_resize(it->base, w, h);
\r
506 evas_object_clip_set(it->base, wd->clip);
\r
508 elm_widget_sub_object_add(obj, it->base);
\r
509 elm_widget_sub_object_add(obj, it->ct_base);
\r
511 elm_widget_sub_object_add(obj, it->content);
\r
513 _elm_theme_object_set(obj, it->ct_base, "navigationbar_ex", "content", elm_widget_style_get(obj));
\r
515 strncpy(buf, "item/", sizeof(buf));
\r
516 strncat(buf, item_style, sizeof(buf) - strlen(buf));
\r
517 if (!eina_stringshare_replace(&it->item_style, item_style)) return NULL;
\r
518 _elm_theme_object_set(obj, it->base, "navigationbar_ex", buf, elm_widget_style_get(obj));
\r
521 edje_object_part_swallow(it->base, "elm.swallow.content", it->ct_base);
\r
523 edje_object_signal_callback_add(it->ct_base, "elm,action,hide,finished", "",
\r
524 _signal_hide_finished, it);
\r
525 evas_object_event_callback_add(it->content,
\r
526 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
\r
527 _changed_size_hints, it);
\r
528 edje_object_part_swallow(it->ct_base, "elm.swallow.content", it->content);
\r
529 edje_object_size_min_calc(it->base, &it->minw, &it->minh);
\r
530 evas_object_data_set(it->base, "_elm_leaveme", obj);
\r
531 evas_object_show(it->content);
\r
532 wd->stack = eina_list_append(wd->stack, it);
\r
539 * Set the title string for the pushed Item.
\r
540 * @param[in] item The Navigationbar_ex Item
\r
541 * @param[in] title The title string
\r
543 * @ingroup Navigationbar_ex
\r
546 elm_navigationbar_ex_item_title_label_set( Elm_Navigationbar_ex_Item* item, const char *title)
\r
549 if (!eina_stringshare_replace(&item->title, title)) return;
\r
552 edje_object_part_text_set(item->base, "elm.text", item->title);
\r
557 * Return the title string of the pushed item.
\r
559 * @param[in] item The Navigationbar_ex Item
\r
560 * @return The title string or NULL if none
\r
562 * @ingroup Navigationbar_ex
\r
565 elm_navigationbar_ex_item_title_label_get(Elm_Navigationbar_ex_Item* item)
\r
567 if(!item) return NULL;
\r
568 return item->title;
\r
572 * Set the sub title string for the pushed content
\r
574 * @param[in] item The Navigationbar_ex Item
\r
575 * @param[in] subtitle The subtitle string
\r
577 * @ingroup Navigationbar_ex
\r
580 elm_navigationbar_ex_item_subtitle_label_set( Elm_Navigationbar_ex_Item* item, const char *subtitle)
\r
583 if (!eina_stringshare_replace(&item->subtitle, subtitle)) return;
\r
585 edje_object_part_text_set(item->base, "elm.text.sub", item->subtitle);
\r
589 * Return the subtitle string of the pushed content
\r
591 * @param[in] item The Navigationbar_ex Item
\r
592 * @return The subtitle string or NULL if none
\r
594 * @ingroup Navigationbar_ex
\r
597 elm_navigationbar_ex_item_subtitle_label_get(Elm_Navigationbar_ex_Item* item)
\r
599 if (!item) return NULL;
\r
600 return item->subtitle;
\r
604 * Set's the icon object of the pushed content
\r
606 * @param[in] item The Navigationbar_ex Item
\r
607 * @param[in] The icon object or NULL if none
\r
609 *@ingroup Navigationbar_ex
\r
612 elm_navigationbar_ex_item_icon_set(Elm_Navigationbar_ex_Item* item, Evas_Object *icon)
\r
615 if (item->icon == icon) return;
\r
616 if (item->icon) evas_object_del(item->icon);
\r
620 edje_object_part_swallow(item->base, "elm.swallow.icon", icon);
\r
621 elm_widget_sub_object_add(item->obj, icon);
\r
622 edje_object_signal_emit(item->base, "elm,state,icon,visible", "elm");
\r
623 edje_object_message_signal_process(item->base);
\r
626 edje_object_signal_emit(item->base, "elm,state,icon,hidden", "elm");
\r
630 * Return the icon object of the pushed content
\r
632 * @param[in] item The Navigationbar_ex Item
\r
633 * @return The icon object or NULL if none
\r
635 * @ingroup Navigationbar_ex
\r
638 elm_navigationbar_ex_item_icon_get(Elm_Navigationbar_ex_Item* item)
\r
640 if (!item) return NULL;
\r
646 * Set the button object of the pushed content
\r
648 * @param[in] item The Navigationbar_ex Item
\r
649 * @param[in] btn_label The button label
\r
650 * @param[in] icon The button icon
\r
651 * @param[in] button_type Indicates the position[use macros of type Elm_Navi_ex_Button_Type
\r
652 * if more function buttons are required you can use values ELM_NAVIGATIONBAR_EX_MAX and more]
\r
653 * @param[in] func Callback function called when button is clicked.
\r
654 * @param[in] data Callback data that would be sent when button is clicked.
\r
655 * @ingroup Navigationbar_ex
\r
658 elm_navigationbar_ex_item_title_button_set(Elm_Navigationbar_ex_Item* item, char *btn_label, Evas_Object *icon, int button_type, Evas_Smart_Cb func, const void *data)
\r
663 char buf[1024],theme[1024];
\r
664 fn_button *btn_det = NULL;
\r
665 EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)
\r
667 if (btn_det->btn_id == button_type)
\r
669 evas_object_del(btn_det->btn);
\r
672 item->fnbtn_list = eina_list_remove_list(item->fnbtn_list, bl);
\r
675 btn = elm_button_add(item->obj);
\r
676 btn_det = ELM_NEW(btn_det);
\r
677 if (!btn_det) return;
\r
678 if (button_type == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)
\r
680 snprintf(theme, sizeof(theme), "navigationbar_backbutton/%s", elm_widget_style_get(item->obj));
\r
681 elm_object_style_set(btn, theme);
\r
682 snprintf(buf, sizeof(buf), "elm.swallow.back");
\r
686 snprintf(theme, sizeof(theme), "navigationbar_functionbutton/%s", elm_widget_style_get(item->obj));
\r
687 elm_object_style_set(btn, theme);
\r
688 snprintf(buf, sizeof(buf), "elm.swallow.btn%d", button_type);
\r
691 elm_button_label_set(btn, btn_label);
\r
693 elm_button_icon_set(btn, icon);
\r
694 elm_object_focus_allow_set(btn, EINA_FALSE);
\r
695 evas_object_smart_callback_add(btn, "clicked", func, data);
\r
696 edje_object_part_swallow(item->base, buf, btn);
\r
697 elm_widget_sub_object_add(item->obj, btn);
\r
698 btn_det->btn = btn;
\r
699 btn_det->btn_id = button_type;
\r
700 item->fnbtn_list = eina_list_append(item->fnbtn_list, btn_det);
\r
704 * Return the button object of the pushed content
\r
706 * @param[in] item The Navigationbar_ex Item
\r
707 * @param[in] button_type Indicates the position
\r
708 * @return The button object or NULL if none
\r
710 * @ingroup Navigationbar_ex
\r
713 elm_navigationbar_ex_item_title_button_get(Elm_Navigationbar_ex_Item* item, int button_type)
\r
715 if (!item) return NULL;
\r
716 fn_button *btn_det;
\r
718 EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)
\r
720 if (btn_det->btn_id == button_type)
\r
721 return btn_det->btn;
\r
727 * Unset the button object of the pushed content
\r
729 * @param[in] item The Navigationbar_ex Item
\r
730 * @param[in] button_type Indicates the position
\r
731 * @return The button object or NULL if none
\r
733 * @ingroup Navigationbar_ex
\r
736 elm_navigationbar_ex_item_title_button_unset(Elm_Navigationbar_ex_Item* item, int button_type)
\r
738 if (!item) return NULL;
\r
739 fn_button *btn_det;
\r
741 Evas_Object *btn_ret;
\r
742 EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)
\r
744 if (btn_det->btn_id == button_type)
\r
746 btn_ret = btn_det->btn;
\r
747 elm_widget_sub_object_del(item->obj,btn_det->btn);
\r
748 edje_object_part_unswallow(item->base,btn_det->btn);
\r
749 item->fnbtn_list = eina_list_remove_list(item->fnbtn_list, bl);
\r
750 btn_det->btn = NULL;
\r
758 * Sets a title object for the Item
\r
759 * @param[in] item The Navigationbar_ex Item
\r
760 * @param[in] title_obj Title object (normally segment_control/searchbar)
\r
762 * @ingroup Navigationbar_ex
\r
765 elm_navigationbar_ex_item_title_object_set(Elm_Navigationbar_ex_Item* item, Evas_Object *title_obj)
\r
768 if (item->title_obj) evas_object_del(item->title_obj);
\r
769 item->title_obj = title_obj;
\r
772 elm_widget_sub_object_add(item->obj,title_obj);
\r
773 edje_object_part_swallow(item->base, "elm.swallow.title", title_obj);
\r
774 edje_object_signal_callback_add(item->base, "elm,action,clicked", "elm",
\r
775 _switch_titleobj_visibility, item);
\r
777 _sizing_eval(item->obj);
\r
781 * Hides the title area of the item.
\r
782 * @param[in] item The Navigationbar_ex Item
\r
783 * @param[in] hidden if EINA_TRUE the title area is hidden else its shown.
\r
785 * @ingroup Navigationbar_ex
\r
789 elm_navigationbar_ex_item_title_hidden_set(Elm_Navigationbar_ex_Item* item, Eina_Bool hidden)
\r
792 if (hidden) edje_object_signal_emit(item->base, "elm,state,item,moveup", "elm");
\r
793 else edje_object_signal_emit(item->base, "elm,state,item,movedown", "elm");
\r
794 _sizing_eval(item->obj);
\r
798 * Unsets a title object for the item, the return object has to be deleted
\r
799 * by application if not added again in to navigationbar.
\r
801 * @param[in] item The Navigationbar_ex Item
\r
802 * @return The title object or NULL if none is set
\r
804 * @ingroup Navigationbar_ex
\r
807 elm_navigationbar_ex_item_title_object_unset(Elm_Navigationbar_ex_Item* item)
\r
809 if (!item) return NULL;
\r
810 Evas_Object *title_obj=NULL;
\r
811 if (!item->title_obj) return NULL;
\r
812 title_obj = item->title_obj;
\r
813 elm_widget_sub_object_del(item->obj,item->title_obj);
\r
814 edje_object_part_unswallow(item->base,item->title_obj);
\r
815 item->title_obj = NULL;
\r
820 * Returns the title object of the pushed content.
\r
822 * @param[in] item The Navigationbar_ex Item
\r
823 * @return The title object or NULL if none is set
\r
825 * @ingroup Navigationbar_ex
\r
828 elm_navigationbar_ex_item_title_object_get(Elm_Navigationbar_ex_Item* item)
\r
830 if (!item) return NULL;
\r
831 return item->title_obj;
\r
836 * Unsets the content of the item, the return object has to be deleted
\r
837 * by application if not added again in to navigationbar, when the content
\r
838 * is unset the corresponding item would be deleted, when this content is pushed again
\r
839 * a new item would be created again.
\r
841 * @param[in] item The Navigationbar_ex Item
\r
842 * @return The content object or NULL if none is set
\r
844 * @ingroup Navigationbar_ex
\r
847 elm_navigationbar_ex_item_content_unset(Elm_Navigationbar_ex_Item* item)
\r
849 if (!item) return NULL;
\r
850 Evas_Object *content = _content_unset(item);
\r
855 * Returns the content of the item.
\r
857 * @param[in] item The Navigationbar_ex Item
\r
858 * @return The content object or NULL if none is set
\r
860 * @ingroup Navigationbar_ex
\r
863 elm_navigationbar_ex_item_content_get(Elm_Navigationbar_ex_Item* item)
\r
865 if (!item) return NULL;
\r
866 return item->content;
\r
870 * Set whether the content pushed has to be deleted on pop.
\r
871 * if false the item is not deleted but only removed from the stack
\r
872 * the pointer of the content is sent along with hide,finished signal.
\r
874 * @param[in] obj The Navigationbar_ex object.
\r
875 * @param[in] del_on_pop if set the content is deleted on pop else unset, by default the value is EINA_TRUE.
\r
877 * @ingroup Navigationbar_ex
\r
880 elm_navigationbar_ex_delete_on_pop_set(Evas_Object *obj, Eina_Bool del_on_pop)
\r
882 ELM_CHECK_WIDTYPE(obj, widtype);
\r
883 Widget_Data *wd = elm_widget_data_get(obj);
\r
885 wd->del_on_pop = del_on_pop;
\r
889 * Sets the style of the navigationbar item.
\r
890 * @param[in] item The Navigationbar_ex Item
\r
891 * @param[in] item_style Navigationbar Item style, this can be used when the style of the item has to be dynamically set.
\r
893 * @ingroup Navigationbar_ex
\r
896 elm_navigationbar_ex_item_style_set(Elm_Navigationbar_ex_Item* item, const char* item_style)
\r
899 if(!item_style) return;
\r
903 fn_button *btn_det;
\r
904 strncpy(buf, "item/", sizeof(buf));
\r
905 strncat(buf, item_style, sizeof(buf) - strlen(buf));
\r
906 if (!eina_stringshare_replace(&item->item_style, item_style)) return;
\r
907 _elm_theme_object_set(item->obj, item->base, "navigationbar_ex", buf, elm_widget_style_get(item->obj));
\r
909 edje_object_part_text_set(item->base, "elm.text", item->title);
\r
910 if (item->subtitle)
\r
911 edje_object_part_text_set(item->base, "elm.text.sub", item->subtitle);
\r
912 if (item->fnbtn_list)
\r
914 EINA_LIST_FOREACH(item->fnbtn_list, bl, btn_det)
\r
916 if (btn_det->btn_id == ELM_NAVIGATIONBAR_EX_BACK_BUTTON)
\r
918 snprintf(buf_fn, sizeof(buf_fn), "navigationbar_backbutton/%s", elm_widget_style_get(item->obj));
\r
919 elm_object_style_set(btn_det->btn, buf_fn);
\r
923 snprintf(buf_fn, sizeof(buf_fn), "navigationbar_functionbutton/%s", elm_widget_style_get(item->obj));
\r
924 elm_object_style_set(btn_det->btn, buf_fn);
\r
931 * Returns the style of the item.
\r
933 * @param[in] item The Navigationbar_ex Item
\r
934 * @return The item style.
\r
936 * @ingroup Navigationbar_ex
\r
939 elm_navigationbar_ex_item_style_get(Elm_Navigationbar_ex_Item* item)
\r
941 if (!item) return NULL;
\r
942 return item->item_style;
\r
947 * Promote an object already in the stack to the top of the stack
\r
949 * This will take the indicated object and promote it to the top of the stack
\r
950 * as if it had been pushed there. The object must already be inside the
\r
951 * Navigationbar_ex stack to work.
\r
953 * @param[in] item The Navigationbar_ex item to promote.
\r
954 * @ingroup Navigationbar_ex
\r
957 elm_navigationbar_ex_item_promote(Elm_Navigationbar_ex_Item* item)
\r
960 _item_promote(item);
\r
964 * Pop to the inputted Navigationbar_ex item
\r
965 * the rest of the items are deleted.
\r
967 * @param[in] item The Navigationbar_ex item
\r
969 * @ingroup Navigationbar_ex
\r
972 elm_navigationbar_ex_to_item_pop(Elm_Navigationbar_ex_Item* item)
\r
975 Widget_Data *wd = elm_widget_data_get(item->obj);
\r
976 Elm_Navigationbar_ex_Item *it = NULL;
\r
979 if (!wd->stack) return;
\r
980 it = eina_list_last(wd->stack)->data;
\r
981 it->popme = EINA_TRUE;
\r
982 list = eina_list_last(wd->stack);
\r
990 wd->to_delete = eina_list_append(wd->to_delete, it);
\r
991 wd->stack = eina_list_remove_list(wd->stack, list);
\r
999 _eval_top(it->obj);
\r
1000 if (wd->to_delete)
\r
1001 _process_deletions(wd);
\r
1005 * Pop the object that is on top of the Navigationbar_ex stack
\r
1006 * This pops the object that is on top (visible) in the navigationbar, makes it disappear, then deletes/unsets the object
\r
1007 * based on del_on_pop variable.
\r
1008 * The object that was underneath it on the stack will become visible.
\r
1010 * @param[in] obj The Navigationbar_ex object
\r
1012 * @ingroup Navigationbar_ex
\r
1015 elm_navigationbar_ex_item_pop(Evas_Object *obj)
\r
1017 ELM_CHECK_WIDTYPE(obj, widtype);
\r
1018 Widget_Data *wd = elm_widget_data_get(obj);
\r
1020 Elm_Navigationbar_ex_Item *it;
\r
1022 if (!wd->stack) return;
\r
1023 it = eina_list_last(wd->stack)->data;
\r
1024 it->popme = EINA_TRUE;
\r
1025 ll = eina_list_last(wd->stack);
\r
1032 Evas_Object *o, *o2;
\r
1033 const char *onhide;
\r
1036 o = wd->top->ct_base;
\r
1037 o2 = wd->top->base;
\r
1039 edje_object_signal_emit(o2, "elm,action,pop", "elm");
\r
1040 edje_object_signal_emit(o, "elm,action,pop", "elm");
\r
1041 onhide = edje_object_data_get(o, "onhide");
\r
1044 if (!strcmp(onhide, "raise"))
\r
1046 evas_object_raise(o2);
\r
1047 evas_object_raise(o);
\r
1049 else if (!strcmp(onhide, "lower"))
\r
1051 evas_object_lower(o2);
\r
1052 evas_object_lower(o);
\r
1060 _item_promote(it);
\r
1067 * Return the item at the bottom of the Navigationbar_ex stack
\r
1069 * @param[in] obj The Navigationbar_ex object
\r
1070 * @return The bottom item or NULL if none
\r
1072 * @ingroup Navigationbar_ex
\r
1074 EAPI Elm_Navigationbar_ex_Item*
\r
1075 elm_navigationbar_ex_item_bottom_get(const Evas_Object *obj)
\r
1077 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
1078 Widget_Data *wd = elm_widget_data_get(obj);
\r
1079 Elm_Navigationbar_ex_Item *it;
\r
1080 if (!wd) return NULL;
\r
1081 if (!wd->stack) return NULL;
\r
1082 it = wd->stack->data;
\r
1087 * Return the item at the top of the Navigationbar_ex stack
\r
1089 * @param[in] obj The Navigationbar_ex object
\r
1090 * @return The top object or NULL if none
\r
1092 * @ingroup Navigationbar_ex
\r
1094 EAPI Elm_Navigationbar_ex_Item*
\r
1095 elm_navigationbar_ex_item_top_get(const Evas_Object *obj)
\r
1097 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
\r
1098 Widget_Data *wd = elm_widget_data_get(obj);
\r
1099 Elm_Navigationbar_ex_Item *it;
\r
1100 if (!wd) return NULL;
\r
1101 if (!wd->stack) return NULL;
\r
1102 it = eina_list_last(wd->stack)->data;
\r
1107 * This disables content animation on push/pop.
\r
1109 * @param obj The navigationbar_ex object
\r
1110 * @param disable if EINA_TRUE animation is disabled.
\r
1112 * @ingroup Navigationbar_ex
\r
1115 elm_navigationbar_ex_animation_disable_set(Evas_Object *obj, Eina_Bool disable)
\r
1117 ELM_CHECK_WIDTYPE(obj, widtype);
\r
1118 Widget_Data *wd = elm_widget_data_get(obj);
\r
1119 wd->disable_animation = disable;
\r
1123 * This shows/hides title object area.
\r
1125 * @param[in] item The Navigationbar_ex item
\r
1126 * @param[in] visible if EINA_TRUE title object is shown else its hidden.
\r
1127 * @ingroup Navigationbar_ex
\r
1130 elm_navigationbar_ex_title_object_visible_set(Elm_Navigationbar_ex_Item* item, Eina_Bool visible)
\r
1133 if(!item->title_obj) return;
\r
1136 edje_object_signal_emit(item->base, "elm,state,show,title", "elm");
\r
1137 evas_object_smart_callback_call(item->obj, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_TRUE);
\r
1141 edje_object_signal_emit(item->base, "elm,state,hide,title", "elm");
\r
1142 evas_object_smart_callback_call(item->obj, SIG_TITLE_OBJ_VISIBLE_CHANGED, (void *) EINA_FALSE);
\r
1144 item->titleobj_visible = visible;
\r
1148 * This gets the status whether title object is shown/hidden.
\r
1150 * @param[in] item The Navigationbar_ex item
\r
1151 * @return The status whether title object is shown/hidden.
\r
1152 * @ingroup Navigationbar_ex
\r
1155 elm_navigationbar_ex_title_object_visible_get(Elm_Navigationbar_ex_Item* item)
\r
1157 if (!item) return NULL;
\r
1158 return item->titleobj_visible;
\r