2013-04-25 22:13:00 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "elementary_config.h"
|
|
|
|
#endif
|
|
|
|
|
2011-07-12 21:21:50 -07:00
|
|
|
#include <Elementary.h>
|
|
|
|
#include "elm_priv.h"
|
2012-07-31 15:06:26 -07:00
|
|
|
#include "elm_widget_naviframe.h"
|
2012-11-25 22:32:53 -08:00
|
|
|
#include "elm_widget_container.h"
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
EAPI Eo_Op ELM_OBJ_NAVIFRAME_BASE_ID = EO_NOOP;
|
|
|
|
|
|
|
|
#define MY_CLASS ELM_OBJ_NAVIFRAME_CLASS
|
|
|
|
|
|
|
|
#define MY_CLASS_NAME "elm_naviframe"
|
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";
|
2013-01-04 20:24:22 -08:00
|
|
|
static const char TITLE_PART[] = "elm.text.title";
|
|
|
|
static const char SUBTITLE_PART[] = "elm.text.subtitle";
|
2013-01-15 22:34:49 -08:00
|
|
|
static const char TITLE_ACCESS_PART[] = "access.title";
|
2012-07-25 07:39:03 -07:00
|
|
|
|
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
|
|
|
};
|
|
|
|
|
2013-03-07 04:28:03 -08:00
|
|
|
static const char SIG_CLICKED[] = "clicked";
|
|
|
|
|
2013-03-08 04:15:29 -08:00
|
|
|
static void _on_item_back_btn_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__);
|
|
|
|
|
2013-06-05 00:31:49 -07:00
|
|
|
static void
|
|
|
|
_prev_page_focus_recover(Elm_Naviframe_Item *it)
|
|
|
|
{
|
|
|
|
Evas_Object *newest;
|
|
|
|
unsigned int order;
|
|
|
|
|
|
|
|
newest = elm_widget_newest_focus_order_get(VIEW(it), &order, EINA_TRUE);
|
|
|
|
if (newest)
|
|
|
|
elm_object_focus_set(newest, EINA_TRUE);
|
|
|
|
else
|
|
|
|
elm_object_focus_set(VIEW(it), EINA_TRUE);
|
|
|
|
}
|
|
|
|
|
2013-04-23 04:30:15 -07:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_translate(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
|
|
|
|
EINA_INLIST_FOREACH(sd->stack, it)
|
|
|
|
elm_widget_item_translate(it);
|
|
|
|
|
|
|
|
if (ret) *ret = EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
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;
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
2012-11-22 07:15:26 -08:00
|
|
|
static void
|
|
|
|
_title_content_del(void *data,
|
|
|
|
Evas *e __UNUSED__,
|
|
|
|
Evas_Object *obj __UNUSED__,
|
|
|
|
void *event_info __UNUSED__)
|
|
|
|
{
|
|
|
|
char buf[1024];
|
|
|
|
Elm_Naviframe_Content_Item_Pair *pair = data;
|
|
|
|
Elm_Naviframe_Item *it = pair->it;
|
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), buf, "elm");
|
2012-11-22 07:15:26 -08:00
|
|
|
it->content_list = eina_inlist_remove(it->content_list,
|
|
|
|
EINA_INLIST_GET(pair));
|
|
|
|
eina_stringshare_del(pair->part);
|
|
|
|
free(pair);
|
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static void
|
|
|
|
_item_free(Elm_Naviframe_Item *it)
|
|
|
|
{
|
2012-11-22 07:15:26 -08:00
|
|
|
Eina_Inlist *l;
|
|
|
|
Elm_Naviframe_Content_Item_Pair *content_pair;
|
2012-11-24 04:43:31 -08:00
|
|
|
Elm_Naviframe_Text_Item_Pair *text_pair;
|
2012-11-22 07:15:26 -08: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
|
|
|
eina_stringshare_del(it->style);
|
2012-07-25 10:38:48 -07:00
|
|
|
eina_stringshare_del(it->title_label);
|
2012-08-30 08:43:14 -07:00
|
|
|
eina_stringshare_del(it->subtitle_label);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-22 07:15:26 -08:00
|
|
|
EINA_INLIST_FOREACH_SAFE(it->content_list, l, content_pair)
|
|
|
|
{
|
2012-12-03 02:10:17 -08:00
|
|
|
if (content_pair->content)
|
2012-11-22 07:15:26 -08:00
|
|
|
{
|
2012-12-03 02:10:17 -08:00
|
|
|
evas_object_event_callback_del(content_pair->content,
|
2012-11-22 07:15:26 -08:00
|
|
|
EVAS_CALLBACK_DEL,
|
|
|
|
_title_content_del);
|
2012-12-03 02:10:17 -08:00
|
|
|
evas_object_del(content_pair->content);
|
2012-11-22 07:15:26 -08:00
|
|
|
}
|
|
|
|
eina_stringshare_del(content_pair->part);
|
|
|
|
free(content_pair);
|
|
|
|
}
|
2012-11-24 04:43:31 -08:00
|
|
|
EINA_INLIST_FOREACH_SAFE(it->text_list, l, text_pair)
|
|
|
|
{
|
|
|
|
eina_stringshare_del(text_pair->part);
|
|
|
|
free(text_pair);
|
|
|
|
}
|
2012-11-22 07:15:26 -08:00
|
|
|
|
2012-11-22 06:47:08 -08:00
|
|
|
if (it->content)
|
2011-10-23 23:35:48 -07:00
|
|
|
{
|
2012-11-22 06:47:08 -08:00
|
|
|
if ((sd->preserve) && (!sd->on_deletion))
|
|
|
|
{
|
|
|
|
/* so that elm does not delete the contents with the item's
|
|
|
|
* view after the del_pre_hook */
|
2013-02-16 06:16:50 -08:00
|
|
|
elm_object_part_content_unset(VIEW(it), CONTENT_PART);
|
2012-11-22 06:47:08 -08:00
|
|
|
evas_object_event_callback_del
|
|
|
|
(it->content, EVAS_CALLBACK_DEL, _item_content_del_cb);
|
|
|
|
}
|
2011-10-23 23:35:48 -07:00
|
|
|
}
|
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-08-28 17:34:13 -07:00
|
|
|
Elm_Naviframe_Content_Item_Pair *content_pair;
|
|
|
|
char buf[1024];
|
2012-06-01 14:56:09 -07:00
|
|
|
//content
|
|
|
|
if (it->content)
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_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)
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_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)
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_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)
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_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
|
|
|
|
2012-08-28 17:34:13 -07:00
|
|
|
EINA_INLIST_FOREACH(it->content_list, content_pair)
|
|
|
|
{
|
2012-12-03 02:10:17 -08:00
|
|
|
if (content_pair->content)
|
2012-11-30 05:27:56 -08:00
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,show", content_pair->part);
|
2012-08-28 17:34:13 -07:00
|
|
|
else
|
2012-11-30 05:27:56 -08:00
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,hide", content_pair->part);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), buf, "elm");
|
2012-08-28 17:34:13 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_text_signals_emit(Elm_Naviframe_Item *it)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Text_Item_Pair *text_pair;
|
|
|
|
char buf[1024];
|
|
|
|
|
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]))
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "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
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
|
2012-08-28 17:34:13 -07:00
|
|
|
|
|
|
|
if ((it->subtitle_label) && (it->subtitle_label[0]))
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
|
2012-08-28 17:34:13 -07:00
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
|
2012-08-28 17:34:13 -07:00
|
|
|
|
|
|
|
EINA_INLIST_FOREACH(it->text_list, text_pair)
|
|
|
|
{
|
2013-01-03 03:26:57 -08:00
|
|
|
if (elm_object_part_text_get(VIEW(it), text_pair->part))
|
2012-11-30 05:27:56 -08:00
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,show", text_pair->part);
|
2012-08-28 17:34:13 -07:00
|
|
|
else
|
2012-11-30 05:27:56 -08:00
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,hide", text_pair->part);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), buf, "elm");
|
2012-08-28 17:34:13 -07:00
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
2012-11-21 05:41:03 -08:00
|
|
|
static Evas_Object *
|
|
|
|
_access_object_get(Elm_Naviframe_Item *it, const char* part)
|
|
|
|
{
|
|
|
|
Evas_Object *po, *ao;
|
|
|
|
|
2013-01-11 22:41:21 -08:00
|
|
|
po = (Evas_Object *)edje_object_part_object_get
|
|
|
|
(elm_layout_edje_get(VIEW(it)), part);
|
2012-11-21 05:41:03 -08:00
|
|
|
ao = evas_object_data_get(po, "_part_access_obj");
|
|
|
|
|
|
|
|
return ao;
|
|
|
|
}
|
|
|
|
|
2012-12-04 20:01:55 -08:00
|
|
|
static void
|
|
|
|
_item_signals_emit(Elm_Naviframe_Item *it)
|
|
|
|
{
|
|
|
|
_item_text_signals_emit(it);
|
|
|
|
_item_content_signals_emit(it);
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
2013-03-01 18:04:31 -08:00
|
|
|
if (!elm_layout_theme_set(VIEW(it), "naviframe", buf,
|
|
|
|
elm_widget_style_get(WIDGET(it))))
|
|
|
|
CRITICAL("Failed to set layout!");
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
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)
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
|
2011-09-15 18:05:15 -07:00
|
|
|
}
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
2013-02-16 03:11:25 -08:00
|
|
|
_elm_naviframe_smart_theme(Eo *obj, void *_pd, va_list *list)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
2012-06-01 14:56:09 -07:00
|
|
|
Elm_Naviframe_Item *it;
|
2013-02-16 03:11:25 -08:00
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
2013-02-16 04:08:42 -08:00
|
|
|
const char *style, *sstyle;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2013-02-16 04:08:42 -08:00
|
|
|
eo_do(obj, elm_wdg_style_get(&style));
|
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_INLIST_FOREACH(sd->stack, it)
|
2012-06-01 14:56:09 -07:00
|
|
|
{
|
2013-02-16 04:08:42 -08:00
|
|
|
eo_do(VIEW(it), elm_wdg_style_get(&sstyle));
|
|
|
|
if ((style && sstyle) && strcmp(style, sstyle))
|
|
|
|
_item_style_set(it, it->style);
|
2012-12-04 20:01:55 -08:00
|
|
|
_item_signals_emit(it);
|
2012-06-01 14:56:09 -07:00
|
|
|
_item_title_visible_update(it);
|
|
|
|
}
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
2012-12-03 18:18:12 -08:00
|
|
|
if (ret) *ret = EINA_TRUE;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
2013-01-11 22:41:21 -08:00
|
|
|
static char *
|
|
|
|
_access_info_cb(void *data, Evas_Object *obj __UNUSED__)
|
|
|
|
{
|
|
|
|
Evas_Object *layout;
|
|
|
|
Eina_Strbuf *buf;
|
|
|
|
const char *info;
|
|
|
|
char *ret;
|
|
|
|
|
|
|
|
layout = (Evas_Object *)data;
|
|
|
|
info = elm_object_part_text_get(layout, TITLE_PART);
|
|
|
|
if (!info) return NULL;
|
|
|
|
|
|
|
|
buf = eina_strbuf_new();
|
|
|
|
eina_strbuf_append(buf, info);
|
|
|
|
|
|
|
|
info = elm_object_part_text_get(layout, SUBTITLE_PART);
|
|
|
|
if (!info) goto end;
|
|
|
|
|
|
|
|
eina_strbuf_append_printf(buf, ", %s", info);
|
|
|
|
|
|
|
|
end:
|
|
|
|
ret = eina_strbuf_string_steal(buf);
|
|
|
|
eina_strbuf_free(buf);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-11-21 05:41:03 -08:00
|
|
|
static void
|
|
|
|
_access_obj_process(Elm_Naviframe_Item *it, Eina_Bool is_access)
|
|
|
|
{
|
2013-01-11 22:41:21 -08:00
|
|
|
Evas_Object *ao, *eo;
|
2012-11-21 05:41:03 -08:00
|
|
|
|
|
|
|
if (is_access)
|
|
|
|
{
|
2013-01-11 22:41:21 -08:00
|
|
|
if (!_access_object_get(it, TITLE_ACCESS_PART))
|
2012-11-21 05:41:03 -08:00
|
|
|
{
|
2013-01-11 22:41:21 -08:00
|
|
|
eo = elm_layout_edje_get(VIEW(it));
|
|
|
|
ao =_elm_access_edje_object_part_object_register(WIDGET(it), eo,
|
|
|
|
TITLE_ACCESS_PART);
|
2012-11-21 05:41:03 -08:00
|
|
|
_elm_access_text_set(_elm_access_object_get(ao),
|
2013-01-11 22:41:21 -08:00
|
|
|
ELM_ACCESS_TYPE, E_("Title"));
|
|
|
|
_elm_access_callback_set(_elm_access_object_get(ao),
|
|
|
|
ELM_ACCESS_INFO, _access_info_cb, VIEW(it));
|
2013-01-31 03:35:26 -08:00
|
|
|
/* to access title access object, any idea? */
|
|
|
|
((Elm_Widget_Item *)it)->access_obj = ao;
|
2012-11-21 05:41:03 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (it->title_label)
|
|
|
|
_elm_access_edje_object_part_object_unregister
|
2013-01-11 22:41:21 -08:00
|
|
|
(WIDGET(it), elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
|
2013-01-31 03:35:26 -08:00
|
|
|
/* to access title access object, any idea? */
|
|
|
|
ao = ((Elm_Widget_Item *)it)->access_obj;
|
|
|
|
if (!ao) return;
|
|
|
|
evas_object_del(ao);
|
2012-11-21 05:41:03 -08: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;
|
2012-08-28 17:34:13 -07:00
|
|
|
Elm_Naviframe_Text_Item_Pair *pair = NULL;
|
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")) ||
|
2013-01-04 20:24:22 -08:00
|
|
|
(!strcmp(part, TITLE_PART)))
|
2012-07-25 10:38:48 -07:00
|
|
|
{
|
|
|
|
eina_stringshare_replace(&nit->title_label, label);
|
2012-11-30 05:16:11 -08:00
|
|
|
if (label)
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
|
2012-11-30 05:16:11 -08:00
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
|
2013-01-04 20:24:22 -08:00
|
|
|
elm_object_part_text_set(VIEW(it), TITLE_PART, label);
|
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
|
|
|
{
|
2012-08-28 17:34:13 -07:00
|
|
|
eina_stringshare_replace(&nit->subtitle_label, label);
|
2012-11-30 05:16:11 -08:00
|
|
|
if (label)
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
|
2012-11-30 05:16:11 -08:00
|
|
|
else
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
|
2013-01-04 20:24:22 -08:00
|
|
|
elm_object_part_text_set(VIEW(it), SUBTITLE_PART, label);
|
2012-07-31 04:12:00 -07:00
|
|
|
}
|
2011-09-14 05:37:17 -07:00
|
|
|
else
|
2012-08-28 17:34:13 -07:00
|
|
|
{
|
|
|
|
EINA_INLIST_FOREACH(nit->text_list, pair)
|
2013-01-02 20:20:11 -08:00
|
|
|
if (!strcmp(part, pair->part)) break;
|
2012-08-28 17:34:13 -07:00
|
|
|
|
|
|
|
if (!pair)
|
|
|
|
{
|
|
|
|
pair = ELM_NEW(Elm_Naviframe_Text_Item_Pair);
|
|
|
|
if (!pair)
|
|
|
|
{
|
|
|
|
ERR("Failed to allocate new text part of the item! : naviframe=%p",
|
|
|
|
WIDGET(it));
|
|
|
|
return;
|
|
|
|
}
|
2013-01-02 20:20:11 -08:00
|
|
|
eina_stringshare_replace(&pair->part, part);
|
2012-08-28 17:34:13 -07:00
|
|
|
nit->text_list = eina_inlist_append(nit->text_list,
|
|
|
|
EINA_INLIST_GET(pair));
|
|
|
|
}
|
2013-01-06 06:15:52 -08:00
|
|
|
if (label)
|
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
|
|
|
|
else
|
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
|
|
|
|
elm_object_signal_emit(VIEW(it), buf, "elm");
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_part_text_set(VIEW(it), part, label);
|
2012-08-28 17:34:13 -07:00
|
|
|
}
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-11-21 05:41:03 -08:00
|
|
|
/* access */
|
|
|
|
if (_elm_config->access_mode)
|
|
|
|
_access_obj_process(nit, EINA_TRUE);
|
|
|
|
|
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"))
|
2013-01-04 20:24:22 -08:00
|
|
|
snprintf(buf, sizeof(buf), TITLE_PART);
|
2012-03-29 04:09:45 -07:00
|
|
|
else if (!strcmp("subtitle", part))
|
2013-01-04 20:24:22 -08:00
|
|
|
snprintf(buf, sizeof(buf), SUBTITLE_PART);
|
2011-09-14 05:37:17 -07:00
|
|
|
else
|
|
|
|
snprintf(buf, sizeof(buf), "%s", part);
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
return elm_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);
|
|
|
|
|
2012-11-30 04:17:04 -08:00
|
|
|
if (nit->animator) ecore_animator_del(nit->animator);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
top = (it == elm_naviframe_top_item_get(WIDGET(nit)));
|
|
|
|
if (evas_object_data_get(VIEW(nit), "out_of_list"))
|
|
|
|
goto end;
|
|
|
|
|
2013-06-05 00:31:49 -07:00
|
|
|
//FIXME: Really need?
|
2013-03-11 04:08:52 -07:00
|
|
|
if (!sd->on_deletion)
|
2011-11-16 04:51:53 -08:00
|
|
|
{
|
2013-03-11 00:38:45 -07:00
|
|
|
nit->unfocusable = elm_widget_tree_unfocusable_get(VIEW(nit));
|
|
|
|
elm_widget_tree_unfocusable_set(VIEW(nit), 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
|
|
|
sd->stack = eina_inlist_remove(sd->stack, EINA_INLIST_GET(nit));
|
2012-12-12 00:58:03 -08:00
|
|
|
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 */
|
|
|
|
{
|
2013-04-25 03:26:09 -07:00
|
|
|
if (sd->stack && sd->stack->last)
|
|
|
|
prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last,
|
|
|
|
Elm_Naviframe_Item);
|
2012-06-01 14:56:09 -07:00
|
|
|
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);
|
|
|
|
}
|
2012-12-13 19:29:21 -08:00
|
|
|
elm_widget_resize_object_set(WIDGET(prev_it), VIEW(prev_it));
|
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
|
|
|
|
2013-06-05 00:31:49 -07:00
|
|
|
_prev_page_focus_recover(prev_it);
|
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
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
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
|
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
|
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;
|
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
|
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_event_callback_add
|
|
|
|
(btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
|
2013-03-08 04:47:07 -08:00
|
|
|
|
|
|
|
//FIXME: set back button callback here after elm 2.0
|
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;
|
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
|
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
|
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
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_part_content_set(VIEW(it), ICON_PART, icon);
|
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
|
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
|
|
|
|
2013-02-16 06:16:50 -08:00
|
|
|
elm_object_part_content_unset(VIEW(it), CONTENT_PART);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
|
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;
|
|
|
|
|
2013-02-16 06:16:50 -08:00
|
|
|
elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
evas_object_event_callback_del
|
|
|
|
(content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
|
2013-03-08 04:13:25 -08:00
|
|
|
evas_object_smart_callback_del(content, SIG_CLICKED,
|
|
|
|
_on_item_back_btn_clicked);
|
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;
|
|
|
|
|
2013-02-16 06:16:50 -08:00
|
|
|
elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2013-02-16 06:16:50 -08:00
|
|
|
elm_object_part_content_unset(VIEW(it), ICON_PART);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2012-08-28 17:34:13 -07:00
|
|
|
static void
|
|
|
|
_title_content_set(Elm_Naviframe_Item *it,
|
|
|
|
const char *part,
|
|
|
|
Evas_Object *content)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Content_Item_Pair *pair = NULL;
|
|
|
|
char buf[1024];
|
|
|
|
|
|
|
|
EINA_INLIST_FOREACH(it->content_list, pair)
|
|
|
|
if (!strcmp(part, pair->part)) break;
|
|
|
|
if (pair)
|
|
|
|
{
|
2012-12-03 02:10:17 -08:00
|
|
|
if (pair->content == content) return;
|
|
|
|
if (pair->content)
|
2013-02-20 18:55:02 -08:00
|
|
|
evas_object_event_callback_del(pair->content,
|
|
|
|
EVAS_CALLBACK_DEL,
|
|
|
|
_title_content_del);
|
|
|
|
if (content) elm_object_part_content_set(VIEW(it), part, content);
|
2012-08-28 17:34:13 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!content) return;
|
2012-12-03 02:21:09 -08:00
|
|
|
|
|
|
|
//Remove the pair if new content was swallowed into other part.
|
|
|
|
EINA_INLIST_FOREACH(it->content_list, pair)
|
|
|
|
{
|
|
|
|
if (pair->content == content)
|
|
|
|
{
|
|
|
|
eina_stringshare_del(pair->part);
|
|
|
|
it->content_list = eina_inlist_remove(it->content_list,
|
|
|
|
EINA_INLIST_GET(pair));
|
|
|
|
evas_object_event_callback_del(pair->content,
|
|
|
|
EVAS_CALLBACK_DEL,
|
|
|
|
_title_content_del);
|
2012-12-13 06:17:29 -08:00
|
|
|
free(pair);
|
2012-12-03 02:21:09 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//New pair
|
2012-08-28 17:34:13 -07:00
|
|
|
pair = ELM_NEW(Elm_Naviframe_Content_Item_Pair);
|
|
|
|
if (!pair)
|
|
|
|
{
|
|
|
|
ERR("Failed to allocate new content part of the item! : naviframe=%p",
|
|
|
|
WIDGET(it));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
pair->it = it;
|
|
|
|
eina_stringshare_replace(&pair->part, part);
|
|
|
|
it->content_list = eina_inlist_append(it->content_list,
|
|
|
|
EINA_INLIST_GET(pair));
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_part_content_set(VIEW(it), part, content);
|
2012-11-30 05:16:11 -08:00
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), buf, "elm");
|
2012-11-30 05:16:11 -08:00
|
|
|
}
|
2012-12-03 20:16:48 -08:00
|
|
|
pair->content = content;
|
2012-12-03 02:10:17 -08:00
|
|
|
evas_object_event_callback_add(content,
|
|
|
|
EVAS_CALLBACK_DEL,
|
|
|
|
_title_content_del,
|
|
|
|
pair);
|
2012-08-28 17:34:13 -07:00
|
|
|
}
|
|
|
|
|
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
|
2012-08-28 17:34:13 -07:00
|
|
|
_title_content_set(nit, part, content);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
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
|
2013-01-03 03:26:57 -08:00
|
|
|
return elm_object_part_content_get(VIEW(nit), part);
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
2012-08-28 17:34:13 -07:00
|
|
|
static Evas_Object *
|
|
|
|
_title_content_unset(Elm_Naviframe_Item *it, const char *part)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Content_Item_Pair *pair = NULL;
|
|
|
|
char buf[1028];
|
|
|
|
Evas_Object *content = NULL;
|
|
|
|
|
|
|
|
EINA_INLIST_FOREACH(it->content_list, pair)
|
|
|
|
{
|
|
|
|
if (!strcmp(part, pair->part))
|
|
|
|
{
|
2012-12-03 02:10:17 -08:00
|
|
|
content = pair->content;
|
2012-08-28 17:34:13 -07:00
|
|
|
eina_stringshare_del(pair->part);
|
|
|
|
it->content_list = eina_inlist_remove(it->content_list,
|
|
|
|
EINA_INLIST_GET(pair));
|
|
|
|
free(pair);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!content) return NULL;
|
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_part_content_unset(VIEW(it), part);
|
2012-08-28 17:34:13 -07:00
|
|
|
snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), buf, "elm");
|
2012-08-28 17:34:13 -07:00
|
|
|
evas_object_event_callback_del(content,
|
|
|
|
EVAS_CALLBACK_DEL,
|
|
|
|
_title_content_del);
|
|
|
|
return content;
|
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
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
|
2012-08-28 17:34:13 -07:00
|
|
|
o = _title_content_unset(nit, part);
|
2011-12-01 03:41:47 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_layout_sizing_eval(WIDGET(it));
|
|
|
|
|
|
|
|
return o;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_signal_emit_hook(Elm_Object_Item *it,
|
|
|
|
const char *emission,
|
|
|
|
const char *source)
|
|
|
|
{
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), emission, source);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-11-25 22:32:53 -08:00
|
|
|
_elm_naviframe_smart_sizing_eval(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
|
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;
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-09-04 05:46:02 -07:00
|
|
|
evas_object_geometry_get(obj, &x, &y, &w, &h);
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_INLIST_FOREACH(sd->stack, it)
|
2012-06-01 14:56:09 -07:00
|
|
|
{
|
2012-09-05 00:42:57 -07:00
|
|
|
evas_object_move(VIEW(it), x, y);
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_resize(VIEW(it), w, h);
|
2013-01-03 03:26:57 -08:00
|
|
|
edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
|
|
|
|
&it->minw, &it->minh);
|
2012-06-01 14:56:09 -07:00
|
|
|
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
|
|
|
}
|
|
|
|
|
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. */
|
2013-03-07 04:28:03 -08:00
|
|
|
evas_object_smart_callback_del(obj, SIG_CLICKED, _on_item_back_btn_clicked);
|
2012-11-20 21:55:25 -08:00
|
|
|
elm_naviframe_item_pop(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
|
2013-03-07 04:28:03 -08:00
|
|
|
(btn, SIG_CLICKED, _on_item_back_btn_clicked, obj);
|
2012-06-01 14:56:09 -07:00
|
|
|
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);
|
2013-02-16 06:16:50 -08:00
|
|
|
if (edje_object_part_exists(ed, CONTENT_PART))
|
2012-07-26 12:39:10 -07:00
|
|
|
{
|
|
|
|
Evas_Object *ico = elm_icon_add(btn);
|
|
|
|
elm_icon_standard_set(ico, "arrow_left");
|
2013-02-16 06:16:50 -08:00
|
|
|
elm_layout_content_set(btn, CONTENT_PART, ico);
|
2012-07-26 12:39:10 -07:00
|
|
|
}
|
|
|
|
|
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
|
2012-11-25 22:32:53 -08:00
|
|
|
_elm_naviframe_smart_signal_emit(Eo *obj, void *_pd, va_list *list)
|
2011-11-28 00:28:34 -08:00
|
|
|
{
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
|
|
|
|
|
|
|
const char *emission = va_arg(*list, const char *);
|
|
|
|
const char *source = va_arg(*list, const char *);
|
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
|
|
|
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, elm_obj_layout_signal_emit(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 */
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_text_set(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
|
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-11-25 22:32:53 -08:00
|
|
|
const char *part = va_arg(*list, const char *);
|
|
|
|
const char *label = va_arg(*list, const char *);
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
if (ret) *ret = EINA_FALSE;
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
it = elm_naviframe_top_item_get(obj);
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!it) return;
|
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);
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool int_ret = !strcmp(elm_object_item_part_text_get(it, part), label);
|
|
|
|
if (ret) *ret = int_ret;
|
2011-11-28 00:28:34 -08:00
|
|
|
}
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_text_get(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
|
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);
|
2012-11-25 22:32:53 -08:00
|
|
|
const char *part = va_arg(*list, const char *);
|
|
|
|
const char **text = va_arg(*list, const char **);
|
|
|
|
*text = NULL;
|
2011-11-28 00:28:34 -08:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!it) return;
|
2011-12-11 20:54:15 -08:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
*text = 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 */
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_content_set(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
|
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-11-25 22:32:53 -08:00
|
|
|
const char *part = va_arg(*list, const char *);
|
|
|
|
Evas_Object *content = va_arg(*list, Evas_Object *);
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
if (ret) *ret = EINA_FALSE;
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
it = elm_naviframe_top_item_get(obj);
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!it) return;
|
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-11-25 22:32:53 -08:00
|
|
|
if(content == elm_object_item_part_content_get(it, part))
|
|
|
|
if (ret) *ret = EINA_TRUE;
|
2011-11-28 00:28:34 -08:00
|
|
|
}
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_content_get(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
|
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-11-25 22:32:53 -08:00
|
|
|
const char *part = va_arg(*list, const char *);
|
|
|
|
Evas_Object **content = va_arg(*list, Evas_Object **);
|
|
|
|
*content = NULL;
|
|
|
|
|
|
|
|
if (!it) return;
|
2011-07-12 21:21:50 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
*content = elm_object_item_part_content_get(it, part);
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_content_unset(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
|
2012-06-01 14:56:09 -07:00
|
|
|
{
|
|
|
|
Elm_Object_Item *it = elm_naviframe_top_item_get(obj);
|
2011-09-13 23:23:08 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
const char *part = va_arg(*list, const char *);
|
|
|
|
Evas_Object **content = va_arg(*list, Evas_Object **);
|
|
|
|
*content = NULL;
|
|
|
|
if (!it) return;
|
2012-03-12 19:22:57 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
*content = 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
|
|
|
|
2013-03-11 04:08:52 -07:00
|
|
|
elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
|
2012-03-26 22:48:41 -07:00
|
|
|
|
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
|
|
|
|
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
|
2012-03-26 22:48:41 -07:00
|
|
|
|
2013-03-11 04:08:52 -07:00
|
|
|
if (sd->preserve)
|
2013-03-11 00:38:45 -07:00
|
|
|
elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
|
2012-12-07 04:31:07 -08:00
|
|
|
sd->popping = eina_list_remove(sd->popping, it);
|
2012-03-26 22:48:41 -07:00
|
|
|
|
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
|
|
|
|
2013-02-16 06:33:16 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
|
|
|
|
|
2013-03-11 00:38:45 -07:00
|
|
|
elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
|
|
|
|
|
2013-06-05 00:31:49 -07:00
|
|
|
_prev_page_focus_recover(it);
|
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);
|
2012-12-17 06:05:13 -08:00
|
|
|
|
|
|
|
evas_object_smart_callback_call(WIDGET(it), SIG_TRANSITION_FINISHED, data);
|
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
|
|
|
}
|
|
|
|
|
2013-01-21 21:28:31 -08:00
|
|
|
static void
|
|
|
|
_item_dispmode_set(Elm_Naviframe_Item *it, Evas_Display_Mode dispmode)
|
|
|
|
{
|
|
|
|
if (it->dispmode == dispmode) return;
|
|
|
|
switch (dispmode)
|
|
|
|
{
|
|
|
|
case EVAS_DISPLAY_MODE_COMPRESS:
|
2013-04-04 23:56:35 -07:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,display,compress", "elm");
|
2013-01-21 21:28:31 -08:00
|
|
|
break;
|
|
|
|
default:
|
2013-04-04 23:56:35 -07:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,display,default", "elm");
|
2013-01-21 21:28:31 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
it->dispmode = dispmode;
|
|
|
|
}
|
|
|
|
|
2013-05-08 02:01:30 -07:00
|
|
|
static char *
|
|
|
|
_access_prev_btn_info_cb(void *data, Evas_Object *obj __UNUSED__)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it = (Elm_Naviframe_Item *)data;
|
2013-06-08 01:40:39 -07:00
|
|
|
return strdup(E_("Back"));
|
2013-05-08 02:01:30 -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
|
2013-01-03 03:26:57 -08:00
|
|
|
VIEW(it) = elm_layout_add(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);
|
2013-01-03 03:26:57 -08:00
|
|
|
|
|
|
|
elm_object_signal_callback_add
|
2012-06-01 14:56:09 -07:00
|
|
|
(VIEW(it), "elm,action,show,finished", "", _on_item_show_finished, it);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_callback_add
|
2012-06-01 14:56:09 -07:00
|
|
|
(VIEW(it), "elm,action,pushed,finished", "", _on_item_push_finished, it);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_callback_add
|
2012-06-01 14:56:09 -07:00
|
|
|
(VIEW(it), "elm,action,popped,finished", "", _on_item_pop_finished, it);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_callback_add
|
2012-06-01 14:56:09 -07:00
|
|
|
(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-11-21 05:41:03 -08:00
|
|
|
|
|
|
|
if (title_label)
|
2013-01-04 20:24:22 -08:00
|
|
|
_item_text_set_hook((Elm_Object_Item *)it, TITLE_PART, 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)
|
2013-01-17 01:03:23 -08:00
|
|
|
{
|
|
|
|
_item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
|
|
|
|
|
|
|
|
if (!elm_layout_text_get(prev_btn, NULL))
|
2013-05-08 02:01:30 -07:00
|
|
|
_elm_access_callback_set
|
|
|
|
(_elm_access_object_get(prev_btn), ELM_ACCESS_INFO,
|
|
|
|
_access_prev_btn_info_cb, it);
|
2013-01-17 01:03:23 -08: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 (next_btn)
|
2013-01-17 01:03:23 -08:00
|
|
|
{
|
|
|
|
_item_content_set_hook((Elm_Object_Item *)it, NEXT_BTN_PART, next_btn);
|
|
|
|
|
|
|
|
if (!elm_layout_text_get(next_btn, NULL))
|
|
|
|
_elm_access_text_set
|
|
|
|
(_elm_access_object_get(next_btn), ELM_ACCESS_INFO, E_("Next"));
|
|
|
|
}
|
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
|
|
|
|
2011-08-04 09:37:36 -07:00
|
|
|
_item_content_set(it, content);
|
2013-01-21 21:28:31 -08:00
|
|
|
_item_dispmode_set(it, sd->dispmode);
|
|
|
|
|
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-10-14 07:48:02 -07:00
|
|
|
static void
|
2012-10-15 16:44:39 -07:00
|
|
|
_on_obj_size_hints_changed(void *data __UNUSED__, Evas *e __UNUSED__,
|
|
|
|
Evas_Object *obj, void *event_info __UNUSED__)
|
2012-10-14 07:48:02 -07:00
|
|
|
{
|
2013-01-21 21:28:31 -08:00
|
|
|
Elm_Naviframe_Item *it;
|
2012-10-14 07:48:02 -07:00
|
|
|
Evas_Display_Mode dispmode;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
dispmode = evas_object_size_hint_display_mode_get(obj);
|
2013-01-21 20:46:28 -08:00
|
|
|
if (sd->dispmode == dispmode) return;
|
|
|
|
|
2012-10-14 07:48:02 -07:00
|
|
|
sd->dispmode = dispmode;
|
|
|
|
|
2013-01-21 21:28:31 -08:00
|
|
|
EINA_INLIST_FOREACH(sd->stack, it)
|
|
|
|
_item_dispmode_set(it, dispmode);
|
2012-10-14 07:48:02 -07:00
|
|
|
}
|
|
|
|
|
2013-01-21 21:28:31 -08:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_focus_next(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
|
2012-01-11 03:48:45 -08:00
|
|
|
{
|
2012-11-21 05:41:03 -08:00
|
|
|
Evas_Object *ao;
|
2012-11-25 22:32:53 -08:00
|
|
|
|
2012-03-12 02:14:14 -07:00
|
|
|
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);
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Focus_Direction dir = va_arg(*list, Elm_Focus_Direction);
|
|
|
|
Evas_Object **next = va_arg(*list, Evas_Object **);
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
if (ret) *ret = EINA_FALSE;
|
|
|
|
Eina_Bool int_ret;
|
|
|
|
|
2012-03-12 02:14:14 -07:00
|
|
|
top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!top_it) return;
|
2012-03-12 02:14:14 -07:00
|
|
|
|
|
|
|
list_data_get = eina_list_data_get;
|
|
|
|
|
2013-03-11 00:38:45 -07:00
|
|
|
l = eina_list_append(l, VIEW(top_it));
|
|
|
|
|
2012-11-21 05:41:03 -08:00
|
|
|
/* access */
|
|
|
|
if (_elm_config->access_mode)
|
2012-07-31 04:12:00 -07:00
|
|
|
{
|
2013-01-11 22:41:21 -08:00
|
|
|
ao = _access_object_get(top_it, TITLE_ACCESS_PART);
|
2012-11-21 05:41:03 -08:00
|
|
|
if (ao) l = eina_list_append(l, ao);
|
2012-07-31 04:12:00 -07:00
|
|
|
}
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
int_ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
|
|
|
|
if (ret) *ret = int_ret;
|
2012-03-12 02:14:14 -07:00
|
|
|
eina_list_free(l);
|
2012-01-11 03:48:45 -08:00
|
|
|
}
|
|
|
|
|
2013-03-11 01:03:21 -07:00
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
*ret = EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_focus_direction(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
|
|
|
|
{
|
|
|
|
Evas_Object *base = va_arg(*list, Evas_Object *);
|
|
|
|
double degree = va_arg(*list, double);
|
|
|
|
Evas_Object **direction = va_arg(*list, Evas_Object **);
|
|
|
|
double *weight = va_arg(*list, double *);
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
if (ret) *ret = EINA_FALSE;
|
|
|
|
Eina_Bool int_ret;
|
|
|
|
|
|
|
|
Eina_List *l = NULL;
|
|
|
|
Elm_Naviframe_Item *top_it;
|
|
|
|
void *(*list_data_get)(const Eina_List *list);
|
|
|
|
|
|
|
|
top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
|
|
|
|
if (!top_it) return;
|
|
|
|
|
|
|
|
list_data_get = eina_list_data_get;
|
|
|
|
|
|
|
|
l = eina_list_append(l, VIEW(top_it));
|
|
|
|
|
|
|
|
int_ret = elm_widget_focus_list_direction_get
|
|
|
|
(obj, base, l, list_data_get, degree, direction, weight);
|
|
|
|
|
|
|
|
if (ret) *ret = int_ret;
|
|
|
|
eina_list_free(l);
|
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static void
|
2012-11-25 22:32:53 -08:00
|
|
|
_elm_naviframe_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
|
2012-06-01 14:56:09 -07:00
|
|
|
{
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Naviframe_Smart_Data *priv = _pd;
|
2013-04-24 04:41:37 -07:00
|
|
|
Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_OBJ_WIDGET_CLASS);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-12-12 00:58:03 -08:00
|
|
|
priv->dummy_edje = wd->resize_obj;
|
2013-01-03 03:41:10 -08:00
|
|
|
evas_object_smart_member_add(priv->dummy_edje, obj);
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
priv->auto_pushed = EINA_TRUE;
|
|
|
|
priv->freeze_events = EINA_TRUE;
|
|
|
|
|
2012-10-15 16:44:39 -07:00
|
|
|
evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
|
|
|
|
_on_obj_size_hints_changed, obj);
|
2013-03-07 04:28:03 -08:00
|
|
|
elm_widget_can_focus_set(obj, EINA_TRUE);
|
2013-02-16 03:11:25 -08:00
|
|
|
|
2013-04-02 19:28:53 -07:00
|
|
|
elm_widget_sub_object_add(eo_parent_get(obj), obj);
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
2012-12-03 05:27:57 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_pop_transition_cb(void *data)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *prev_it, *it;
|
|
|
|
it = (Elm_Naviframe_Item *)data;
|
|
|
|
|
|
|
|
it->animator = NULL;
|
|
|
|
|
|
|
|
prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(WIDGET(it));
|
|
|
|
if (prev_it)
|
|
|
|
{
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred",
|
|
|
|
"elm");
|
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
|
2012-12-03 05:27:57 -08:00
|
|
|
}
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm");
|
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
|
2012-12-03 05:27:57 -08:00
|
|
|
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
static void
|
2012-11-25 22:32:53 -08:00
|
|
|
_elm_naviframe_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
|
2012-06-01 14:56:09 -07:00
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
sd->on_deletion = EINA_TRUE;
|
|
|
|
|
|
|
|
while (sd->stack)
|
|
|
|
{
|
|
|
|
it = EINA_INLIST_CONTAINER_GET(sd->stack, Elm_Naviframe_Item);
|
|
|
|
elm_widget_item_del(it);
|
|
|
|
}
|
|
|
|
|
2012-12-03 05:27:57 -08:00
|
|
|
//All popping items which are not called yet by animator.
|
2012-12-08 10:39:24 -08:00
|
|
|
EINA_LIST_FREE(sd->popping, it)
|
2012-12-03 05:27:57 -08:00
|
|
|
{
|
2012-12-07 04:31:07 -08:00
|
|
|
if (it->animator) ecore_animator_del(it->animator);
|
2012-12-03 05:27:57 -08:00
|
|
|
elm_widget_item_del(it);
|
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
sd->on_deletion = EINA_FALSE;
|
|
|
|
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
|
2012-06-01 14:56:09 -07:00
|
|
|
}
|
|
|
|
|
2013-03-07 04:28:03 -08:00
|
|
|
static void
|
2013-05-20 04:42:38 -07:00
|
|
|
_elm_naviframe_smart_event(Eo *obj, void *_pd, va_list *list)
|
2013-03-07 04:28:03 -08:00
|
|
|
{
|
2013-05-20 04:42:38 -07:00
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2013-03-07 04:28:03 -08:00
|
|
|
Evas_Object *source = va_arg(*list, Evas_Object *);
|
|
|
|
Evas_Callback_Type type = va_arg(*list, Evas_Callback_Type);
|
|
|
|
Evas_Event_Key_Down *ev = va_arg(*list, Evas_Event_Key_Down *);
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
(void) source;
|
|
|
|
|
|
|
|
if (ret) *ret = EINA_FALSE;
|
2013-04-04 04:46:25 -07:00
|
|
|
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
|
2013-03-07 04:28:03 -08:00
|
|
|
if (elm_widget_disabled_get(obj)) return;
|
|
|
|
if (type != EVAS_CALLBACK_KEY_DOWN) return;
|
|
|
|
if (strcmp(ev->keyname, "BackSpace")) return;
|
|
|
|
|
|
|
|
eo_do(obj, elm_obj_naviframe_top_item_get((Elm_Object_Item **)&it));
|
|
|
|
if (!it) return;
|
|
|
|
|
2013-05-20 04:42:38 -07:00
|
|
|
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
|
|
|
|
if (ret) *ret = EINA_TRUE;
|
|
|
|
|
|
|
|
if (sd->freeze_events && sd->popping) return;
|
|
|
|
|
2013-03-22 03:04:12 -07:00
|
|
|
//FIXME: Replace this below code to elm_naviframe_item_pop() at elm 2.0.
|
|
|
|
///Leave for compatibility.
|
2013-03-07 04:28:03 -08:00
|
|
|
if (it->title_prev_btn)
|
|
|
|
evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
|
|
|
|
}
|
|
|
|
|
2012-11-21 05:41:03 -08:00
|
|
|
static void
|
2012-11-25 22:32:53 -08:00
|
|
|
_elm_naviframe_smart_access(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
|
2012-11-21 05:41:03 -08:00
|
|
|
{
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-11-21 05:41:03 -08:00
|
|
|
Elm_Naviframe_Item *it;
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool is_access = va_arg(*list, int);
|
2012-11-21 05:41:03 -08:00
|
|
|
EINA_INLIST_FOREACH(sd->stack, it)
|
|
|
|
_access_obj_process(it, is_access);
|
|
|
|
}
|
|
|
|
|
2012-09-20 22:28:55 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_push_transition_cb(void *data)
|
|
|
|
{
|
2012-12-03 04:10:18 -08:00
|
|
|
Elm_Naviframe_Item *prev_it, *it = data;
|
|
|
|
|
2012-12-03 15:21:27 -08:00
|
|
|
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
|
2012-09-20 22:28:55 -07:00
|
|
|
|
2012-11-30 04:17:04 -08:00
|
|
|
it->animator = NULL;
|
2012-09-20 22:28:55 -07:00
|
|
|
|
|
|
|
if (sd->stack->last->prev)
|
|
|
|
{
|
|
|
|
prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last->prev,
|
|
|
|
Elm_Naviframe_Item);
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
|
2012-11-30 04:17:04 -08:00
|
|
|
"elm");
|
2013-01-03 03:26:57 -08:00
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
|
2012-09-20 22:28:55 -07:00
|
|
|
}
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
|
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
|
2012-09-20 22:28:55 -07:00
|
|
|
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
|
2012-11-25 22:32:53 -08:00
|
|
|
Evas_Object *obj = eo_add(MY_CLASS, parent);
|
|
|
|
eo_unref(obj);
|
|
|
|
return obj;
|
|
|
|
}
|
2011-11-03 00:15:18 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_constructor(Eo *obj, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
|
|
|
|
{
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, eo_constructor());
|
2012-11-25 22:32:53 -08:00
|
|
|
eo_do(obj,
|
|
|
|
evas_obj_type_set(MY_CLASS_NAME),
|
|
|
|
evas_obj_smart_callbacks_descriptions_set(_smart_callbacks, NULL));
|
2011-11-03 00:15:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
Elm_Object_Item *ret = NULL;
|
|
|
|
eo_do(obj, elm_obj_naviframe_item_push(title_label, prev_btn, next_btn, content, item_style, &ret));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_push(Eo *obj, void *_pd, va_list *list)
|
2011-11-03 00:15:18 -07:00
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *prev_it, *it;
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
const char *title_label = va_arg(*list, const char *);
|
|
|
|
Evas_Object *prev_btn = va_arg(*list, Evas_Object *);
|
|
|
|
Evas_Object *next_btn = va_arg(*list, Evas_Object *);
|
|
|
|
Evas_Object *content = va_arg(*list, Evas_Object *);
|
|
|
|
const char *item_style = va_arg(*list, const char *);
|
|
|
|
Elm_Object_Item **ret = va_arg(*list, Elm_Object_Item **);
|
|
|
|
*ret = NULL;
|
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);
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!it) return;
|
2011-11-03 00:15:18 -07:00
|
|
|
|
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));
|
2013-03-11 00:38:45 -07:00
|
|
|
if (prev_it)
|
2013-05-02 03:55:22 -07:00
|
|
|
{
|
|
|
|
elm_widget_focused_object_clear(VIEW(prev_it));
|
|
|
|
elm_widget_sub_object_add(obj, VIEW(prev_it));
|
|
|
|
}
|
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
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
|
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
|
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
|
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2013-03-11 00:38:45 -07:00
|
|
|
prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
|
|
|
|
elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-12-03 04:10:18 -08:00
|
|
|
it->animator = ecore_animator_add(_push_transition_cb, it);
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
2013-03-11 00:38:45 -07:00
|
|
|
else
|
|
|
|
elm_object_focus_set(VIEW(it), EINA_TRUE);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it));
|
2013-02-21 00:40:09 -08:00
|
|
|
evas_object_raise(VIEW(it));
|
2013-01-03 03:26:57 -08:00
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
*ret = (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)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
Elm_Object_Item *ret = NULL;
|
|
|
|
eo_do(obj, elm_obj_naviframe_item_insert_before(before, title_label, prev_btn, next_btn, content, item_style, &ret));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_insert_before(Eo *obj, void *_pd, va_list *list)
|
2011-11-03 00:15:18 -07:00
|
|
|
{
|
2012-10-15 19:54:59 -07:00
|
|
|
Elm_Naviframe_Item *it, *prev_it = NULL;
|
2011-11-03 00:15:18 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Object_Item *before = va_arg(*list, Elm_Object_Item *);
|
|
|
|
const char *title_label = va_arg(*list, const char *);
|
|
|
|
Evas_Object *prev_btn = va_arg(*list, Evas_Object *);
|
|
|
|
Evas_Object *next_btn = va_arg(*list, Evas_Object *);
|
|
|
|
Evas_Object *content = va_arg(*list, Evas_Object *);
|
|
|
|
const char *item_style = va_arg(*list, const char *);
|
|
|
|
Elm_Object_Item **ret = va_arg(*list, Elm_Object_Item **);
|
|
|
|
*ret = NULL;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK(before);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2011-11-03 00:15:18 -07:00
|
|
|
|
2012-10-15 09:26:11 -07:00
|
|
|
it = (Elm_Naviframe_Item *)before;
|
|
|
|
if (EINA_INLIST_GET(it)->prev)
|
|
|
|
prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev,
|
|
|
|
Elm_Naviframe_Item);
|
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, prev_it,
|
|
|
|
title_label, prev_btn, next_btn, content, item_style);
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!it) return;
|
2011-11-03 00:15:18 -07:00
|
|
|
|
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-11-25 22:32:53 -08:00
|
|
|
*ret = (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)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
Elm_Object_Item *ret = NULL;
|
|
|
|
eo_do(obj, elm_obj_naviframe_item_insert_after(after, title_label, prev_btn, next_btn, content, item_style, &ret));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_insert_after(Eo *obj, void *_pd, va_list *list)
|
2011-11-03 00:15:18 -07:00
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *it;
|
2012-09-10 18:48:00 -07:00
|
|
|
Eina_Bool top_inserted = EINA_FALSE;
|
2011-11-03 00:15:18 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Object_Item *after = va_arg(*list, Elm_Object_Item *);
|
|
|
|
const char *title_label = va_arg(*list, const char *);
|
|
|
|
Evas_Object *prev_btn = va_arg(*list, Evas_Object *);
|
|
|
|
Evas_Object *next_btn = va_arg(*list, Evas_Object *);
|
|
|
|
Evas_Object *content = va_arg(*list, Evas_Object *);
|
|
|
|
const char *item_style = va_arg(*list, const char *);
|
|
|
|
Elm_Object_Item **ret = va_arg(*list, Elm_Object_Item **);
|
|
|
|
*ret = NULL;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK(after);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
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);
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!it) return;
|
2011-11-03 00:15:18 -07:00
|
|
|
|
2012-09-10 18:48:00 -07:00
|
|
|
if (elm_naviframe_top_item_get(obj) == after) top_inserted = EINA_TRUE;
|
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-09-10 18:48:00 -07:00
|
|
|
if (top_inserted)
|
|
|
|
{
|
2012-12-08 00:09:44 -08:00
|
|
|
elm_widget_resize_object_set(obj, VIEW(it));
|
2013-05-02 03:55:22 -07:00
|
|
|
elm_widget_focused_object_clear(VIEW(after));
|
2013-03-11 00:38:45 -07:00
|
|
|
elm_widget_sub_object_add(obj, VIEW(after));
|
2012-09-10 18:48:00 -07:00
|
|
|
evas_object_show(VIEW(it));
|
|
|
|
evas_object_hide(VIEW(after));
|
2013-03-11 00:38:45 -07:00
|
|
|
elm_object_focus_set(VIEW(it), EINA_TRUE);
|
2012-09-10 18:48:00 -07:00
|
|
|
}
|
|
|
|
|
2012-06-01 14:56:09 -07:00
|
|
|
elm_layout_sizing_eval(obj);
|
2012-03-26 23:06:50 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
*ret = (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-11-25 22:32:53 -08:00
|
|
|
{
|
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
Evas_Object *ret = NULL;
|
|
|
|
eo_do(obj, elm_obj_naviframe_item_pop(&ret));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_pop(Eo *obj, void *_pd, va_list *list)
|
2011-07-12 21:21:50 -07:00
|
|
|
{
|
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-11-25 22:32:53 -08:00
|
|
|
Evas_Object **ret = va_arg(*list, Evas_Object **);
|
|
|
|
*ret = NULL;
|
|
|
|
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
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);
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!it) return;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2013-04-17 06:08:41 -07:00
|
|
|
if (it->animator || it->popping) return;
|
|
|
|
|
|
|
|
it->popping = EINA_TRUE;
|
|
|
|
|
2013-03-22 03:04:12 -07:00
|
|
|
if (it->pop_cb)
|
|
|
|
{
|
2013-04-17 06:08:41 -07:00
|
|
|
if (!it->pop_cb(it->pop_data, (Elm_Object_Item *)it))
|
|
|
|
{
|
|
|
|
it->popping = EINA_FALSE;
|
|
|
|
return;
|
|
|
|
}
|
2013-03-22 03:04:12 -07:00
|
|
|
}
|
2013-03-07 04:28:03 -08:00
|
|
|
|
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);
|
|
|
|
|
2013-03-11 00:38:45 -07:00
|
|
|
it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(it));
|
|
|
|
elm_widget_tree_unfocusable_set(VIEW(it), 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));
|
2012-12-12 00:58:03 -08:00
|
|
|
if (!sd->stack) elm_widget_resize_object_set(obj, sd->dummy_edje);
|
2012-06-01 14:56:09 -07:00
|
|
|
|
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
|
|
|
|
2012-09-19 07:34:03 -07:00
|
|
|
elm_widget_resize_object_set(obj, VIEW(prev_it));
|
2012-06-01 14:56:09 -07:00
|
|
|
evas_object_raise(VIEW(prev_it));
|
|
|
|
|
|
|
|
/* these 2 signals MUST take place simultaneously */
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
|
2011-10-20 18:08:01 -07:00
|
|
|
evas_object_show(VIEW(prev_it));
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
|
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
|
2012-09-20 22:28:55 -07:00
|
|
|
|
2012-11-30 04:17:04 -08:00
|
|
|
if (it->animator) ecore_animator_del(it->animator);
|
|
|
|
it->animator = ecore_animator_add(_pop_transition_cb, it);
|
2012-12-03 05:27:57 -08:00
|
|
|
sd->popping = eina_list_append(sd->popping, 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
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
*ret = content;
|
2011-07-12 21:21:50 -07:00
|
|
|
}
|
|
|
|
|
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)
|
|
|
|
{
|
2013-03-11 06:02:24 -07:00
|
|
|
Elm_Object_Item *prev_top;
|
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);
|
|
|
|
|
2013-03-11 00:38:45 -07:00
|
|
|
prev_top = elm_naviframe_top_item_get(nit->base.widget);
|
|
|
|
if (it == prev_top) return;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
/* 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));
|
2013-05-02 03:55:22 -07:00
|
|
|
elm_widget_focused_object_clear(VIEW(prev_top));
|
2013-03-11 00:38:45 -07:00
|
|
|
elm_widget_sub_object_add(WIDGET(it), VIEW(prev_top));
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
/* this was the previous top one */
|
|
|
|
prev_it = EINA_INLIST_CONTAINER_GET
|
|
|
|
(sd->stack->last->prev, Elm_Naviframe_Item);
|
|
|
|
|
2013-03-11 00:38:45 -07:00
|
|
|
prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
|
|
|
|
elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE);
|
2012-03-26 22:48:41 -07:00
|
|
|
|
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
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
evas_object_show(VIEW(nit));
|
|
|
|
evas_object_raise(VIEW(nit));
|
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
elm_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2013-01-03 03:26:57 -08:00
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
|
|
|
|
edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
|
2012-11-30 04:17:04 -08:00
|
|
|
if (nit->animator) ecore_animator_del(nit->animator);
|
2012-12-03 04:10:18 -08:00
|
|
|
nit->animator = ecore_animator_add(_push_transition_cb, 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-11-25 22:32:53 -08:00
|
|
|
{
|
|
|
|
ELM_NAVIFRAME_CHECK(obj);
|
|
|
|
eo_do(obj, elm_obj_naviframe_item_simple_promote(content));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_item_simple_promote(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
2012-02-16 01:26:30 -08:00
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *itr;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Evas_Object *content = va_arg(*list, Evas_Object *);
|
|
|
|
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
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);
|
2012-11-25 22:32:53 -08:00
|
|
|
eo_do(obj, elm_obj_naviframe_content_preserve_on_pop_set(preserve));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_content_preserve_on_pop_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool preserve = va_arg(*list, int);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
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;
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool ret = EINA_FALSE;
|
|
|
|
eo_do((Eo *) obj, elm_obj_naviframe_content_preserve_on_pop_get(&ret));
|
|
|
|
return ret;
|
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_content_preserve_on_pop_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
|
|
|
|
|
|
|
*ret = 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;
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Object_Item *ret = NULL;
|
|
|
|
eo_do((Eo *) obj, elm_obj_naviframe_top_item_get(&ret));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_top_item_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Elm_Object_Item **ret = va_arg(*list, Elm_Object_Item **);
|
|
|
|
*ret = NULL;
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
if (!sd->stack) return;
|
|
|
|
*ret = (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
|
2012-06-01 14:56:09 -07:00
|
|
|
(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;
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Object_Item *ret = NULL;
|
|
|
|
eo_do((Eo *) obj, elm_obj_naviframe_bottom_item_get(&ret));
|
|
|
|
return ret;
|
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_bottom_item_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Elm_Object_Item **ret = va_arg(*list, Elm_Object_Item **);
|
|
|
|
*ret = NULL;
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
|
|
|
|
|
|
|
if (!sd->stack) return;
|
|
|
|
*ret = (Elm_Object_Item *)(EINA_INLIST_CONTAINER_GET
|
2012-06-01 14:56:09 -07:00
|
|
|
(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);
|
2012-12-04 20:01:55 -08:00
|
|
|
_item_signals_emit(nit);
|
2012-06-01 14:56:09 -07:00
|
|
|
_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
|
|
|
}
|
|
|
|
|
2013-03-07 04:28:03 -08:00
|
|
|
EAPI void
|
|
|
|
elm_naviframe_item_pop_cb_set(Elm_Object_Item *it, Elm_Naviframe_Item_Pop_Cb func, void *data)
|
|
|
|
{
|
|
|
|
Elm_Naviframe_Item *nit = (Elm_Naviframe_Item *)it;
|
|
|
|
|
|
|
|
ELM_NAVIFRAME_ITEM_CHECK_OR_RETURN(it);
|
|
|
|
|
|
|
|
nit->pop_cb = func;
|
|
|
|
nit->pop_data = data;
|
|
|
|
}
|
|
|
|
|
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);
|
2012-11-25 22:32:53 -08:00
|
|
|
eo_do(obj, elm_obj_naviframe_prev_btn_auto_pushed_set(auto_pushed));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_prev_btn_auto_pushed_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool auto_pushed = va_arg(*list, int);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
|
|
|
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;
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool ret = EINA_FALSE;
|
|
|
|
eo_do((Eo *) obj, elm_obj_naviframe_prev_btn_auto_pushed_get(&ret));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_prev_btn_auto_pushed_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
*ret = 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-11-25 22:32:53 -08:00
|
|
|
ELM_NAVIFRAME_CHECK(obj) NULL;
|
|
|
|
Eina_List *ret;
|
|
|
|
eo_do((Eo *) obj, elm_obj_naviframe_items_get(&ret));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_items_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_List **ret = va_arg(*list, Eina_List **);
|
|
|
|
*ret = NULL;
|
2012-02-15 08:27:34 -08:00
|
|
|
Elm_Naviframe_Item *itr;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_INLIST_FOREACH(sd->stack, itr)
|
2012-11-25 22:32:53 -08:00
|
|
|
*ret = eina_list_append(*ret, itr);
|
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);
|
2012-11-25 22:32:53 -08:00
|
|
|
eo_do(obj, elm_obj_naviframe_event_enabled_set(enabled));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_event_enabled_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool enabled = va_arg(*list, int);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
2012-06-01 14:56:09 -07:00
|
|
|
|
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;
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool ret = EINA_FALSE;
|
|
|
|
eo_do((Eo *) obj, elm_obj_naviframe_event_enabled_get(&ret));
|
|
|
|
return ret;
|
|
|
|
}
|
2012-06-01 14:56:09 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
static void
|
|
|
|
_event_enabled_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
Elm_Naviframe_Smart_Data *sd = _pd;
|
|
|
|
|
|
|
|
*ret = !sd->freeze_events;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_elm_naviframe_smart_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
|
|
|
|
{
|
|
|
|
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
|
|
|
|
*ret = EINA_TRUE;
|
2011-12-11 20:54:15 -08:00
|
|
|
}
|
2012-11-25 22:32:53 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_class_constructor(Eo_Class *klass)
|
|
|
|
{
|
|
|
|
const Eo_Op_Func_Description func_desc[] = {
|
|
|
|
EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
|
|
|
|
|
|
|
|
EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ADD), _elm_naviframe_smart_add),
|
|
|
|
EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_DEL), _elm_naviframe_smart_del),
|
|
|
|
|
|
|
|
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS), _elm_naviframe_smart_focus_next_manager_is),
|
|
|
|
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT), _elm_naviframe_smart_focus_next),
|
2013-03-11 01:03:21 -07:00
|
|
|
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS), _elm_naviframe_smart_focus_direction_manager_is),
|
|
|
|
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION), _elm_naviframe_smart_focus_direction),
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_THEME), _elm_naviframe_smart_theme),
|
2013-04-23 04:30:15 -07:00
|
|
|
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_TRANSLATE), _elm_naviframe_smart_translate),
|
2012-11-25 22:32:53 -08:00
|
|
|
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_ACCESS), _elm_naviframe_smart_access),
|
2013-03-07 04:28:03 -08:00
|
|
|
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_EVENT), _elm_naviframe_smart_event),
|
2012-11-25 22:32:53 -08:00
|
|
|
|
|
|
|
EO_OP_FUNC(ELM_OBJ_CONTAINER_ID(ELM_OBJ_CONTAINER_SUB_ID_CONTENT_SET), _elm_naviframe_smart_content_set),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_CONTAINER_ID(ELM_OBJ_CONTAINER_SUB_ID_CONTENT_GET), _elm_naviframe_smart_content_get),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_CONTAINER_ID(ELM_OBJ_CONTAINER_SUB_ID_CONTENT_UNSET), _elm_naviframe_smart_content_unset),
|
|
|
|
|
|
|
|
EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_SIGNAL_EMIT), _elm_naviframe_smart_signal_emit),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_TEXT_SET), _elm_naviframe_smart_text_set),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_TEXT_GET), _elm_naviframe_smart_text_get),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_SIZING_EVAL), _elm_naviframe_smart_sizing_eval),
|
|
|
|
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_PUSH), _item_push),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_INSERT_BEFORE), _item_insert_before),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_INSERT_AFTER), _item_insert_after),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_POP), _item_pop),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_SIMPLE_PROMOTE), _item_simple_promote),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_CONTENT_PRESERVE_ON_POP_SET), _content_preserve_on_pop_set),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_CONTENT_PRESERVE_ON_POP_GET), _content_preserve_on_pop_get),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_TOP_ITEM_GET), _top_item_get),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_BOTTOM_ITEM_GET), _bottom_item_get),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_PREV_BTN_AUTO_PUSHED_SET), _prev_btn_auto_pushed_set),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_PREV_BTN_AUTO_PUSHED_GET), _prev_btn_auto_pushed_get),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_ITEMS_GET), _items_get),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_EVENT_ENABLED_SET), _event_enabled_set),
|
|
|
|
EO_OP_FUNC(ELM_OBJ_NAVIFRAME_ID(ELM_OBJ_NAVIFRAME_SUB_ID_EVENT_ENABLED_GET), _event_enabled_get),
|
|
|
|
EO_OP_FUNC_SENTINEL
|
|
|
|
};
|
|
|
|
eo_class_funcs_set(klass, func_desc);
|
2013-02-09 23:52:31 -08:00
|
|
|
|
|
|
|
evas_smart_legacy_type_register(MY_CLASS_NAME, klass);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static const
|
|
|
|
Eo_Op_Description op_desc[] = {
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_PUSH, "Push a new item to the top of the naviframe stack (and show it)."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_INSERT_BEFORE, "Insert a new item into the naviframe before item before."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_INSERT_AFTER, "Insert a new item into the naviframe after item after."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_POP, "Pop an item that is on top of the stack."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_ITEM_SIMPLE_PROMOTE, "Simple version of item_promote."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_CONTENT_PRESERVE_ON_POP_SET, "preserve the content objects when items are popped."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_CONTENT_PRESERVE_ON_POP_GET, "Get a value whether preserve mode is enabled or not."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_TOP_ITEM_GET, "Get a top item on the naviframe stack."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_BOTTOM_ITEM_GET, "Get a bottom item on the naviframe stack."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_PREV_BTN_AUTO_PUSHED_SET, "Set creating prev button automatically or not."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_PREV_BTN_AUTO_PUSHED_GET, "Get a value whether prev button(back button) will be auto pushed or not."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_ITEMS_GET, "Get a list of all the naviframe items."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_EVENT_ENABLED_SET, "Set the event enabled when pushing/popping items."),
|
|
|
|
EO_OP_DESCRIPTION(ELM_OBJ_NAVIFRAME_SUB_ID_EVENT_ENABLED_GET, "Get the value of event enabled status."),
|
|
|
|
EO_OP_DESCRIPTION_SENTINEL
|
|
|
|
};
|
|
|
|
|
|
|
|
static const Eo_Class_Description class_desc = {
|
|
|
|
EO_VERSION,
|
|
|
|
MY_CLASS_NAME,
|
|
|
|
EO_CLASS_TYPE_REGULAR,
|
|
|
|
EO_CLASS_DESCRIPTION_OPS(&ELM_OBJ_NAVIFRAME_BASE_ID, op_desc, ELM_OBJ_NAVIFRAME_SUB_ID_LAST),
|
|
|
|
NULL,
|
|
|
|
sizeof(Elm_Naviframe_Smart_Data),
|
|
|
|
_class_constructor,
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
EO_DEFINE_CLASS(elm_obj_naviframe_class_get, &class_desc, ELM_OBJ_LAYOUT_CLASS, NULL);
|