const char *subtitle;
Evas_Object *title_obj;
Eina_List *title_list;
+//TODO: It will be better to make btns array
Evas_Object *fn_btn1;
Evas_Object *fn_btn2;
+//TODO: Let's remove fn_btn3!!
Evas_Object *fn_btn3;
+//TODO: Let's remove back_btn!!
Evas_Object *back_btn;
Evas_Object *content;
Evas_Object *icon;
static Evas_Object *_multiple_object_set(Evas_Object *obj, Evas_Object *sub_obj, Eina_List *list, int width);
static Elm_Navigationbar_Item *_check_item_is_added(Evas_Object *obj, Evas_Object *content);
static void _transition_complete_cb(void *data);
-static void _elm_navigationbar_back_button_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button);
-static Evas_Object *_elm_navigationbar_back_button_get(Evas_Object *obj, Evas_Object *content);
-static void _elm_navigationbar_function_button1_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button);
-static Evas_Object *_elm_navigationbar_function_button1_get(Evas_Object *obj, Evas_Object *content);
-static void _elm_navigationbar_function_button2_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button);
-static Evas_Object *_elm_navigationbar_function_button2_get(Evas_Object *obj, Evas_Object *content);
-static void _elm_navigationbar_function_button3_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button);
-static Evas_Object *_elm_navigationbar_function_button3_get(Evas_Object *obj, Evas_Object *content);
+static void _elm_navigationbar_back_button_set(Evas_Object *obj, Evas_Object *content, Evas_Object *btn, Elm_Navigationbar_Item *it);
+static void _elm_navigationbar_function_button1_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it);
+static void _elm_navigationbar_function_button2_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it);
+static void _elm_navigationbar_function_button3_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it);
static void _switch_titleobj_visibility(void *data, Evas_Object *obj, const char *emission, const char *source);
-#define PREV_BUTTON_DEFAULT_LABEL "Previous"
+#define _ELM_NAVIBAR_PREV_BTN_DEFAULT_LABEL "Previous"
static void _content_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
{
it->back_btn = NULL;
}
+//TODO: Consider to make fn_btn*_set to one function.
+static Eina_Bool
+_fn_btn1_set(Elm_Navigationbar_Item *it, Evas_Object *btn)
+{
+ Eina_Bool changed;
+
+ if(it->fn_btn1 == btn) return EINA_FALSE;
+
+ changed = _button_set(it->obj, it->fn_btn1, btn, EINA_FALSE);
+ it->fn_btn1 = btn;
+
+ if ((!changed) || (!btn)) return EINA_FALSE;
+
+ evas_object_event_callback_add(btn, EVAS_CALLBACK_DEL, _fn_btn1_del, it);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_fn_btn2_set(Elm_Navigationbar_Item *it, Evas_Object *btn)
+{
+ Eina_Bool changed;
+
+ if(it->fn_btn1 == btn) return EINA_FALSE;
+
+ changed = _button_set(it->obj, it->fn_btn1, btn, EINA_FALSE);
+ it->fn_btn2 = btn;
+
+ if ((!changed) || (!btn)) return EINA_FALSE;
+
+ evas_object_event_callback_add(btn, EVAS_CALLBACK_DEL, _fn_btn2_del, it);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_fn_btn3_set(Elm_Navigationbar_Item *it, Evas_Object *btn)
+{
+ Eina_Bool changed;
+
+ if(it->fn_btn3 == btn) return EINA_FALSE;
+
+ changed = _button_set(it->obj, it->fn_btn3, btn, EINA_FALSE);
+ it->fn_btn3 = btn;
+
+ if ((!changed) || (!btn)) return EINA_FALSE;
+
+ evas_object_event_callback_add(btn, EVAS_CALLBACK_DEL, _fn_btn3_del, it);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_back_btn_set(Elm_Navigationbar_Item *it, Evas_Object *btn)
+{
+ Eina_Bool changed;
+
+ if(it->back_btn == btn) return EINA_FALSE;
+
+ changed = _button_set(it->obj, it->back_btn, btn, EINA_TRUE);
+ it->back_btn = btn;
+
+ if ((!changed) || (!btn)) return EINA_FALSE;
+
+ evas_object_event_callback_add(btn, EVAS_CALLBACK_DEL, _back_btn_del, it);
+
+ return EINA_TRUE;
+}
+
+static Evas_Object *
+_create_back_btn(Evas_Object *parent, const char *title, void *data)
+{
+ Evas_Object *btn = elm_button_add(parent);
+ if (!btn) return NULL;
+ elm_button_label_set(btn, title);
+ evas_object_smart_callback_add(btn, "clicked", _back_button_clicked, data);
+ elm_object_focus_allow_set(btn, EINA_FALSE);
+ return btn;
+}
+
static void
_del_hook(Evas_Object *obj)
{
Elm_Navigationbar_Item *it;
EINA_LIST_FOREACH(wd->stack, list, it)
- _delete_item(it);
+ _delete_item(it);
eina_list_free(wd->stack);
free(wd);
}
_back_button_clicked(void *data, Evas_Object *obj, void *event_info)
{
Elm_Navigationbar_Item *it = data;
-
elm_navigationbar_pop(it->obj);
}
char buf[4096]; //TODO: How to guarantee this buffer size?
Eina_Bool changed = EINA_FALSE;
- if (prev_btn) evas_object_del(prev_btn);
+ if (prev_btn)
+ {
+ changed = EINA_TRUE;
+ evas_object_del(prev_btn);
+ }
if (!new_btn) return changed;
if (back_btn)
elm_widget_sub_object_add(obj, new_btn);
changed = EINA_TRUE;
- //TODO: Need to set EVAS_CALLBACK_DEL
-
return changed;
}
}
}
-
/**
* Add a new navigationbar to the parent
*
if (!it) it = ELM_NEW(Elm_Navigationbar_Item);
if (!it) return;
- _button_set(obj, NULL, fn_btn1, EINA_FALSE);
- _button_set(obj, NULL, fn_btn2, EINA_FALSE);
- _button_set(obj, NULL, fn_btn3, EINA_FALSE);
-
ll = eina_list_last(wd->stack);
if (ll) prev_it = ll->data;
else prev_it = NULL;
- it->obj = obj;
- it->fn_btn1 = fn_btn1;
- it->fn_btn2 = fn_btn2;
- it->fn_btn3 = fn_btn3;
+ _fn_btn1_set(it, fn_btn1);
+ _fn_btn2_set(it, fn_btn2);
+ _fn_btn3_set(it, fn_btn3);
- if (fn_btn1) evas_object_event_callback_add(fn_btn1, EVAS_CALLBACK_DEL, _fn_btn1_del, it);
- if (fn_btn2) evas_object_event_callback_add(fn_btn2, EVAS_CALLBACK_DEL, _fn_btn2_del, it);
- if (fn_btn3) evas_object_event_callback_add(fn_btn3, EVAS_CALLBACK_DEL, _fn_btn3_del, it);
+ it->obj = obj;
it->content = content;
- //TODO: if contnet is not added yet and not null.
evas_object_event_callback_add(it->content, EVAS_CALLBACK_DEL, _content_del, it);
//Add a prev-button automatically.
if ((!fn_btn1) && (prev_it))
- {
- it->back_btn = elm_button_add(obj);
-
- if (prev_it->title)
- elm_button_label_set(it->back_btn, prev_it->title);
- else
- elm_button_label_set(it->back_btn, PREV_BUTTON_DEFAULT_LABEL);
-
- evas_object_smart_callback_add(it->back_btn, "clicked", _back_button_clicked, it);
- _button_set(obj, NULL, it->back_btn, EINA_TRUE);
- elm_object_focus_allow_set(it->back_btn, EINA_FALSE);
- if (it->back_btn) evas_object_event_callback_add(it->back_btn, EVAS_CALLBACK_DEL, _back_btn_del, it);
- }
+ {
+ if (prev_it->title)
+ _back_btn_set(it, _create_back_btn(obj, prev_it->title, it));
+ else
+ _back_btn_set(it, _create_back_btn(obj, _ELM_NAVIBAR_PREV_BTN_DEFAULT_LABEL, it));
+ }
eina_stringshare_replace(&it->title, title);
edje_object_part_text_set(wd->base, "elm.text", title);
}
static void
-_elm_navigationbar_back_button_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button)
+_elm_navigationbar_back_button_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it)
{
- Widget_Data *wd = elm_widget_data_get(obj);
+ Widget_Data *wd;
Eina_List *ll;
- Elm_Navigationbar_Item *it;
- Eina_Bool changed;
+ Elm_Navigationbar_Item *top_it;
+ wd = elm_widget_data_get(obj);
if (!wd) return;
- EINA_LIST_FOREACH(wd->stack, ll, it)
- {
- if (it->content == content)
- {
- if(it->back_btn == button)
- return;
- changed = _button_set(obj, it->back_btn, button, EINA_TRUE);
- it->back_btn = button;
- _item_sizing_eval(it);
- break;
- }
- }
+
+ if (!_back_btn_set(it, new_btn)) return;
//update if the content is the top item
ll = eina_list_last(wd->stack);
if (ll)
{
- it = ll->data;
- if (it->back_btn && changed && (it->content == content) && (!it->fn_btn1))
+ top_it = ll->data;
+ if ((top_it->content == content) && (!top_it->fn_btn1))
{
- edje_object_part_swallow(wd->base, "elm.swallow.btn1", it->back_btn);
- evas_object_smart_callback_add(it->back_btn, "clicked", _back_button_clicked, it);
+ edje_object_part_swallow(wd->base, "elm.swallow.btn1", top_it->back_btn);
+ evas_object_smart_callback_add(it->back_btn, "clicked", _back_button_clicked, top_it);
}
}
}
-static Evas_Object *
-_elm_navigationbar_back_button_get(Evas_Object *obj, Evas_Object *content)
-{
- Widget_Data *wd = elm_widget_data_get(obj);
- Eina_List *ll;
- Elm_Navigationbar_Item *it;
-
- if (!wd) return NULL;
- EINA_LIST_FOREACH(wd->stack, ll, it)
- {
- if (it->content == content)
- return it->back_btn;
- }
- return NULL;
-}
-
static void
-_elm_navigationbar_function_button1_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button)
+_elm_navigationbar_function_button1_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it)
{
Widget_Data *wd;
Eina_List *ll;
- Elm_Navigationbar_Item *it;
- Eina_Bool changed;
+ Elm_Navigationbar_Item *top_it;
wd = elm_widget_data_get(obj);
if (!wd) return;
- EINA_LIST_FOREACH(wd->stack, ll, it)
- {
- if (it->content == content)
- {
- if(it->fn_btn1 == button) return;
- changed = _button_set(obj, it->fn_btn1, button, EINA_FALSE);
- it->fn_btn1 = button;
- _item_sizing_eval(it);
- break;
- }
- }
+ if (!_fn_btn1_set(it, new_btn)) return;
//update if the content is the top item
- if ((!it) || (!it->fn_btn1) || (!changed)) return;
-
- evas_object_event_callback_add(button, EVAS_CALLBACK_DEL, _fn_btn1_del, it);
-
ll = eina_list_last(wd->stack);
if (!ll) return;
- it = ll->data;
- if (it->content == content)
+ top_it = ll->data;
+ if (top_it->content == content)
{
- if (edje_object_part_swallow_get(wd->base, "elm.swallow.btn1") == it->back_btn)
+ if (edje_object_part_swallow_get(wd->base, "elm.swallow.btn1") == top_it->back_btn)
{
- edje_object_part_unswallow(wd->base, it->back_btn);
+ edje_object_part_unswallow(wd->base, top_it->back_btn);
//TODO: WHO REMOVE THIS?
- evas_object_hide(it->back_btn);
+ evas_object_hide(top_it->back_btn);
}
//TODO: IS THERE NO POSSIBLILITY TO SET FUNCTIONBTN1 MULTIPLE?
- edje_object_part_swallow(wd->base, "elm.swallow.btn1", it->fn_btn1);
- }
-}
-
-static Evas_Object *
-_elm_navigationbar_function_button1_get(Evas_Object *obj, Evas_Object *content)
-{
- Widget_Data *wd;
- Eina_List *ll;
- Elm_Navigationbar_Item *it;
-
- wd = elm_widget_data_get(obj);
- if (!wd) return NULL;
-
- EINA_LIST_FOREACH(wd->stack, ll, it)
- {
- if (it->content == content)
- return it->fn_btn1;
+ edje_object_part_swallow(wd->base, "elm.swallow.btn1", top_it->fn_btn1);
}
- return NULL;
}
//TODO: looks make this _elm_navigationbar_function_button1_set same.
static void
-_elm_navigationbar_function_button2_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button)
+_elm_navigationbar_function_button2_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it)
{
Widget_Data *wd;
Eina_List *ll;
- Elm_Navigationbar_Item *it;
- Eina_Bool changed;
+ Elm_Navigationbar_Item *top_it;
wd = elm_widget_data_get(obj);
if (!wd) return;
- EINA_LIST_FOREACH(wd->stack, ll, it)
- {
- if (it->content == content)
- {
- if(it->fn_btn2 == button) return;
- changed = _button_set(obj, it->fn_btn2, button, EINA_FALSE);
- it->fn_btn2 = button;
- _item_sizing_eval(it);
- break;
- }
- }
+ if (!_fn_btn2_set(it, new_btn)) return;
//update if the content is the top item
- if ((!it) || (!it->fn_btn2) || (!changed)) return;
-
- evas_object_event_callback_add(button, EVAS_CALLBACK_DEL, _fn_btn2_del, it);
-
ll = eina_list_last(wd->stack);
if (!ll) return;
- it = ll->data;
+ top_it = ll->data;
//TODO: IS THERE NO POSSIBLILITY TO SET FUNCTIONBTN2 MULTIPLE?
- if (it->content == content)
- edje_object_part_swallow(wd->base, "elm.swallow.btn2", it->fn_btn2);
+ if (top_it->content == content)
+ edje_object_part_swallow(wd->base, "elm.swallow.btn2", top_it->fn_btn2);
}
-static Evas_Object *
-_elm_navigationbar_function_button2_get(Evas_Object *obj,
- Evas_Object *content)
-{
- Widget_Data *wd;
- Eina_List *ll;
- Elm_Navigationbar_Item *it;
-
- wd = elm_widget_data_get(obj);
- if (!wd) return NULL;
-
- EINA_LIST_FOREACH(wd->stack, ll, it)
- {
- if (it->content == content)
- return it->fn_btn2;
- }
- return NULL;
-}
//TODO: looks make this _elm_navigationbar_function_button1_set same.
static void
-_elm_navigationbar_function_button3_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button)
+_elm_navigationbar_function_button3_set(Evas_Object *obj, Evas_Object *content, Evas_Object *new_btn, Elm_Navigationbar_Item *it)
{
Widget_Data *wd;
Eina_List *ll;
- Elm_Navigationbar_Item *it;
- Eina_Bool changed;
+ Elm_Navigationbar_Item *top_it;
wd = elm_widget_data_get(obj);
if (!wd) return;
- EINA_LIST_FOREACH(wd->stack, ll, it)
- {
- if (it->content == content)
- {
- if(it->fn_btn3 == button)
- return;
- changed = _button_set(obj, it->fn_btn3, button, EINA_FALSE);
- it->fn_btn3 = button;
- _item_sizing_eval(it);
- break;
- }
- }
-
- //update if the content is the top item
- if ((!it) || (!it->fn_btn3) || (!changed)) return;
-
- evas_object_event_callback_add(button, EVAS_CALLBACK_DEL, _fn_btn3_del, it);
+ if (!_fn_btn3_set(it, new_btn)) return;
ll = eina_list_last(wd->stack);
if (!ll) return;
- it = ll->data;
+ top_it = ll->data;
- if (it->content == content)
+ //TODO: remove paddings!!
+ if (top_it->content == content)
{
edje_object_signal_emit(wd->base, "elm,state,item,add,rightpad2", "elm");
edje_object_signal_emit(wd->base, "elm,state,item,fn_btn3_set", "elm");
- edje_object_part_swallow(wd->base, "elm.swallow.btn3", it->fn_btn3);
+ edje_object_part_swallow(wd->base, "elm.swallow.btn3", top_it->fn_btn3);
}
else
edje_object_signal_emit(wd->base, "elm,state,retract,title", "elm");
}
-static Evas_Object *
-_elm_navigationbar_function_button3_get(Evas_Object *obj,
- Evas_Object *content)
-{
- Widget_Data *wd;
- Eina_List *ll;
- Elm_Navigationbar_Item *it;
-
- wd = elm_widget_data_get(obj);
- if (!wd) return NULL;
-
- EINA_LIST_FOREACH(wd->stack, ll, it)
- {
- if (it->content == content)
- return it->fn_btn3;
- }
-
- return NULL;
-}
-
/**
* Return the content object at the top of the NavigationBar stack
*
elm_navigationbar_title_button_set(Evas_Object *obj, Evas_Object *content, Evas_Object *button, Elm_Navi_Button_Type button_type)
{
ELM_CHECK_WIDTYPE(obj, widtype);
+
+ Widget_Data *wd;
+ Eina_List *ll;
+ Elm_Navigationbar_Item *it;
+
if (!content) return;
+ wd = elm_widget_data_get(obj);
+ if (!wd) return;
+
+ EINA_LIST_FOREACH(wd->stack, ll, it)
+ if (it->content == content) break;
+
+ if (!it) return;
+
switch(button_type)
{
case ELM_NAVIGATIONBAR_FUNCTION_BUTTON1:
- _elm_navigationbar_function_button1_set(obj, content, button);
+ _elm_navigationbar_function_button1_set(obj, content, button, it);
break;
case ELM_NAVIGATIONBAR_FUNCTION_BUTTON2:
- _elm_navigationbar_function_button2_set(obj, content, button);
+ _elm_navigationbar_function_button2_set(obj, content, button, it);
break;
case ELM_NAVIGATIONBAR_FUNCTION_BUTTON3:
- _elm_navigationbar_function_button3_set(obj, content, button);
- break;
- case ELM_NAVIGATIONBAR_BACK_BUTTON:
- _elm_navigationbar_back_button_set(obj, content, button);
+ _elm_navigationbar_function_button3_set(obj, content, button, it);
break;
default:
+ _elm_navigationbar_back_button_set(obj, content, button, it);
break;
}
_sizing_eval(obj);
elm_navigationbar_title_button_get(Evas_Object *obj, Evas_Object *content, Elm_Navi_Button_Type button_type)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
- Evas_Object *button;
+ Widget_Data *wd;
+ Eina_List *ll;
+ Elm_Navigationbar_Item *it;
if ((!content) || (!obj))
return NULL;
- button = NULL;
+ wd = elm_widget_data_get(obj);
+ if (!wd) return NULL;
- switch(button_type)
+ EINA_LIST_FOREACH(wd->stack, ll, it)
{
- case ELM_NAVIGATIONBAR_FUNCTION_BUTTON1:
- button = _elm_navigationbar_function_button1_get(obj, content);
- break;
- case ELM_NAVIGATIONBAR_FUNCTION_BUTTON2:
- button = _elm_navigationbar_function_button2_get(obj, content);
- break;
- case ELM_NAVIGATIONBAR_FUNCTION_BUTTON3:
- button = _elm_navigationbar_function_button3_get(obj, content);
- break;
- case ELM_NAVIGATIONBAR_BACK_BUTTON:
- button = _elm_navigationbar_back_button_get(obj, content);
- break;
- default:
- break;
+ if (it->content != content) continue;
+
+ switch(button_type)
+ {
+ case ELM_NAVIGATIONBAR_FUNCTION_BUTTON1:
+ return it->fn_btn1;
+ case ELM_NAVIGATIONBAR_FUNCTION_BUTTON2:
+ return it->fn_btn2;
+ case ELM_NAVIGATIONBAR_FUNCTION_BUTTON3:
+ return it->fn_btn3;
+ default:
+ return it->back_btn;
+ }
}
- return button;
+ return NULL;
}
/**