2011-07-12 21:21:50 -07:00
|
|
|
#include <Elementary.h>
|
|
|
|
#include "elm_priv.h"
|
2012-06-01 14:56:09 -07:00
|
|
|
#include "elm_widget_layout.h"
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static const char NAVIFRAME_SMART_NAME[] = "elm_naviframe";
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
typedef struct _Elm_Naviframe_Smart_Data Elm_Naviframe_Smart_Data;
|
|
|
|
typedef struct _Elm_Naviframe_Item Elm_Naviframe_Item;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
struct _Elm_Naviframe_Smart_Data
|
2011-09-13 23:23:08 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Layout_Smart_Data base;
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
Eina_Inlist *stack; /* top item is the list's LAST item */
|
|
|
|
Evas_Object *dummy_edje;
|
|
|
|
|
|
|
|
Eina_Bool preserve : 1;
|
|
|
|
Eina_Bool on_deletion : 1;
|
|
|
|
Eina_Bool auto_pushed : 1;
|
|
|
|
Eina_Bool freeze_events : 1;
|
2011-09-13 23:23:08 -07:00
|
|
|
};
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
struct _Elm_Naviframe_Item
|
|
|
|
{
|
2011-10-20 17:45:19 -07:00
|
|
|
ELM_WIDGET_ITEM;
|
2011-10-12 23:30:05 -07:00
|
|
|
EINA_INLIST;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
Evas_Object *content;
|
|
|
|
Evas_Object *title_prev_btn;
|
|
|
|
Evas_Object *title_next_btn;
|
|
|
|
Evas_Object *title_icon;
|
2012-07-31 04:12:00 -07:00
|
|
|
Evas_Object *title;
|
|
|
|
Evas_Object *subtitle;
|
2012-06-01 14:56:09 -07:00
|
|
|
const char *style;
|
2012-07-25 10:38:48 -07:00
|
|
|
const char *title_label;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
Evas_Coord minw;
|
|
|
|
Evas_Coord minh;
|
|
|
|
|
|
|
|
Eina_Bool title_visible : 1;
|
|
|
|
Eina_Bool content_unfocusable : 1;
|
|
|
|
};
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
static const char CONTENT_PART[] = "elm.swallow.content";
|
|
|
|
static const char PREV_BTN_PART[] = "elm.swallow.prev_btn";
|
|
|
|
static const char NEXT_BTN_PART[] = "elm.swallow.next_btn";
|
|
|
|
static const char ICON_PART[] = "elm.swallow.icon";
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
|
|
|
|
static const char SIG_TITLE_CLICKED[] = "title,clicked";
|
2012-06-01 14:56:09 -07:00
|
|
|
static const Evas_Smart_Cb_Description _smart_callbacks[] = {
|
|
|
|
{SIG_TRANSITION_FINISHED, ""},
|
|
|
|
{SIG_TITLE_CLICKED, ""},
|
|
|
|
{NULL, NULL}
|
2011-07-12 21:21:50 -07:00
|
|
|
};
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
#define ELM_NAVIFRAME_DATA_GET(o, sd) \
|
|
|
|
Elm_Naviframe_Smart_Data * sd = evas_object_smart_data_get(o)
|
|
|
|
|
|
|
|
#define ELM_NAVIFRAME_DATA_GET_OR_RETURN(o, ptr) \
|
|
|
|
ELM_NAVIFRAME_DATA_GET(o, ptr); \
|
|
|
|
if (!ptr) \
|
|
|
|
{ \
|
|
|
|
CRITICAL("No widget data for object %p (%s)", \
|
|
|
|
o, evas_object_type_get(o)); \
|
|
|
|
return; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define ELM_NAVIFRAME_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
|
|
|
|
ELM_NAVIFRAME_DATA_GET(o, ptr); \
|
|
|
|
if (!ptr) \
|
|
|
|
{ \
|
|
|
|
CRITICAL("No widget data for object %p (%s)", \
|
|
|
|
o, evas_object_type_get(o)); \
|
|
|
|
return val; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define ELM_NAVIFRAME_CHECK(obj) \
|
|
|
|
if (!obj || !elm_widget_type_check((obj), NAVIFRAME_SMART_NAME, \
|
|
|
|
__func__)) \
|
|
|
|
return
|
|
|
|
|
|
|
|
#define ELM_NAVIFRAME_ITEM_CHECK(it) \
|
|
|
|
ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, ); \
|
|
|
|
ELM_NAVIFRAME_CHECK(it->base.widget);
|
|
|
|
|
|
|
|
#define ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, ...) \
|
|
|
|
ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
|
|
|
|
ELM_NAVIFRAME_CHECK(it->base.widget) __VA_ARGS__;
|
|
|
|
|
|
|
|
/* Inheriting from elm_layout. Besides, we need no more than what is
|
|
|
|
* there */
|
|
|
|
EVAS_SMART_SUBCLASS_NEW
|
|
|
|
(NAVIFRAME_SMART_NAME, _elm_naviframe, Elm_Layout_Smart_Class,
|
|
|
|
Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_content_del_cb(void *data,
|
|
|
|
Evas *e __UNUSED__,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
void *event_info __UNUSED__)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *it = data;
|
|
|
|
|
|
|
|
it->content = NULL;
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_title_prev_btn_del_cb(void *data,
|
|
|
|
Evas *e __UNUSED__,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
void *event_info __UNUSED__)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it = data;
|
|
|
|
|
|
|
|
it->title_prev_btn = NULL;
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_title_next_btn_del_cb(void *data,
|
|
|
|
Evas *e __UNUSED__,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
void *event_info __UNUSED__)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it = data;
|
|
|
|
|
|
|
|
it->title_next_btn = NULL;
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_title_icon_del_cb(void *data,
|
|
|
|
Evas *e __UNUSED__,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
void *event_info __UNUSED__)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it = data;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
it->title_icon = NULL;
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_free(Elm_Naviframe_Item *it)
|
|
|
|
{
|
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
eina_stringshare_del(it->style);
|
2012-07-25 10:38:48 -07:00
|
|
|
eina_stringshare_del(it->title_label);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
if (it->title_prev_btn)
|
|
|
|
evas_object_del(it->title_prev_btn);
|
|
|
|
if (it->title_next_btn)
|
|
|
|
evas_object_del(it->title_next_btn);
|
|
|
|
if (it->title_icon) evas_object_del(it->title_icon);
|
|
|
|
|
|
|
|
if (sd->preserve && it->content)
|
2011-10-23 23:35:48 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
/* so that elm does not delete the contents with the item's
|
|
|
|
* view after the del_pre_hook */
|
|
|
|
edje_object_part_unswallow(VIEW(it), it->content);
|
|
|
|
evas_object_event_callback_del
|
|
|
|
(it->content, EVAS_CALLBACK_DEL, _item_content_del_cb);
|
2011-10-23 23:35:48 -07:00
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
else if (it->content)
|
|
|
|
evas_object_del(it->content);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_content_signals_emit(Elm_Naviframe_Item *it)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
//content
|
|
|
|
if (it->content)
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
|
2011-10-14 22:16:53 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
//prev button
|
|
|
|
if (it->title_prev_btn)
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
|
2011-10-14 22:16:53 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
//next button
|
|
|
|
if (it->title_next_btn)
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
|
2011-10-14 22:16:53 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (it->title_icon)
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
|
|
|
|
if ((it->title_label) && (it->title_label[0]))
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: we need to handle the case when this function is called
|
|
|
|
* during a transition */
|
|
|
|
static void
|
|
|
|
_item_style_set(Elm_Naviframe_Item *it,
|
|
|
|
const char *item_style)
|
|
|
|
{
|
|
|
|
char buf[256];
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
|
|
|
|
|
|
|
|
if (!item_style)
|
2012-02-26 21:37:57 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
strcpy(buf, "item/basic");
|
|
|
|
eina_stringshare_replace(&it->style, "basic");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
snprintf(buf, sizeof(buf), "item/%s", item_style);
|
|
|
|
eina_stringshare_replace(&it->style, item_style);
|
2012-02-26 21:37:57 -08:00
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
elm_widget_theme_object_set
|
|
|
|
(WIDGET(it), VIEW(it), "naviframe", buf, elm_widget_style_get(WIDGET(it)));
|
|
|
|
|
|
|
|
_item_content_signals_emit(it);
|
|
|
|
|
|
|
|
if (sd->freeze_events)
|
|
|
|
evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static void
|
|
|
|
_item_title_visible_update(Elm_Naviframe_Item *nit)
|
2011-09-15 18:05:15 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
if (nit->title_visible)
|
|
|
|
edje_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
|
2011-09-15 18:05:15 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_elm_naviframe_smart_theme(Evas_Object *obj)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (!ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->theme(obj))
|
|
|
|
return EINA_FALSE;
|
|
|
|
|
|
|
|
EINA_INLIST_FOREACH (sd->stack, it)
|
|
|
|
{
|
|
|
|
_item_style_set(it, it->style);
|
|
|
|
_item_title_visible_update(it);
|
|
|
|
}
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2011-08-04 09:37:36 -07:00
|
|
|
static void
|
2011-09-15 18:09:48 -07:00
|
|
|
_item_text_set_hook(Elm_Object_Item *it,
|
|
|
|
const char *part,
|
|
|
|
const char *label)
|
2011-08-04 09:37:36 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
2011-09-13 23:23:08 -07:00
|
|
|
char buf[1024];
|
2011-08-04 09:37:36 -07:00
|
|
|
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
if ((!part) || (!strcmp(part, "default")) ||
|
|
|
|
(!strcmp(part, "elm.text.title")))
|
2012-07-25 10:38:48 -07:00
|
|
|
{
|
|
|
|
eina_stringshare_replace(&nit->title_label, label);
|
|
|
|
snprintf(buf, sizeof(buf), "elm.text.title");
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
|
|
|
|
if ((label) && (label[0]))
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,title_label,show",
|
|
|
|
"elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,title_label,hide",
|
|
|
|
"elm");
|
2012-07-31 04:12:00 -07:00
|
|
|
|
|
|
|
//XXX: ACCESS
|
|
|
|
if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
|
|
|
|
{
|
|
|
|
nit->title = _elm_access_edje_object_part_object_register
|
|
|
|
(WIDGET(nit), VIEW(nit), buf);
|
|
|
|
_elm_access_text_set(_elm_access_object_get(nit->title),
|
|
|
|
ELM_ACCESS_TYPE, E_("title"));
|
|
|
|
}
|
2012-07-25 10:38:48 -07:00
|
|
|
}
|
2012-03-29 04:09:45 -07:00
|
|
|
else if (!strcmp("subtitle", part))
|
2012-07-31 04:12:00 -07:00
|
|
|
{
|
|
|
|
snprintf(buf, sizeof(buf), "elm.text.subtitle");
|
|
|
|
|
|
|
|
//XXX: ACCESS
|
|
|
|
if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
|
|
|
|
{
|
|
|
|
nit->subtitle = _elm_access_edje_object_part_object_register
|
|
|
|
(WIDGET(nit), VIEW(nit), buf);
|
|
|
|
_elm_access_text_set(_elm_access_object_get(nit->subtitle),
|
|
|
|
ELM_ACCESS_TYPE, E_("sub title"));
|
|
|
|
}
|
|
|
|
}
|
2011-09-14 05:37:17 -07:00
|
|
|
else
|
|
|
|
snprintf(buf, sizeof(buf), "%s", part);
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
edje_object_part_text_set(VIEW(nit), buf, label);
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_layout_sizing_eval(WIDGET(nit));
|
2011-08-04 09:37:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static const char *
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_text_get_hook(const Elm_Object_Item *it,
|
|
|
|
const char *part)
|
2011-08-04 09:37:36 -07:00
|
|
|
{
|
2011-09-14 05:37:17 -07:00
|
|
|
char buf[1024];
|
2011-08-04 09:37:36 -07:00
|
|
|
|
2011-11-16 04:51:53 -08:00
|
|
|
if (!part || !strcmp(part, "default"))
|
2011-09-14 05:37:17 -07:00
|
|
|
snprintf(buf, sizeof(buf), "elm.text.title");
|
2012-03-29 04:09:45 -07:00
|
|
|
else if (!strcmp("subtitle", part))
|
2011-11-16 04:51:53 -08:00
|
|
|
snprintf(buf, sizeof(buf), "elm.text.subtitle");
|
2011-09-14 05:37:17 -07:00
|
|
|
else
|
|
|
|
snprintf(buf, sizeof(buf), "%s", part);
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
return edje_object_part_text_get(VIEW(it), buf);
|
2011-08-04 09:37:36 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_item_del_pre_hook(Elm_Object_Item *it)
|
2011-08-04 09:37:36 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit, *prev_it = NULL;
|
|
|
|
Eina_Bool top;
|
2011-08-04 09:37:36 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
nit = (Elm_Naviframe_Item *)it;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
|
|
|
|
|
|
|
|
top = (it == elm_naviframe_top_item_get(WIDGET(nit)));
|
|
|
|
if (evas_object_data_get(VIEW(nit), "out_of_list"))
|
|
|
|
goto end;
|
|
|
|
|
|
|
|
if (nit->content && !sd->on_deletion)
|
2011-11-16 04:51:53 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
nit->content_unfocusable =
|
|
|
|
elm_widget_tree_unfocusable_get(nit->content);
|
|
|
|
elm_widget_tree_unfocusable_set(nit->content, EINA_TRUE);
|
2011-11-16 04:51:53 -08:00
|
|
|
}
|
2011-08-04 09:52:39 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->stack->last->prev)
|
|
|
|
prev_it = EINA_INLIST_CONTAINER_GET
|
|
|
|
(sd->stack->last->prev, Elm_Naviframe_Item);
|
2011-08-04 09:37:36 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
|
|
|
|
if (!sd->stack) elm_widget_resize_object_set(WIDGET(it), sd->dummy_edje);
|
2011-08-04 09:37:36 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (top && !sd->on_deletion) /* must raise another one */
|
|
|
|
{
|
|
|
|
if (!prev_it) goto end;
|
2011-09-13 23:49:23 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->freeze_events)
|
|
|
|
{
|
|
|
|
evas_object_freeze_events_set(VIEW(prev_it), EINA_FALSE);
|
|
|
|
}
|
2011-08-04 09:37:36 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_show(VIEW(prev_it));
|
|
|
|
evas_object_raise(VIEW(prev_it));
|
2011-09-13 23:49:23 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
edje_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
|
|
|
|
edje_object_message_signal_process(VIEW(prev_it));
|
|
|
|
}
|
2011-09-13 23:49:23 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
end:
|
2011-08-04 09:37:36 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_free(nit);
|
2011-09-15 19:20:02 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
return EINA_TRUE;
|
2011-10-14 22:16:53 -07:00
|
|
|
}
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_content_set(Elm_Naviframe_Item *it,
|
|
|
|
Evas_Object *content)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
if (it->content == content) return;
|
2011-11-21 08:14:52 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (it->content) evas_object_del(it->content);
|
|
|
|
it->content = content;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!content) return;
|
2012-01-10 22:42:15 -08:00
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
edje_object_part_swallow(VIEW(it), CONTENT_PART, content);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_title_prev_btn_set(Elm_Naviframe_Item *it,
|
|
|
|
Evas_Object *btn)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
if (it->title_prev_btn == btn) return;
|
|
|
|
if (it->title_prev_btn) evas_object_del(it->title_prev_btn);
|
|
|
|
it->title_prev_btn = btn;
|
|
|
|
if (!btn) return;
|
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
edje_object_part_swallow(VIEW(it), PREV_BTN_PART, btn);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_title_next_btn_set(Elm_Naviframe_Item *it,
|
|
|
|
Evas_Object *btn)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
if (it->title_next_btn == btn) return;
|
|
|
|
if (it->title_next_btn) evas_object_del(it->title_next_btn);
|
|
|
|
it->title_next_btn = btn;
|
|
|
|
if (!btn) return;
|
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
edje_object_part_swallow(VIEW(it), NEXT_BTN_PART, btn);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_title_icon_set(Elm_Naviframe_Item *it,
|
|
|
|
Evas_Object *icon)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
if (it->title_icon == icon) return;
|
|
|
|
if (it->title_icon) evas_object_del(it->title_icon);
|
|
|
|
it->title_icon = icon;
|
|
|
|
if (!icon) return;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
edje_object_part_swallow(VIEW(it), ICON_PART, icon);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Object *
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_content_unset(Elm_Naviframe_Item *it)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Evas_Object *content = it->content;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!content) return NULL;
|
2012-02-16 21:00:22 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
edje_object_part_unswallow(VIEW(it), it->content);
|
2012-02-16 21:00:22 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_event_callback_del
|
|
|
|
(content, EVAS_CALLBACK_DEL, _item_content_del_cb);
|
2012-02-16 21:00:22 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
it->content = NULL;
|
|
|
|
return content;
|
2012-02-16 21:00:22 -08:00
|
|
|
}
|
|
|
|
|
2012-02-16 13:14:32 -08:00
|
|
|
static Evas_Object *
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_title_prev_btn_unset(Elm_Naviframe_Item *it)
|
2012-02-16 13:14:32 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Evas_Object *content = it->title_prev_btn;
|
2012-02-16 13:14:32 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!content) return NULL;
|
|
|
|
|
|
|
|
edje_object_part_unswallow(VIEW(it), it->title_prev_btn);
|
|
|
|
|
|
|
|
evas_object_event_callback_del
|
|
|
|
(content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
it->title_prev_btn = NULL;
|
2012-06-01 14:56:09 -07:00
|
|
|
return content;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static Evas_Object *
|
|
|
|
_item_title_next_btn_unset(Elm_Naviframe_Item *it)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Evas_Object *content = it->title_next_btn;
|
|
|
|
|
|
|
|
if (!content) return NULL;
|
|
|
|
|
|
|
|
edje_object_part_unswallow(VIEW(it), it->title_next_btn);
|
|
|
|
|
|
|
|
evas_object_event_callback_del
|
|
|
|
(content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
it->title_next_btn = NULL;
|
2012-06-01 14:56:09 -07:00
|
|
|
return content;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static Evas_Object *
|
|
|
|
_item_title_icon_unset(Elm_Naviframe_Item *it)
|
2011-11-16 04:51:53 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Evas_Object *content = it->title_icon;
|
|
|
|
|
|
|
|
if (!content) return NULL;
|
|
|
|
|
|
|
|
edje_object_part_unswallow(VIEW(it), it->title_icon);
|
|
|
|
|
|
|
|
evas_object_event_callback_del
|
|
|
|
(content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
|
|
|
|
|
2011-11-28 00:28:34 -08:00
|
|
|
it->title_icon = NULL;
|
2012-06-01 14:56:09 -07:00
|
|
|
return content;
|
2011-11-16 04:51:53 -08:00
|
|
|
}
|
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
/* since we have each item as layout, we can't reusing the layout's
|
|
|
|
* aliasing, so let's do it ourselves */
|
|
|
|
static void
|
|
|
|
_part_aliasing_eval(const char **part)
|
|
|
|
{
|
|
|
|
if (!*part || !strcmp("default", *part))
|
|
|
|
*part = CONTENT_PART;
|
|
|
|
else if (!strcmp(*part, "prev_btn"))
|
|
|
|
*part = PREV_BTN_PART;
|
|
|
|
else if (!strcmp(*part, "next_btn"))
|
|
|
|
*part = NEXT_BTN_PART;
|
|
|
|
else if (!strcmp(*part, "icon"))
|
|
|
|
*part = ICON_PART;
|
|
|
|
}
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_content_set_hook(Elm_Object_Item *it,
|
|
|
|
const char *part,
|
|
|
|
Evas_Object *content)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
_part_aliasing_eval(&part);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
//specified parts
|
2012-07-25 07:39:03 -07:00
|
|
|
if (!part || !strcmp(CONTENT_PART, part))
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_content_set(nit, content);
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, PREV_BTN_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_title_prev_btn_set(nit, content);
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, NEXT_BTN_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_title_next_btn_set(nit, content);
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, ICON_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_title_icon_set(nit, content);
|
|
|
|
else
|
|
|
|
edje_object_part_swallow(VIEW(it), part, content);
|
|
|
|
|
|
|
|
_item_content_signals_emit(nit);
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(WIDGET(it));
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static Evas_Object *
|
|
|
|
_item_content_get_hook(const Elm_Object_Item *it,
|
|
|
|
const char *part)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
_part_aliasing_eval(&part);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
//specified parts
|
2012-07-25 07:39:03 -07:00
|
|
|
if (!part || !strcmp(CONTENT_PART, part))
|
2012-06-01 14:56:09 -07:00
|
|
|
return nit->content;
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, PREV_BTN_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
return nit->title_prev_btn;
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, NEXT_BTN_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
return nit->title_next_btn;
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, ICON_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
return nit->title_icon;
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
//common parts
|
|
|
|
return edje_object_part_swallow_get(VIEW(nit), part);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Object *
|
|
|
|
_item_content_unset_hook(Elm_Object_Item *it,
|
|
|
|
const char *part)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
|
|
|
Evas_Object *o = NULL;
|
|
|
|
|
2012-07-25 07:39:03 -07:00
|
|
|
_part_aliasing_eval(&part);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
//specified parts
|
2012-07-25 07:39:03 -07:00
|
|
|
if (!part || !strcmp(CONTENT_PART, part))
|
2012-06-01 14:56:09 -07:00
|
|
|
o = _item_content_unset(nit);
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, PREV_BTN_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
o = _item_title_prev_btn_unset(nit);
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, NEXT_BTN_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
o = _item_title_next_btn_unset(nit);
|
2012-07-25 07:39:03 -07:00
|
|
|
else if (!strcmp(part, ICON_PART))
|
2012-06-01 14:56:09 -07:00
|
|
|
o = _item_title_icon_unset(nit);
|
2011-12-16 01:07:41 -08:00
|
|
|
else
|
2011-09-13 23:23:08 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
o = edje_object_part_swallow_get(VIEW(it), part);
|
|
|
|
if (o) edje_object_part_unswallow(VIEW(it), o);
|
2011-12-19 03:13:06 -08:00
|
|
|
}
|
2011-12-01 03:41:47 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_content_signals_emit(nit);
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(WIDGET(it));
|
|
|
|
|
|
|
|
return o;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_signal_emit_hook(Elm_Object_Item *it,
|
|
|
|
const char *emission,
|
|
|
|
const char *source)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(VIEW(it), emission, source);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_elm_naviframe_smart_sizing_eval(Evas_Object *obj)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Evas_Coord minw = -1, minh = -1;
|
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
Evas_Coord x, y, w, h;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_geometry_get(obj, &x, &y, &w, &h);
|
|
|
|
|
|
|
|
EINA_INLIST_FOREACH (sd->stack, it)
|
|
|
|
{
|
|
|
|
evas_object_move(VIEW(it), x, y);
|
|
|
|
evas_object_resize(VIEW(it), w, h);
|
|
|
|
edje_object_size_min_calc(VIEW(it), &it->minw, &it->minh);
|
|
|
|
if (it->minw > minw) minw = it->minw;
|
|
|
|
if (it->minh > minh) minh = it->minh;
|
|
|
|
}
|
2011-08-04 09:52:39 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_size_hint_min_set(obj, minw, minh);
|
|
|
|
evas_object_size_hint_max_set(obj, -1, -1);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_item_pop_idler(void *data)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_naviframe_item_pop(data);
|
2011-08-04 09:52:39 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2011-11-16 04:51:53 -08:00
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_on_item_back_btn_clicked(void *data,
|
|
|
|
Evas_Object *obj,
|
|
|
|
void *event_info __UNUSED__)
|
2011-11-16 04:51:53 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
/* Since edje has the event queue, clicked event could be happend
|
|
|
|
multiple times on some heavy environment. This callback del will
|
|
|
|
prevent those scenario and guarantee only one clicked for it's own
|
|
|
|
page. */
|
|
|
|
evas_object_smart_callback_del(obj, "clicked", _on_item_back_btn_clicked);
|
2011-11-16 04:51:53 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ecore_idler_add(_item_pop_idler, data);
|
2011-11-16 04:51:53 -08:00
|
|
|
}
|
|
|
|
|
2011-11-28 00:28:34 -08:00
|
|
|
static Evas_Object *
|
2012-07-25 10:38:48 -07:00
|
|
|
_back_btn_new(Evas_Object *obj, const char *title_label)
|
2011-11-28 00:28:34 -08:00
|
|
|
{
|
2012-07-26 12:39:10 -07:00
|
|
|
Evas_Object *btn, *ed;
|
2012-06-01 14:56:09 -07:00
|
|
|
char buf[1024];
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
btn = elm_button_add(obj);
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!btn) return NULL;
|
|
|
|
evas_object_smart_callback_add
|
|
|
|
(btn, "clicked", _on_item_back_btn_clicked, obj);
|
|
|
|
snprintf
|
|
|
|
(buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
|
|
|
|
elm_object_style_set(btn, buf);
|
2012-07-25 10:38:48 -07:00
|
|
|
if (title_label)
|
|
|
|
elm_layout_text_set(btn, NULL, title_label);
|
|
|
|
else
|
|
|
|
elm_object_domain_translatable_text_set(btn, PACKAGE, N_("Back"));
|
2012-07-25 10:20:34 -07:00
|
|
|
|
2012-07-26 12:39:10 -07:00
|
|
|
/* HACK NOTE: this explicit check only exists to avoid an ERR()
|
|
|
|
* message from elm_layout_content_set().
|
|
|
|
*
|
|
|
|
* The button was ALWAYS supposed to support an elm.swallow.content, but
|
|
|
|
* default naviframe/back_btn/default theme did not provide such, then
|
|
|
|
* old themes would emit such error message.
|
|
|
|
*
|
|
|
|
* Once we can break the theme API, remove this check and always
|
|
|
|
* set an icon.
|
|
|
|
*/
|
|
|
|
ed = elm_layout_edje_get(btn);
|
|
|
|
if (edje_object_part_exists(ed, "elm.swallow.content"))
|
|
|
|
{
|
|
|
|
Evas_Object *ico = elm_icon_add(btn);
|
|
|
|
elm_icon_standard_set(ico, "arrow_left");
|
|
|
|
elm_layout_content_set(btn, "elm.swallow.content", ico);
|
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
return btn;
|
2011-11-28 00:28:34 -08:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_signal(Evas_Object *obj,
|
|
|
|
const char *emission,
|
|
|
|
const char *source)
|
2011-11-28 00:28:34 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!sd->stack) return;
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
_elm_naviframe_parent_sc->signal(obj, emission, source);
|
2011-11-28 00:28:34 -08:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
/* content/text smart functions proxying things to the top item, which
|
|
|
|
* is the resize object of the layout */
|
|
|
|
static Eina_Bool
|
|
|
|
_elm_naviframe_smart_text_set(Evas_Object *obj,
|
|
|
|
const char *part,
|
|
|
|
const char *label)
|
2011-11-28 00:28:34 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Object_Item *it;
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
it = elm_naviframe_top_item_get(obj);
|
|
|
|
if (!it) return EINA_FALSE;
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_object_item_part_text_set(it, part, label);
|
|
|
|
|
|
|
|
return !strcmp(elm_object_item_part_text_get(it, part), label);
|
2011-11-28 00:28:34 -08:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static const char *
|
|
|
|
_elm_naviframe_smart_text_get(const Evas_Object *obj,
|
|
|
|
const char *part)
|
2011-11-28 00:28:34 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!it) return NULL;
|
2011-12-11 20:54:15 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
return elm_object_item_part_text_get(it, part);
|
2011-11-28 00:28:34 -08:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
/* we have to keep a "manual" set here because of the callbacks on the
|
|
|
|
* children */
|
|
|
|
static Eina_Bool
|
|
|
|
_elm_naviframe_smart_content_set(Evas_Object *obj,
|
|
|
|
const char *part,
|
|
|
|
Evas_Object *content)
|
2011-11-28 00:28:34 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Object_Item *it;
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
it = elm_naviframe_top_item_get(obj);
|
|
|
|
if (!it) return EINA_FALSE;
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_object_item_part_content_set(it, part, content);
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
return content == elm_object_item_part_content_get(it, part);
|
2011-11-28 00:28:34 -08:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static Evas_Object *
|
|
|
|
_elm_naviframe_smart_content_get(const Evas_Object *obj,
|
|
|
|
const char *part)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!it) return NULL;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
return elm_object_item_part_content_get(it, part);
|
|
|
|
}
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static Evas_Object *
|
|
|
|
_elm_naviframe_smart_content_unset(Evas_Object *obj,
|
|
|
|
const char *part)
|
|
|
|
{
|
|
|
|
Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!it) return NULL;
|
2012-03-12 19:22:57 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
return elm_object_item_part_content_unset(it, part);
|
elementary/menu, ctxpopup, index, segment_control, diskselector, multibuttonentry, toolbar, naviframe, slideshow, hoversel, filpselector - deprecated xxxx_item_del() APIs.
But instead, made to use the elm_object_item_del() APIs
for this, elm_widget_item needed to provide elm_widget_item_del_pre_hook.
SVN revision: 67010
2012-01-09 21:02:11 -08:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static void
|
|
|
|
_on_item_title_clicked(void *data,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
const char *emission __UNUSED__,
|
|
|
|
const char *source __UNUSED__)
|
elementary/menu, ctxpopup, index, segment_control, diskselector, multibuttonentry, toolbar, naviframe, slideshow, hoversel, filpselector - deprecated xxxx_item_del() APIs.
But instead, made to use the elm_object_item_del() APIs
for this, elm_widget_item needed to provide elm_widget_item_del_pre_hook.
SVN revision: 67010
2012-01-09 21:02:11 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *it = data;
|
2012-01-27 03:56:14 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_smart_callback_call(WIDGET(it), SIG_TITLE_CLICKED, it);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
/* "elm,state,cur,pushed"
|
|
|
|
*/
|
2011-07-12 21:21:50 -07:00
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_on_item_push_finished(void *data,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
const char *emission __UNUSED__,
|
|
|
|
const char *source __UNUSED__)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it = data;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
if (!it) return;
|
2011-10-28 01:31:42 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
|
2011-10-28 01:31:42 -07:00
|
|
|
|
2011-10-20 18:08:01 -07:00
|
|
|
evas_object_hide(VIEW(it));
|
2012-03-26 22:48:41 -07:00
|
|
|
|
|
|
|
if (it->content)
|
|
|
|
elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->freeze_events)
|
2011-10-28 01:31:42 -07:00
|
|
|
evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
/* "elm,state,cur,popped"
|
|
|
|
*/
|
2011-07-12 21:21:50 -07:00
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_on_item_pop_finished(void *data,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
const char *emission __UNUSED__,
|
|
|
|
const char *source __UNUSED__)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2011-10-18 09:12:14 -07:00
|
|
|
Elm_Naviframe_Item *it = data;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2011-10-18 09:12:14 -07:00
|
|
|
if (!it) return;
|
2012-03-26 22:48:41 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
|
2012-03-26 22:48:41 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->preserve && it->content)
|
2012-03-26 22:48:41 -07:00
|
|
|
elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_widget_item_del(data);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
/* "elm,state,new,pushed",
|
|
|
|
* "elm,state,prev,popped
|
|
|
|
*/
|
2011-07-12 21:21:50 -07:00
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_on_item_show_finished(void *data,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
const char *emission __UNUSED__,
|
|
|
|
const char *source __UNUSED__)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *it = data;
|
2012-03-14 22:37:17 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
|
|
|
|
edje_object_message_signal_process(VIEW(it));
|
2011-11-21 08:14:52 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
|
2012-01-11 03:25:04 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_smart_callback_call(WIDGET(it), SIG_TRANSITION_FINISHED, data);
|
2012-01-11 03:25:04 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->freeze_events)
|
|
|
|
evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
|
2011-08-04 09:37:36 -07:00
|
|
|
}
|
|
|
|
|
2011-10-19 01:49:24 -07:00
|
|
|
static void
|
2012-06-01 14:56:09 -07:00
|
|
|
_on_item_size_hints_changed(void *data,
|
|
|
|
Evas *e __UNUSED__,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
void *event_info __UNUSED__)
|
2011-10-19 01:49:24 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_layout_sizing_eval(data);
|
2011-10-19 01:49:24 -07:00
|
|
|
}
|
|
|
|
|
2011-11-03 00:15:18 -07:00
|
|
|
static Elm_Naviframe_Item *
|
|
|
|
_item_new(Evas_Object *obj,
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
const Elm_Naviframe_Item *prev_it,
|
2011-11-03 00:15:18 -07:00
|
|
|
const char *title_label,
|
|
|
|
Evas_Object *prev_btn,
|
|
|
|
Evas_Object *next_btn,
|
|
|
|
Evas_Object *content,
|
|
|
|
const char *item_style)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
it = elm_widget_item_new(obj, Elm_Naviframe_Item);
|
2011-07-12 21:21:50 -07:00
|
|
|
if (!it)
|
|
|
|
{
|
|
|
|
ERR("Failed to allocate new item! : naviframe=%p", obj);
|
|
|
|
return NULL;
|
|
|
|
}
|
2011-08-04 09:37:36 -07:00
|
|
|
|
elementary/menu, ctxpopup, index, segment_control, diskselector, multibuttonentry, toolbar, naviframe, slideshow, hoversel, filpselector - deprecated xxxx_item_del() APIs.
But instead, made to use the elm_object_item_del() APIs
for this, elm_widget_item needed to provide elm_widget_item_del_pre_hook.
SVN revision: 67010
2012-01-09 21:02:11 -08:00
|
|
|
elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
|
2011-09-15 18:09:48 -07:00
|
|
|
elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
|
|
|
|
elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
|
|
|
|
elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
|
|
|
|
elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
|
|
|
|
elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
|
2011-09-15 19:20:02 -07:00
|
|
|
elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
|
2011-08-04 09:37:36 -07:00
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
//item base layout
|
2012-06-01 14:56:09 -07:00
|
|
|
VIEW(it) = edje_object_add(evas_object_evas_get(obj));
|
2012-03-28 03:04:55 -07:00
|
|
|
evas_object_smart_member_add(VIEW(it), obj);
|
2012-01-11 03:25:04 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_event_callback_add
|
|
|
|
(VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
|
|
|
|
_on_item_size_hints_changed, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(VIEW(it), "elm,action,show,finished", "", _on_item_show_finished, it);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(VIEW(it), "elm,action,pushed,finished", "", _on_item_push_finished, it);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(VIEW(it), "elm,action,popped,finished", "", _on_item_pop_finished, it);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(VIEW(it), "elm,action,title,clicked", "", _on_item_title_clicked, it);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2011-10-19 01:49:24 -07:00
|
|
|
_item_style_set(it, item_style);
|
2012-03-06 03:51:42 -08:00
|
|
|
_item_text_set_hook((Elm_Object_Item *)it, "elm.text.title", title_label);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2011-07-25 01:48:47 -07:00
|
|
|
//title buttons
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
if ((!prev_btn) && sd->auto_pushed && prev_it)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
const char *prev_title = prev_it->title_label;
|
2012-07-25 10:38:48 -07:00
|
|
|
prev_btn = _back_btn_new(obj, prev_title);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
if (prev_btn)
|
|
|
|
_item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
|
|
|
|
|
|
|
|
if (next_btn)
|
|
|
|
_item_content_set_hook((Elm_Object_Item *)it, NEXT_BTN_PART, next_btn);
|
|
|
|
|
2011-08-04 09:37:36 -07:00
|
|
|
_item_content_set(it, content);
|
2011-11-03 00:15:18 -07:00
|
|
|
it->title_visible = EINA_TRUE;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2011-11-03 00:15:18 -07:00
|
|
|
return it;
|
|
|
|
}
|
|
|
|
|
2012-01-11 03:48:45 -08:00
|
|
|
static Eina_Bool
|
2012-06-01 14:56:09 -07:00
|
|
|
_elm_naviframe_smart_focus_next(const Evas_Object *obj,
|
|
|
|
Elm_Focus_Direction dir,
|
|
|
|
Evas_Object **next)
|
2012-01-11 03:48:45 -08:00
|
|
|
{
|
2012-03-12 02:14:14 -07:00
|
|
|
Eina_Bool ret;
|
|
|
|
Eina_List *l = NULL;
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *top_it;
|
2012-03-12 02:14:14 -07:00
|
|
|
void *(*list_data_get)(const Eina_List *list);
|
|
|
|
|
|
|
|
top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
|
|
|
|
if (!top_it) return EINA_FALSE;
|
|
|
|
|
2012-07-31 04:12:00 -07:00
|
|
|
if (!top_it->title_visible)
|
|
|
|
{
|
|
|
|
return elm_widget_focus_next_get(top_it->content, dir, next);
|
|
|
|
}
|
|
|
|
|
2012-03-12 02:14:14 -07:00
|
|
|
list_data_get = eina_list_data_get;
|
|
|
|
|
|
|
|
//Forcus order: prev button, next button, contents
|
2012-07-31 04:12:00 -07:00
|
|
|
//XXX: ACCESS
|
|
|
|
if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
|
|
|
|
{
|
|
|
|
if (top_it->title) l = eina_list_append(l, top_it->title);
|
|
|
|
if (top_it->subtitle) l = eina_list_append(l, top_it->subtitle);
|
|
|
|
}
|
|
|
|
|
2012-03-12 02:14:14 -07:00
|
|
|
if (top_it->title_prev_btn)
|
|
|
|
l = eina_list_append(l, top_it->title_prev_btn);
|
|
|
|
if (top_it->title_next_btn)
|
|
|
|
l = eina_list_append(l, top_it->title_next_btn);
|
2012-07-31 04:12:00 -07:00
|
|
|
if (top_it->content)
|
|
|
|
l = eina_list_append(l, top_it->content);
|
2012-03-12 02:14:14 -07:00
|
|
|
l = eina_list_append(l, VIEW(top_it));
|
|
|
|
|
|
|
|
ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
|
|
|
|
eina_list_free(l);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-03-12 02:14:14 -07:00
|
|
|
return ret;
|
2012-01-11 03:48:45 -08:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_add(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
EVAS_SMART_DATA_ALLOC(obj, Elm_Naviframe_Smart_Data);
|
|
|
|
|
|
|
|
priv->dummy_edje = ELM_WIDGET_DATA(priv)->resize_obj =
|
|
|
|
edje_object_add(evas_object_evas_get(obj));
|
|
|
|
|
|
|
|
ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->base.add(obj);
|
|
|
|
|
|
|
|
priv->auto_pushed = EINA_TRUE;
|
|
|
|
priv->freeze_events = EINA_TRUE;
|
|
|
|
|
|
|
|
elm_widget_can_focus_set(obj, EINA_FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_del(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
sd->on_deletion = EINA_TRUE;
|
|
|
|
|
|
|
|
while (sd->stack)
|
|
|
|
{
|
|
|
|
it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item);
|
|
|
|
elm_widget_item_del(it);
|
|
|
|
}
|
|
|
|
|
|
|
|
sd->on_deletion = EINA_FALSE;
|
|
|
|
|
|
|
|
evas_object_del(sd->dummy_edje);
|
|
|
|
|
|
|
|
ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->base.del(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_set_user(Elm_Layout_Smart_Class *sc)
|
|
|
|
{
|
|
|
|
ELM_WIDGET_CLASS(sc)->base.add = _elm_naviframe_smart_add;
|
|
|
|
ELM_WIDGET_CLASS(sc)->base.del = _elm_naviframe_smart_del;
|
|
|
|
|
|
|
|
ELM_WIDGET_CLASS(sc)->theme = _elm_naviframe_smart_theme;
|
|
|
|
ELM_WIDGET_CLASS(sc)->focus_next = _elm_naviframe_smart_focus_next;
|
|
|
|
|
|
|
|
ELM_CONTAINER_CLASS(sc)->content_set = _elm_naviframe_smart_content_set;
|
|
|
|
ELM_CONTAINER_CLASS(sc)->content_get = _elm_naviframe_smart_content_get;
|
|
|
|
ELM_CONTAINER_CLASS(sc)->content_unset = _elm_naviframe_smart_content_unset;
|
|
|
|
|
|
|
|
ELM_LAYOUT_CLASS(sc)->signal = _elm_naviframe_smart_signal;
|
|
|
|
ELM_LAYOUT_CLASS(sc)->text_set = _elm_naviframe_smart_text_set;
|
|
|
|
ELM_LAYOUT_CLASS(sc)->text_get = _elm_naviframe_smart_text_get;
|
|
|
|
ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_naviframe_smart_sizing_eval;
|
|
|
|
}
|
|
|
|
|
2011-11-03 00:15:18 -07:00
|
|
|
EAPI Evas_Object *
|
|
|
|
elm_naviframe_add(Evas_Object *parent)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Evas_Object *obj;
|
2011-11-03 00:15:18 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
|
2011-11-03 00:15:18 -07:00
|
|
|
|
2012-07-18 14:03:39 -07:00
|
|
|
obj = elm_widget_add(_elm_naviframe_smart_class_new(), parent);
|
|
|
|
if (!obj) return NULL;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
if (!elm_widget_sub_object_add(parent, obj))
|
|
|
|
ERR("could not add %p as sub object of %p", obj, parent);
|
2011-11-03 00:15:18 -07:00
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Elm_Object_Item *
|
|
|
|
elm_naviframe_item_push(Evas_Object *obj,
|
|
|
|
const char *title_label,
|
|
|
|
Evas_Object *prev_btn,
|
|
|
|
Evas_Object *next_btn,
|
|
|
|
Evas_Object *content,
|
|
|
|
const char *item_style)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *prev_it, *it;
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
2011-11-03 00:15:18 -07:00
|
|
|
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
prev_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
|
|
|
|
it = _item_new(obj, prev_it,
|
|
|
|
title_label, prev_btn, next_btn, content, item_style);
|
2011-11-03 00:15:18 -07:00
|
|
|
if (!it) return NULL;
|
|
|
|
|
2011-10-20 18:08:01 -07:00
|
|
|
evas_object_show(VIEW(it));
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_widget_resize_object_set(obj, VIEW(it));
|
2011-07-12 21:21:50 -07:00
|
|
|
|
|
|
|
if (prev_it)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
/* re-add as smart member */
|
|
|
|
evas_object_smart_member_add(VIEW(prev_it), obj);
|
|
|
|
|
|
|
|
if (sd->freeze_events)
|
2011-10-28 01:31:42 -07:00
|
|
|
{
|
|
|
|
evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
|
|
|
|
evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
|
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
edje_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
|
|
|
|
|
|
|
|
/* animate previous */
|
|
|
|
edje_object_message_signal_process(VIEW(prev_it));
|
2012-03-26 22:48:41 -07:00
|
|
|
if (prev_it->content)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
prev_it->content_unfocusable =
|
|
|
|
elm_widget_tree_unfocusable_get(prev_it->content);
|
2012-03-26 22:48:41 -07:00
|
|
|
elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
|
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
/* animate new one */
|
|
|
|
edje_object_message_signal_process(VIEW(it));
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it));
|
|
|
|
evas_object_raise(VIEW(it));
|
|
|
|
|
2012-07-31 04:12:00 -07:00
|
|
|
//XXX: ACCESS
|
|
|
|
if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
|
|
|
|
elm_object_focus_set(it->title, EINA_TRUE);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
|
2012-03-06 03:51:42 -08:00
|
|
|
return (Elm_Object_Item *)it;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2011-11-03 00:15:18 -07:00
|
|
|
EAPI Elm_Object_Item *
|
2012-03-07 08:52:22 -08:00
|
|
|
elm_naviframe_item_insert_before(Evas_Object *obj,
|
|
|
|
Elm_Object_Item *before,
|
2011-11-03 00:15:18 -07:00
|
|
|
const char *title_label,
|
|
|
|
Evas_Object *prev_btn,
|
|
|
|
Evas_Object *next_btn,
|
|
|
|
Evas_Object *content,
|
|
|
|
const char *item_style)
|
|
|
|
{
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
Elm_Naviframe_Item *it, *prev_it;
|
2011-11-03 00:15:18 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(before, NULL);
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
2011-11-03 00:15:18 -07:00
|
|
|
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
prev_it = NULL;
|
|
|
|
if (before)
|
|
|
|
{
|
|
|
|
it = (Elm_Naviframe_Item *)before;
|
|
|
|
prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
|
|
|
|
Elm_Naviframe_Item);
|
|
|
|
}
|
|
|
|
|
|
|
|
it = _item_new(obj, prev_it,
|
|
|
|
title_label, prev_btn, next_btn, content, item_style);
|
2011-11-03 00:15:18 -07:00
|
|
|
if (!it) return NULL;
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
sd->stack = eina_inlist_prepend_relative
|
|
|
|
(sd->stack, EINA_INLIST_GET(it),
|
|
|
|
EINA_INLIST_GET(((Elm_Naviframe_Item *)before)));
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
|
2012-03-06 03:51:42 -08:00
|
|
|
return (Elm_Object_Item *)it;
|
2011-11-03 00:15:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Elm_Object_Item *
|
2012-03-07 08:52:22 -08:00
|
|
|
elm_naviframe_item_insert_after(Evas_Object *obj,
|
|
|
|
Elm_Object_Item *after,
|
2011-11-03 00:15:18 -07:00
|
|
|
const char *title_label,
|
|
|
|
Evas_Object *prev_btn,
|
|
|
|
Evas_Object *next_btn,
|
|
|
|
Evas_Object *content,
|
|
|
|
const char *item_style)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(after, NULL);
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
2011-11-03 00:15:18 -07:00
|
|
|
|
naviframe improvements:
- fixed theme to look less like an arse:
- overlap theme is translucent
- naviframe title visibility toggle is now animated
- item pop/push animation now applies to title area as well
- icon without title label is now centered (see Naviframe 2 test)
- title label and subtitle are now centered among the free space, should not overlap buttons anymore.
- title will use a font-size range, trying to not overlap buttons anymore.
- title will use ellipsis, trying to not overlap buttons anymore.
- prev/next buttons do not have a fixed min/max size anymore
- emit signals elm,state,title_label,show and elm,state,title_label,hide
- by default the previous button label is the title of the previous page
however by using a regular elm_button with an icon and long label
exposes a bug with button theme. And there is a conceptual issue: if
the previous button label is too big, it will look horrible. We should
have a maximum size that, if reached, should have ellipsis. This
should be a different elm_button style, with
elm/button/base/naviframe/back_btn/default being an alias to it.
SVN revision: 74403
2012-07-25 14:08:53 -07:00
|
|
|
it = _item_new(obj, (Elm_Naviframe_Item *)after,
|
|
|
|
title_label, prev_btn, next_btn, content, item_style);
|
2011-11-03 00:15:18 -07:00
|
|
|
if (!it) return NULL;
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
/* let's share that whole logic, if it goes to the top */
|
|
|
|
if (elm_naviframe_top_item_get(obj) == after)
|
|
|
|
return elm_naviframe_item_push
|
|
|
|
(obj, title_label, prev_btn, next_btn, content, item_style);
|
2012-03-26 23:06:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
sd->stack = eina_inlist_append_relative
|
|
|
|
(sd->stack, EINA_INLIST_GET(it),
|
|
|
|
EINA_INLIST_GET(((Elm_Naviframe_Item *)after)));
|
2012-03-26 23:06:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_layout_sizing_eval(obj);
|
2012-03-26 23:06:50 -07:00
|
|
|
|
2012-03-06 03:51:42 -08:00
|
|
|
return (Elm_Object_Item *)it;
|
2011-11-03 00:15:18 -07:00
|
|
|
}
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
EAPI Evas_Object *
|
|
|
|
elm_naviframe_item_pop(Evas_Object *obj)
|
|
|
|
{
|
2012-06-06 07:40:34 -07:00
|
|
|
Elm_Naviframe_Item *it, *prev_it = NULL;
|
2011-07-12 21:21:50 -07:00
|
|
|
Evas_Object *content = NULL;
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
|
2011-07-12 21:21:50 -07:00
|
|
|
if (!it) return NULL;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
if (sd->preserve)
|
2011-07-12 21:21:50 -07:00
|
|
|
content = it->content;
|
2012-03-26 22:48:41 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
|
|
|
|
|
2012-03-26 22:48:41 -07:00
|
|
|
if (it->content)
|
|
|
|
{
|
|
|
|
it->content_unfocusable = elm_widget_tree_unfocusable_get(it->content);
|
|
|
|
elm_widget_tree_unfocusable_set(it->content, EINA_TRUE);
|
|
|
|
}
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->stack->last->prev)
|
|
|
|
prev_it = EINA_INLIST_CONTAINER_GET
|
|
|
|
(sd->stack->last->prev, Elm_Naviframe_Item);
|
|
|
|
|
|
|
|
sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(it));
|
|
|
|
if (!sd->stack) elm_widget_resize_object_set(obj, sd->dummy_edje);
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
if (prev_it)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->freeze_events)
|
2011-10-28 01:31:42 -07:00
|
|
|
{
|
|
|
|
evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
|
|
|
|
evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
|
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
elm_widget_resize_object_set(obj, VIEW(it));
|
|
|
|
evas_object_raise(VIEW(prev_it));
|
|
|
|
|
2012-07-31 04:12:00 -07:00
|
|
|
//XXX: ACCESS
|
|
|
|
if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
|
|
|
|
elm_object_focus_set(prev_it->title, EINA_TRUE);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
/* these 2 signals MUST take place simultaneously */
|
|
|
|
edje_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
|
2011-10-20 18:08:01 -07:00
|
|
|
evas_object_show(VIEW(prev_it));
|
2012-06-01 14:56:09 -07:00
|
|
|
edje_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
|
|
|
|
|
|
|
|
edje_object_message_signal_process(VIEW(it));
|
|
|
|
edje_object_message_signal_process(VIEW(prev_it));
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
else
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_widget_item_del(it);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
|
|
|
return content;
|
|
|
|
}
|
|
|
|
|
2011-09-18 22:23:35 -07:00
|
|
|
EAPI void
|
|
|
|
elm_naviframe_item_pop_to(Elm_Object_Item *it)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit;
|
2011-10-12 23:30:05 -07:00
|
|
|
Eina_Inlist *l, *prev_l;
|
2011-09-18 22:23:35 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
|
2011-10-28 01:31:42 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
nit = (Elm_Naviframe_Item *)it;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
|
2011-09-18 22:23:35 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (it == elm_naviframe_top_item_get(WIDGET(nit))) return;
|
|
|
|
|
|
|
|
l = sd->stack->last->prev;
|
|
|
|
|
|
|
|
sd->on_deletion = EINA_TRUE;
|
2011-09-18 22:23:35 -07:00
|
|
|
|
2012-03-29 04:09:45 -07:00
|
|
|
while (l)
|
2011-09-18 22:23:35 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *iit = EINA_INLIST_CONTAINER_GET
|
|
|
|
(l, Elm_Naviframe_Item);
|
|
|
|
|
|
|
|
if (iit == nit) break;
|
|
|
|
|
2011-09-18 22:23:35 -07:00
|
|
|
prev_l = l->prev;
|
2012-06-01 14:56:09 -07:00
|
|
|
sd->stack = eina_inlist_remove(sd->stack, l);
|
|
|
|
|
|
|
|
elm_widget_item_del(iit);
|
|
|
|
|
2011-09-18 22:23:35 -07:00
|
|
|
l = prev_l;
|
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
sd->on_deletion = EINA_FALSE;
|
|
|
|
|
|
|
|
elm_naviframe_item_pop(WIDGET(nit));
|
2011-09-18 22:23:35 -07:00
|
|
|
}
|
|
|
|
|
2011-10-23 23:35:48 -07:00
|
|
|
EAPI void
|
|
|
|
elm_naviframe_item_promote(Elm_Object_Item *it)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit;
|
2011-10-28 01:31:42 -07:00
|
|
|
Elm_Naviframe_Item *prev_it;
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
|
|
|
|
|
|
|
|
nit = (Elm_Naviframe_Item *)it;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
|
|
|
|
|
|
|
|
if (it == elm_naviframe_top_item_get(nit->base.widget)) return;
|
|
|
|
|
|
|
|
/* remember, last is 1st on the naviframe, push it to last pos. */
|
|
|
|
sd->stack = eina_inlist_demote(sd->stack, EINA_INLIST_GET(nit));
|
|
|
|
|
|
|
|
elm_widget_resize_object_set(WIDGET(it), VIEW(nit));
|
|
|
|
|
|
|
|
/* this was the previous top one */
|
|
|
|
prev_it = EINA_INLIST_CONTAINER_GET
|
|
|
|
(sd->stack->last->prev, Elm_Naviframe_Item);
|
|
|
|
|
|
|
|
/* re-add as smart member */
|
|
|
|
evas_object_smart_member_add(VIEW(prev_it), WIDGET(it));
|
2011-10-28 01:31:42 -07:00
|
|
|
|
2012-03-26 22:48:41 -07:00
|
|
|
if (prev_it->content)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
prev_it->content_unfocusable =
|
|
|
|
elm_widget_tree_unfocusable_get(prev_it->content);
|
2012-03-26 22:48:41 -07:00
|
|
|
elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
|
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->freeze_events)
|
2011-10-28 01:31:42 -07:00
|
|
|
{
|
|
|
|
evas_object_freeze_events_set(VIEW(it), EINA_TRUE);
|
|
|
|
evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
|
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
edje_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
|
|
|
|
|
|
|
|
evas_object_show(VIEW(nit));
|
|
|
|
evas_object_raise(VIEW(nit));
|
|
|
|
|
|
|
|
edje_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
|
|
|
|
|
|
|
|
edje_object_message_signal_process(VIEW(prev_it));
|
|
|
|
edje_object_message_signal_process(VIEW(nit));
|
2011-10-23 23:35:48 -07:00
|
|
|
}
|
|
|
|
|
2012-02-16 01:26:30 -08:00
|
|
|
EAPI void
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_naviframe_item_simple_promote(Evas_Object *obj,
|
|
|
|
Evas_Object *content)
|
2012-02-16 01:26:30 -08:00
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *itr;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
ELM_NAVIFRAME_CHECK(obj);
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
EINA_INLIST_FOREACH (sd->stack, itr)
|
2012-02-16 01:26:30 -08:00
|
|
|
{
|
2012-03-06 03:51:42 -08:00
|
|
|
if (elm_object_item_content_get((Elm_Object_Item *)itr) == content)
|
2012-02-16 01:26:30 -08:00
|
|
|
{
|
2012-03-06 03:51:42 -08:00
|
|
|
elm_naviframe_item_promote((Elm_Object_Item *)itr);
|
2012-02-16 01:26:30 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
EAPI void
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_naviframe_content_preserve_on_pop_set(Evas_Object *obj,
|
|
|
|
Eina_Bool preserve)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj);
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
sd->preserve = !!preserve;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
elm_naviframe_content_preserve_on_pop_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
return sd->preserve;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
EAPI Elm_Object_Item *
|
2011-07-12 21:21:50 -07:00
|
|
|
elm_naviframe_top_item_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (!sd->stack) return NULL;
|
|
|
|
return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
|
|
|
|
(sd->stack->last, Elm_Naviframe_Item));
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
EAPI Elm_Object_Item *
|
2011-07-12 21:21:50 -07:00
|
|
|
elm_naviframe_bottom_item_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (!sd->stack) return NULL;
|
|
|
|
return (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
|
|
|
|
(sd->stack, Elm_Naviframe_Item));
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_naviframe_item_style_set(Elm_Object_Item *it,
|
|
|
|
const char *item_style)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
if (item_style && !strcmp(item_style, nit->style)) return;
|
2011-10-03 23:50:18 -07:00
|
|
|
|
2012-03-07 08:15:17 -08:00
|
|
|
if (!item_style)
|
2012-06-01 14:56:09 -07:00
|
|
|
if (!strcmp("basic", nit->style)) return;
|
2011-10-03 23:50:18 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_style_set(nit, item_style);
|
|
|
|
_item_title_visible_update(nit);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI const char *
|
2011-08-04 01:17:30 -07:00
|
|
|
elm_naviframe_item_style_get(const Elm_Object_Item *it)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, NULL);
|
|
|
|
|
|
|
|
return nit->style;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_naviframe_item_title_visible_set(Elm_Object_Item *it,
|
|
|
|
Eina_Bool visible)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
|
2011-07-12 21:21:50 -07:00
|
|
|
|
|
|
|
visible = !!visible;
|
2012-06-01 14:56:09 -07:00
|
|
|
if (nit->title_visible == visible) return;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
nit->title_visible = visible;
|
|
|
|
_item_title_visible_update(nit);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
2011-08-04 01:17:30 -07:00
|
|
|
elm_naviframe_item_title_visible_get(const Elm_Object_Item *it)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
|
|
|
|
|
|
|
|
return nit->title_visible;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2011-10-12 03:31:13 -07:00
|
|
|
EAPI void
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj,
|
|
|
|
Eina_Bool auto_pushed)
|
2011-10-12 03:31:13 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj);
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
sd->auto_pushed = !!auto_pushed;
|
2011-10-12 03:31:13 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
elm_naviframe_prev_btn_auto_pushed_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
return sd->auto_pushed;
|
2011-10-12 03:31:13 -07:00
|
|
|
}
|
|
|
|
|
2012-02-15 08:27:34 -08:00
|
|
|
EAPI Eina_List *
|
2011-11-03 00:15:18 -07:00
|
|
|
elm_naviframe_items_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-02-15 08:27:34 -08:00
|
|
|
Eina_List *ret = NULL;
|
|
|
|
Elm_Naviframe_Item *itr;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
EINA_INLIST_FOREACH (sd->stack, itr)
|
2012-02-24 08:11:18 -08:00
|
|
|
ret = eina_list_append(ret, itr);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-02-15 08:27:34 -08:00
|
|
|
return ret;
|
2011-11-03 00:15:18 -07:00
|
|
|
}
|
|
|
|
|
2011-12-11 20:54:15 -08:00
|
|
|
EAPI void
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_naviframe_event_enabled_set(Evas_Object *obj,
|
|
|
|
Eina_Bool enabled)
|
2011-12-11 20:54:15 -08:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj);
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
2011-12-11 20:54:15 -08:00
|
|
|
enabled = !!enabled;
|
2012-06-01 14:56:09 -07:00
|
|
|
if (sd->freeze_events == !enabled) return;
|
|
|
|
sd->freeze_events = !enabled;
|
2011-12-11 20:54:15 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
elm_naviframe_event_enabled_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) EINA_FALSE;
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
return !sd->freeze_events;
|
2011-12-11 20:54:15 -08:00
|
|
|
}
|