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";
+static const char TITLE_PART[] = "elm.text.title";
+static const char SUBTITLE_PART[] = "elm.text.subtitle";
+static const char TITLE_ACCESS_PART[] = "access.title";
static const char SIG_TRANSITION_FINISHED[] = "transition,finished";
static const char SIG_TITLE_CLICKED[] = "title,clicked";
(ELM_NAVIFRAME_SMART_NAME, _elm_naviframe, Elm_Naviframe_Smart_Class,
Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
+static const char SIG_CLICKED[] = "clicked";
+
static void
_item_content_del_cb(void *data,
Evas *e __UNUSED__,
Elm_Naviframe_Item *it = data;
it->content = NULL;
- edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
}
static void
Elm_Naviframe_Item *it = data;
it->title_prev_btn = NULL;
- edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
}
static void
Elm_Naviframe_Item *it = data;
it->title_next_btn = NULL;
- edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
}
static void
Elm_Naviframe_Item *it = data;
it->title_icon = NULL;
- edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
}
static void
Elm_Naviframe_Content_Item_Pair *pair = data;
Elm_Naviframe_Item *it = pair->it;
snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
- edje_object_signal_emit(VIEW(it), buf, "elm");
+ elm_object_signal_emit(VIEW(it), buf, "elm");
it->content_list = eina_inlist_remove(it->content_list,
EINA_INLIST_GET(pair));
eina_stringshare_del(pair->part);
eina_stringshare_del(it->title_label);
eina_stringshare_del(it->subtitle_label);
- if (it->title_prev_btn) evas_object_del(it->title_prev_btn);
- if (it->title_next_btn) evas_object_del(it->title_next_btn);
- if (it->title_icon) evas_object_del(it->title_icon);
-
EINA_INLIST_FOREACH_SAFE(it->content_list, l, content_pair)
{
if (content_pair->content)
{
/* so that elm does not delete the contents with the item's
* view after the del_pre_hook */
- edje_object_part_unswallow(VIEW(it), it->content);
+ elm_object_part_content_unset(VIEW(it), CONTENT_PART);
evas_object_event_callback_del
(it->content, EVAS_CALLBACK_DEL, _item_content_del_cb);
}
- else
- evas_object_del(it->content);
}
}
char buf[1024];
//content
if (it->content)
- edje_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
else
- edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
//prev button
if (it->title_prev_btn)
- edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
else
- edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
//next button
if (it->title_next_btn)
- edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
else
- edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
if (it->title_icon)
- edje_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
else
- edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
EINA_INLIST_FOREACH(it->content_list, content_pair)
{
snprintf(buf, sizeof(buf), "elm,state,%s,show", content_pair->part);
else
snprintf(buf, sizeof(buf), "elm,state,%s,hide", content_pair->part);
- edje_object_signal_emit(VIEW(it), buf, "elm");
+ elm_object_signal_emit(VIEW(it), buf, "elm");
}
}
char buf[1024];
if ((it->title_label) && (it->title_label[0]))
- edje_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
else
- edje_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
if ((it->subtitle_label) && (it->subtitle_label[0]))
- edje_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
else
- edje_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
EINA_INLIST_FOREACH(it->text_list, text_pair)
{
- if (edje_object_part_text_get(VIEW(it), text_pair->part))
+ if (elm_object_part_text_get(VIEW(it), text_pair->part))
snprintf(buf, sizeof(buf), "elm,state,%s,show", text_pair->part);
else
snprintf(buf, sizeof(buf), "elm,state,%s,hide", text_pair->part);
- edje_object_signal_emit(VIEW(it), buf, "elm");
+ elm_object_signal_emit(VIEW(it), buf, "elm");
}
}
{
Evas_Object *po, *ao;
- if (!edje_object_part_text_get(VIEW(it), part)) return NULL;
-
- po = (Evas_Object *)edje_object_part_object_get(VIEW(it), part);
+ po = (Evas_Object *)edje_object_part_object_get
+ (elm_layout_edje_get(VIEW(it)), part);
ao = evas_object_data_get(po, "_part_access_obj");
return ao;
return;
}
- ao =_access_object_get(it, "elm.text.title");
+ ao =_access_object_get(it, TITLE_ACCESS_PART);
if (ao) elm_object_focus_set(ao, EINA_TRUE);
else if ((it->title_icon) &&
(elm_widget_can_focus_get(it->title_icon) ||
eina_stringshare_replace(&it->style, item_style);
}
- elm_widget_theme_object_set
- (WIDGET(it), VIEW(it), "naviframe", buf, elm_widget_style_get(WIDGET(it)));
+ elm_layout_theme_set(VIEW(it), "naviframe", buf,
+ elm_widget_style_get(WIDGET(it)));
if (sd->freeze_events)
evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
if (_elm_config->access_mode) _access_focus_set(nit);
if (nit->title_visible)
- edje_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
+ elm_object_signal_emit(VIEW(nit), "elm,state,title,show", "elm");
else
- edje_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
- edje_object_message_signal_process(VIEW(nit));
+ elm_object_signal_emit(VIEW(nit), "elm,state,title,hide", "elm");
}
static Eina_Bool
_elm_naviframe_smart_theme(Evas_Object *obj)
{
Elm_Naviframe_Item *it;
+ const char *style, *sstyle;
ELM_NAVIFRAME_DATA_GET(obj, sd);
- if (!ELM_WIDGET_CLASS(_elm_naviframe_parent_sc)->theme(obj))
- return EINA_FALSE;
+ style = elm_widget_style_get(obj);
EINA_INLIST_FOREACH(sd->stack, it)
{
- _item_style_set(it, it->style);
- _item_signals_emit(it);
- _item_title_visible_update(it);
+ /* FIXME: Need to merge with opensource later. smart_theme() is called
+ multiple timese since the elm_widget.c is inefficient. If the
+ elm_widget is merged with the latest opensouce, it's ok to sync with
+ opensource here also */
+ sstyle = elm_widget_style_get(VIEW(it));
+ if ((style && sstyle) && strcmp(style, sstyle))
+ {
+ _item_style_set(it, it->style);
+ _item_signals_emit(it);
+ _item_title_visible_update(it);
+ }
}
elm_layout_sizing_eval(obj);
return EINA_TRUE;
}
+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;
+}
+
static void
_access_obj_process(Elm_Naviframe_Item *it, Eina_Bool is_access)
{
- Evas_Object *ao;
- Elm_Naviframe_Text_Item_Pair *pair;
+ Evas_Object *ao, *eo;
if (is_access)
{
- if (!_access_object_get(it, "elm.text.title"))
+ if (!_access_object_get(it, TITLE_ACCESS_PART))
{
- ao =_elm_access_edje_object_part_object_register
- (WIDGET(it), VIEW(it), "elm.text.title");
+ eo = elm_layout_edje_get(VIEW(it));
+ ao =_elm_access_edje_object_part_object_register(WIDGET(it), eo,
+ TITLE_ACCESS_PART);
_elm_access_text_set(_elm_access_object_get(ao),
ELM_ACCESS_TYPE, E_("title"));
- }
+ _elm_access_callback_set(_elm_access_object_get(ao),
+ ELM_ACCESS_INFO, _access_info_cb, VIEW(it));
- if (!_access_object_get(it, "elm.text.subtitle"))
- {
- ao =_elm_access_edje_object_part_object_register
- (WIDGET(it), VIEW(it), "elm.text.subtitle");
- _elm_access_text_set(_elm_access_object_get(ao),
- ELM_ACCESS_TYPE, E_("sub title"));
- }
-
- EINA_INLIST_FOREACH(it->text_list, pair)
- {
- if (!_access_object_get(it, pair->part))
- {
- ao = _elm_access_edje_object_part_object_register
- (WIDGET(it), VIEW(it), pair->part);
- _elm_access_text_set(_elm_access_object_get(ao),
- ELM_ACCESS_TYPE, E_(pair->part));
- }
- }
+ /* to access title access object, any idea? */
+ ((Elm_Widget_Item *)it)->access_obj = ao;
+ }
}
else
{
if (it->title_label)
_elm_access_edje_object_part_object_unregister
- (WIDGET(it), VIEW(it), "elm.text.title");
-
- if (it->subtitle_label)
- _elm_access_edje_object_part_object_unregister
- (WIDGET(it), VIEW(it), "elm.text.subtitle");
+ (WIDGET(it), elm_layout_edje_get(VIEW(it)), TITLE_ACCESS_PART);
- EINA_INLIST_FOREACH(it->text_list, pair)
- _elm_access_edje_object_part_object_unregister
- (WIDGET(it), VIEW(it), pair->part);
+ /* to access title access object, any idea? */
+ ao = ((Elm_Widget_Item *)it)->access_obj;
+ if (!ao) return;
+ evas_object_del(ao);
}
}
char buf[1024];
if ((!part) || (!strcmp(part, "default")) ||
- (!strcmp(part, "elm.text.title")))
+ (!strcmp(part, TITLE_PART)))
{
eina_stringshare_replace(&nit->title_label, label);
- snprintf(buf, sizeof(buf), "elm.text.title");
if (label)
- edje_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,title_label,show", "elm");
else
- edje_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
- edje_object_part_text_set(VIEW(it), buf, label);
+ elm_object_signal_emit(VIEW(it), "elm,state,title_label,hide", "elm");
+ elm_object_part_text_set(VIEW(it), TITLE_PART, label);
}
else if (!strcmp("subtitle", part))
{
eina_stringshare_replace(&nit->subtitle_label, label);
- snprintf(buf, sizeof(buf), "elm.text.subtitle");
if (label)
- edje_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,subtitle,show", "elm");
else
- edje_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
- edje_object_part_text_set(VIEW(it), buf, label);
+ elm_object_signal_emit(VIEW(it), "elm,state,subtitle,hide", "elm");
+ elm_object_part_text_set(VIEW(it), SUBTITLE_PART, label);
}
else
{
- snprintf(buf, sizeof(buf), "%s", part);
EINA_INLIST_FOREACH(nit->text_list, pair)
- if (!strcmp(buf, pair->part)) break;
+ if (!strcmp(part, pair->part)) break;
if (!pair)
{
WIDGET(it));
return;
}
- eina_stringshare_replace(&pair->part, buf);
+ eina_stringshare_replace(&pair->part, part);
nit->text_list = eina_inlist_append(nit->text_list,
EINA_INLIST_GET(pair));
}
snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
else
snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
- edje_object_signal_emit(VIEW(it), buf, "elm");
- edje_object_part_text_set(VIEW(it), part, label);
+ elm_object_signal_emit(VIEW(it), buf, "elm");
+ elm_object_part_text_set(VIEW(it), part, label);
}
/* access */
char buf[1024];
if (!part || !strcmp(part, "default"))
- snprintf(buf, sizeof(buf), "elm.text.title");
+ snprintf(buf, sizeof(buf), TITLE_PART);
else if (!strcmp("subtitle", part))
- snprintf(buf, sizeof(buf), "elm.text.subtitle");
+ snprintf(buf, sizeof(buf), SUBTITLE_PART);
else
snprintf(buf, sizeof(buf), "%s", part);
- return edje_object_part_text_get(VIEW(it), buf);
+ return elm_object_part_text_get(VIEW(it), buf);
}
static Eina_Bool
nit = (Elm_Naviframe_Item *)it;
ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
- if (it == sd->compress_it)
- sd->compress_it = NULL;
-
if (nit->animator) ecore_animator_del(nit->animator);
top = (it == elm_naviframe_top_item_get(WIDGET(nit)));
if (evas_object_data_get(VIEW(nit), "out_of_list"))
goto end;
- if (nit->content && !sd->on_deletion)
+ if (!sd->on_deletion)
{
- nit->content_unfocusable =
- elm_widget_tree_unfocusable_get(nit->content);
- elm_widget_tree_unfocusable_set(nit->content, EINA_TRUE);
+ nit->unfocusable = elm_widget_tree_unfocusable_get(VIEW(nit));
+ elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE);
}
if (sd->stack->last->prev)
evas_object_show(VIEW(prev_it));
evas_object_raise(VIEW(prev_it));
- edje_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
- edje_object_message_signal_process(VIEW(prev_it));
+ elm_object_signal_emit(VIEW(prev_it), "elm,state,visible", "elm");
}
end:
if (!content) return;
- edje_object_part_swallow(VIEW(it), CONTENT_PART, content);
- edje_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
+ elm_object_part_content_set(VIEW(it), CONTENT_PART, content);
+ elm_object_signal_emit(VIEW(it), "elm,state,content,show", "elm");
evas_object_event_callback_add
(content, EVAS_CALLBACK_DEL, _item_content_del_cb, it);
- elm_widget_sub_object_add(WIDGET(it), content);
}
static void
it->title_prev_btn = btn;
if (!btn) return;
- edje_object_part_swallow(VIEW(it), PREV_BTN_PART, btn);
- edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
+ elm_object_part_content_set(VIEW(it), PREV_BTN_PART, btn);
+ elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,show", "elm");
evas_object_event_callback_add
(btn, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb, it);
}
it->title_next_btn = btn;
if (!btn) return;
- edje_object_part_swallow(VIEW(it), NEXT_BTN_PART, btn);
- edje_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
+ elm_object_part_content_set(VIEW(it), NEXT_BTN_PART, btn);
+ elm_object_signal_emit(VIEW(it), "elm,state,next_btn,show", "elm");
evas_object_event_callback_add
(btn, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb, it);
it->title_icon = icon;
if (!icon) return;
- edje_object_part_swallow(VIEW(it), ICON_PART, icon);
- edje_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
+ elm_object_part_content_set(VIEW(it), ICON_PART, icon);
+ elm_object_signal_emit(VIEW(it), "elm,state,icon,show", "elm");
evas_object_event_callback_add
(icon, EVAS_CALLBACK_DEL, _item_title_icon_del_cb, it);
if (!content) return NULL;
- edje_object_part_unswallow(VIEW(it), content);
- edje_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
+ elm_object_part_content_unset(VIEW(it), CONTENT_PART);
+ elm_object_signal_emit(VIEW(it), "elm,state,content,hide", "elm");
evas_object_event_callback_del
(content, EVAS_CALLBACK_DEL, _item_content_del_cb);
- elm_widget_sub_object_del(WIDGET(it), content);
+
it->content = NULL;
return content;
}
if (!content) return NULL;
- edje_object_part_unswallow(VIEW(it), it->title_prev_btn);
- edje_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
+ elm_object_part_content_unset(VIEW(it), PREV_BTN_PART);
+ elm_object_signal_emit(VIEW(it), "elm,state,prev_btn,hide", "elm");
evas_object_event_callback_del
(content, EVAS_CALLBACK_DEL, _item_title_prev_btn_del_cb);
if (!content) return NULL;
- edje_object_part_unswallow(VIEW(it), it->title_next_btn);
- edje_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
+ elm_object_part_content_unset(VIEW(it), NEXT_BTN_PART);
+ elm_object_signal_emit(VIEW(it), "elm,state,next_btn,hide", "elm");
evas_object_event_callback_del
(content, EVAS_CALLBACK_DEL, _item_title_next_btn_del_cb);
if (!content) return NULL;
- edje_object_part_unswallow(VIEW(it), it->title_icon);
- edje_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
+ elm_object_part_content_unset(VIEW(it), ICON_PART);
+ elm_object_signal_emit(VIEW(it), "elm,state,icon,hide", "elm");
evas_object_event_callback_del
(content, EVAS_CALLBACK_DEL, _item_title_icon_del_cb);
if (pair)
{
if (pair->content == content) return;
- if (content) edje_object_part_swallow(VIEW(it), part, content);
if (pair->content)
- {
- evas_object_event_callback_del(pair->content,
- EVAS_CALLBACK_DEL,
- _title_content_del);
- evas_object_del(pair->content);
- }
+ evas_object_event_callback_del(pair->content,
+ EVAS_CALLBACK_DEL,
+ _title_content_del);
+ if (content) elm_object_part_content_set(VIEW(it), part, content);
}
else
{
eina_stringshare_replace(&pair->part, part);
it->content_list = eina_inlist_append(it->content_list,
EINA_INLIST_GET(pair));
- edje_object_part_swallow(VIEW(it), part, content);
+ elm_object_part_content_set(VIEW(it), part, content);
snprintf(buf, sizeof(buf), "elm,state,%s,show", part);
- edje_object_signal_emit(VIEW(it), buf, "elm");
+ elm_object_signal_emit(VIEW(it), buf, "elm");
}
pair->content = content;
evas_object_event_callback_add(content,
EVAS_CALLBACK_DEL,
_title_content_del,
pair);
+
+ /* access */
+ if (_elm_config->access_mode)
+ _access_obj_process(it, EINA_TRUE);
}
static void
return nit->title_icon;
//common parts
- return edje_object_part_swallow_get(VIEW(nit), part);
+ return elm_object_part_content_get(VIEW(nit), part);
}
static Evas_Object *
if (!content) return NULL;
- edje_object_part_unswallow(VIEW(it), content);
+ elm_object_part_content_unset(VIEW(it), part);
snprintf(buf, sizeof(buf), "elm,state,%s,hide", part);
- edje_object_signal_emit(VIEW(it), buf, "elm");
+ elm_object_signal_emit(VIEW(it), buf, "elm");
evas_object_event_callback_del(content,
EVAS_CALLBACK_DEL,
_title_content_del);
const char *emission,
const char *source)
{
- edje_object_signal_emit(VIEW(it), emission, source);
+ elm_object_signal_emit(VIEW(it), emission, source);
}
static void
{
evas_object_move(VIEW(it), x, y);
evas_object_resize(VIEW(it), w, h);
- edje_object_size_min_calc(VIEW(it), &it->minw, &it->minh);
+ edje_object_size_min_calc(elm_layout_edje_get(VIEW(it)),
+ &it->minw, &it->minh);
if (it->minw > minw) minw = it->minw;
if (it->minh > minh) minh = it->minh;
}
multiple times on some heavy environment. This callback del will
prevent those scenario and guarantee only one clicked for it's own
page. */
- evas_object_smart_callback_del(obj, "clicked", _on_item_back_btn_clicked);
+ evas_object_smart_callback_del(obj, SIG_CLICKED, _on_item_back_btn_clicked);
elm_naviframe_item_pop(data);
}
if (!btn) return NULL;
evas_object_smart_callback_add
- (btn, "clicked", _on_item_back_btn_clicked, obj);
+ (btn, SIG_CLICKED, _on_item_back_btn_clicked, obj);
snprintf
(buf, sizeof(buf), "naviframe/back_btn/%s", elm_widget_style_get(obj));
elm_object_style_set(btn, buf);
* set an icon.
*/
ed = elm_layout_edje_get(btn);
- if (edje_object_part_exists(ed, "elm.swallow.content"))
+ if (edje_object_part_exists(ed, CONTENT_PART))
{
Evas_Object *ico = elm_icon_add(btn);
elm_icon_standard_set(ico, "arrow_left");
- elm_layout_content_set(btn, "elm.swallow.content", ico);
+ elm_layout_content_set(btn, CONTENT_PART, ico);
}
return btn;
}
static void
+_elm_naviframe_smart_signal_callback_add(Evas_Object *obj,
+ const char *emission,
+ const char *source,
+ Edje_Signal_Cb func_cb,
+ void *data)
+{
+ ELM_NAVIFRAME_DATA_GET(obj, sd);
+ Elm_Object_Item *it;
+
+ if (!sd->stack) return;
+
+ _elm_naviframe_parent_sc->callback_add(obj, emission, source, func_cb, data);
+
+ it = elm_naviframe_top_item_get(obj);
+ if (!it) return EINA_FALSE;
+
+ elm_object_signal_callback_add(VIEW(it), emission, source, func_cb, data);
+}
+
+static void
_elm_naviframe_smart_signal(Evas_Object *obj,
const char *emission,
const char *source)
evas_object_hide(VIEW(it));
- if (it->content)
- elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
+ elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
if (sd->freeze_events)
evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
- if (sd->preserve && it->content)
- elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
+ if (sd->preserve)
+ elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
sd->popping = eina_list_remove(sd->popping, it);
elm_widget_item_del(data);
const char *source __UNUSED__)
{
Elm_Naviframe_Item *it = data;
+ unsigned int order = 0;
+ Evas_Object *newest;
ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd);
- edje_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
- edje_object_message_signal_process(VIEW(it));
+ elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm");
+
+ elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable);
- elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable);
+ 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);
if (sd->freeze_events)
evas_object_freeze_events_set(VIEW(it), EINA_FALSE);
elm_layout_sizing_eval(data);
}
+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:
+ elm_object_signal_emit(VIEW(it), "display,mode,compress", "");
+ break;
+ default:
+ elm_object_signal_emit(VIEW(it), "display,mode,default", "");
+ break;
+ }
+ it->dispmode = dispmode;
+}
+
static Elm_Naviframe_Item *
_item_new(Evas_Object *obj,
const Elm_Naviframe_Item *prev_it,
elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
//item base layout
- VIEW(it) = edje_object_add(evas_object_evas_get(obj));
+ VIEW(it) = elm_layout_add(obj);
evas_object_smart_member_add(VIEW(it), obj);
evas_object_event_callback_add
(VIEW(it), EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_on_item_size_hints_changed, obj);
- edje_object_signal_callback_add
+
+ elm_object_signal_callback_add
(VIEW(it), "elm,action,show,finished", "", _on_item_show_finished, it);
- edje_object_signal_callback_add
+ elm_object_signal_callback_add
(VIEW(it), "elm,action,pushed,finished", "", _on_item_push_finished, it);
- edje_object_signal_callback_add
+ elm_object_signal_callback_add
(VIEW(it), "elm,action,popped,finished", "", _on_item_pop_finished, it);
- edje_object_signal_callback_add
+ elm_object_signal_callback_add
(VIEW(it), "elm,action,title,clicked", "", _on_item_title_clicked, it);
_item_style_set(it, item_style);
if (title_label)
- _item_text_set_hook((Elm_Object_Item *)it, "elm.text.title", title_label);
+ _item_text_set_hook((Elm_Object_Item *)it, TITLE_PART, title_label);
//title buttons
if ((!prev_btn) && sd->auto_pushed && prev_it)
}
if (prev_btn)
- _item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
+ {
+ _item_content_set_hook((Elm_Object_Item *)it, PREV_BTN_PART, prev_btn);
+
+ if (!elm_layout_text_get(prev_btn, NULL))
+ _elm_access_text_set
+ (_elm_access_object_get(prev_btn), ELM_ACCESS_INFO, E_("Back"));
+ }
if (next_btn)
- _item_content_set_hook((Elm_Object_Item *)it, NEXT_BTN_PART, next_btn);
+ {
+ _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"));
+ }
_item_content_set(it, content);
+ _item_dispmode_set(it, sd->dispmode);
+
it->title_visible = EINA_TRUE;
return it;
_on_obj_size_hints_changed(void *data __UNUSED__, Evas *e __UNUSED__,
Evas_Object *obj, void *event_info __UNUSED__)
{
- Elm_Object_Item *it;
+ Elm_Naviframe_Item *it;
Evas_Display_Mode dispmode;
ELM_NAVIFRAME_DATA_GET(obj, sd);
- it = elm_naviframe_top_item_get(obj);
- if (!it) return;
-
dispmode = evas_object_size_hint_display_mode_get(obj);
+ if (sd->dispmode == dispmode) return;
+
sd->dispmode = dispmode;
- switch (dispmode)
- {
- case EVAS_DISPLAY_MODE_COMPRESS:
- edje_object_signal_emit(VIEW(it), "display,mode,compress", "");
- sd->compress_it = it;
- break;
- default:
- if (sd->compress_it)
- edje_object_signal_emit(VIEW(sd->compress_it), "display,mode,default", "");
- break;
- }
+ EINA_INLIST_FOREACH(sd->stack, it)
+ _item_dispmode_set(it, dispmode);
}
static Eina_Bool
Eina_Bool ret;
Eina_List *l = NULL;
Elm_Naviframe_Item *top_it;
- Elm_Naviframe_Content_Item_Pair *content_pair = NULL;
- Elm_Naviframe_Text_Item_Pair *text_pair = NULL;
void *(*list_data_get)(const Eina_List *list);
top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
if (!top_it) return EINA_FALSE;
- if (!top_it->title_visible)
- {
- return elm_widget_focus_next_get(top_it->content, dir, next);
- }
-
list_data_get = eina_list_data_get;
+ l = eina_list_append(l, VIEW(top_it));
+
/* access */
if (_elm_config->access_mode)
{
- ao = _access_object_get(top_it, "elm.text.title");
+ ao = _access_object_get(top_it, TITLE_ACCESS_PART);
if (ao) l = eina_list_append(l, ao);
+ }
- ao = _access_object_get(top_it, "elm.text.subtitle");
- if (ao) l = eina_list_append(l, ao);
+ ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
+ eina_list_free(l);
+ return ret;
+}
- EINA_INLIST_FOREACH(top_it->text_list, text_pair)
- {
- ao = _access_object_get(top_it, text_pair->part);
- if (ao) l = eina_list_append(l, ao);
- }
- }
+static Eina_Bool
+_elm_naviframe_smart_focus_direction(const Evas_Object *obj,
+ const Evas_Object *base,
+ double degree,
+ Evas_Object **direction,
+ double *weight)
+{
+ Eina_Bool ret;
+ Eina_List *l = NULL;
+ Elm_Naviframe_Item *top_it;
+ void *(*list_data_get)(const Eina_List *list);
- /* icon would be able to have an widget. ex: segment control */
- if ((top_it->title_icon) &&
- (elm_widget_can_focus_get(top_it->title_icon) ||
- elm_widget_child_can_focus_get(top_it->title_icon)))
- l = eina_list_append(l, top_it->title_icon);
-
- if (top_it->title_prev_btn)
- l = eina_list_append(l, top_it->title_prev_btn);
- if (top_it->title_next_btn)
- l = eina_list_append(l, top_it->title_next_btn);
- if (top_it->content)
- l = eina_list_append(l, top_it->content);
- EINA_INLIST_FOREACH(top_it->content_list, content_pair)
- {
- if (edje_object_part_swallow_get(VIEW(top_it), content_pair->part))
- l = eina_list_append(l, edje_object_part_swallow_get(VIEW(top_it),
- content_pair->part));
- }
- l = eina_list_append(l, VIEW(top_it));
+ top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
+ if (!top_it) return EINA_FALSE;
- ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
+ list_data_get = eina_list_data_get;
+
+ l = eina_list_append(l, VIEW(top_it));
+ ret = elm_widget_focus_list_direction_get
+ (obj, base, l, list_data_get, degree, direction, weight);
eina_list_free(l);
return ret;
evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_on_obj_size_hints_changed, obj);
- elm_widget_can_focus_set(obj, EINA_FALSE);
+ elm_widget_can_focus_set(obj, EINA_TRUE);
}
static Eina_Bool
prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(WIDGET(it));
if (prev_it)
{
- edje_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred", "elm");
+ elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred",
+ "elm");
//FIXME: Remove the below line once edje_object_message_signal_process is fixed.
//This API crashes when in the midst of this API processing if edje object passed here is deleted.
- //edje_object_message_signal_process(VIEW(prev_it));
+ //edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
}
- edje_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm");
//FIXME: Remove the below line once edje_object_message_signal_process is fixed.
//This API crashes when in the midst of this API processing if edje object passed here is deleted.
- //edje_object_message_signal_process(VIEW(it));
+ //edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
return ECORE_CALLBACK_CANCEL;
}
_elm_naviframe_smart_del(Evas_Object *obj)
{
Elm_Naviframe_Item *it;
- Eina_List *l;
ELM_NAVIFRAME_DATA_GET(obj, sd);
}
//All popping items which are not called yet by animator.
- EINA_LIST_FOREACH(sd->popping, l, it)
+ EINA_LIST_FREE(sd->popping, it)
{
if (it->animator) ecore_animator_del(it->animator);
elm_widget_item_del(it);
_access_obj_process(it, is_access);
}
+static Eina_Bool
+_elm_naviframe_smart_event(Evas_Object *obj,
+ Evas_Object *src __UNUSED__,
+ Evas_Callback_Type type,
+ void *event_info)
+{
+ Elm_Naviframe_Item *it;
+ Evas_Event_Key_Down *ev = event_info;
+
+ if (elm_widget_disabled_get(obj)) return EINA_FALSE;
+ if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
+
+//Tizen Only: Need to customize the "Escape" Key
+ if (strcmp(ev->keyname, "Escape")) return EINA_FALSE;
+
+ it = elm_naviframe_top_item_get(obj);
+ if (!it) return EINA_FALSE;
+
+ if (it->title_prev_btn)
+ evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
+
+ ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_elm_naviframe_smart_activate(Evas_Object *obj, Elm_Activate act)
+{
+ Elm_Naviframe_Item *it;
+
+ if (act != ELM_ACTIVATE_BACK) return EINA_FALSE;
+ if (elm_widget_disabled_get(obj)) return EINA_FALSE;
+
+ it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
+ if (!it) return EINA_FALSE;
+
+ if (it->title_prev_btn)
+ evas_object_smart_callback_call(it->title_prev_btn, SIG_CLICKED, NULL);
+
+ return EINA_TRUE;
+}
+
static void
_elm_naviframe_smart_set_user(Elm_Naviframe_Smart_Class *sc)
{
ELM_WIDGET_CLASS(sc)->theme = _elm_naviframe_smart_theme;
ELM_WIDGET_CLASS(sc)->focus_next = _elm_naviframe_smart_focus_next;
+ ELM_WIDGET_CLASS(sc)->focus_direction = _elm_naviframe_smart_focus_direction;
ELM_WIDGET_CLASS(sc)->access = _elm_naviframe_smart_access;
+ ELM_WIDGET_CLASS(sc)->event = _elm_naviframe_smart_event;
+ ELM_WIDGET_CLASS(sc)->activate = _elm_naviframe_smart_activate;
ELM_CONTAINER_CLASS(sc)->content_set = _elm_naviframe_smart_content_set;
ELM_CONTAINER_CLASS(sc)->content_get = _elm_naviframe_smart_content_get;
ELM_CONTAINER_CLASS(sc)->content_unset = _elm_naviframe_smart_content_unset;
ELM_LAYOUT_CLASS(sc)->signal = _elm_naviframe_smart_signal;
+ ELM_LAYOUT_CLASS(sc)->callback_add = _elm_naviframe_smart_signal_callback_add;
ELM_LAYOUT_CLASS(sc)->text_set = _elm_naviframe_smart_text_set;
ELM_LAYOUT_CLASS(sc)->text_get = _elm_naviframe_smart_text_get;
ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_naviframe_smart_sizing_eval;
{
prev_it = EINA_INLIST_CONTAINER_GET(sd->stack->last->prev,
Elm_Naviframe_Item);
- edje_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
+ elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed,deferred",
"elm");
- edje_object_message_signal_process(VIEW(prev_it));
+ edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
}
- edje_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
- edje_object_message_signal_process(VIEW(it));
+ elm_object_signal_emit(VIEW(it), "elm,state,new,pushed,deferred", "elm");
+ edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
return ECORE_CALLBACK_CANCEL;
}
if (!elm_widget_sub_object_add(parent, obj))
ERR("could not add %p as sub object of %p", obj, parent);
+ _elm_widget_orient_signal_emit(obj);
+
return obj;
}
evas_object_show(VIEW(it));
elm_widget_resize_object_set(obj, VIEW(it));
+ if (prev_it)
+ elm_widget_sub_object_add(obj, VIEW(prev_it));
evas_object_smart_member_add(sd->dummy_edje, obj);
if (prev_it)
evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
}
- edje_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
- edje_object_signal_emit(VIEW(it), "elm,state,new,pushed", "elm");
+ 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)));
- /* animate previous */
- edje_object_message_signal_process(VIEW(prev_it));
- if (prev_it->content)
- {
- prev_it->content_unfocusable =
- elm_widget_tree_unfocusable_get(prev_it->content);
- elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
- }
+ prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
+ elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE);
- /* animate new one */
- edje_object_message_signal_process(VIEW(it));
it->animator = ecore_animator_add(_push_transition_cb, it);
}
+ else
+ elm_object_focus_set(VIEW(it), EINA_TRUE);
sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it));
evas_object_raise(VIEW(it));
if (top_inserted)
{
elm_widget_resize_object_set(obj, VIEW(it));
+ elm_widget_sub_object_add(obj, VIEW(after));
evas_object_smart_member_add(sd->dummy_edje, obj);
evas_object_show(VIEW(it));
evas_object_hide(VIEW(after));
+ elm_object_focus_set(VIEW(it), EINA_TRUE);
}
/* access */
it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj);
if (!it) return NULL;
+ if (it->pop_cb) it->pop_cb(it->pop_data, (Elm_Object_Item *)it);
+
if (sd->preserve)
content = it->content;
evas_object_data_set(VIEW(it), "out_of_list", (void *)1);
- if (it->content)
- {
- it->content_unfocusable = elm_widget_tree_unfocusable_get(it->content);
- elm_widget_tree_unfocusable_set(it->content, EINA_TRUE);
- }
+ it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(it));
+ elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
if (sd->stack->last->prev)
prev_it = EINA_INLIST_CONTAINER_GET
if (_elm_config->access_mode) _access_focus_set(prev_it);
/* these 2 signals MUST take place simultaneously */
- edje_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
+ elm_object_signal_emit(VIEW(it), "elm,state,cur,popped", "elm");
evas_object_show(VIEW(prev_it));
- edje_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
+ elm_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped", "elm");
- edje_object_message_signal_process(VIEW(it));
- edje_object_message_signal_process(VIEW(prev_it));
+ edje_object_message_signal_process(elm_layout_edje_get(VIEW(it)));
+ edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
if (it->animator) ecore_animator_del(it->animator);
it->animator = ecore_animator_add(_pop_transition_cb, it);
EAPI void
elm_naviframe_item_promote(Elm_Object_Item *it)
{
+ Elm_Object_Item *prev_top;
Elm_Naviframe_Item *nit;
Elm_Naviframe_Item *prev_it;
nit = (Elm_Naviframe_Item *)it;
ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd);
- if (it == elm_naviframe_top_item_get(WIDGET(nit))) return;
+ prev_top = elm_naviframe_top_item_get(WIDGET(nit));
+ if (it == prev_top) return;
/* remember, last is 1st on the naviframe, push it to last pos. */
sd->stack = eina_inlist_demote(sd->stack, EINA_INLIST_GET(nit));
elm_widget_resize_object_set(WIDGET(it), VIEW(nit));
+ elm_widget_sub_object_add(WIDGET(it), VIEW(prev_top));
evas_object_smart_member_add(sd->dummy_edje, WIDGET(it));
/* this was the previous top one */
/* re-add as smart member */
evas_object_smart_member_add(VIEW(prev_it), WIDGET(it));
- if (prev_it->content)
- {
- prev_it->content_unfocusable =
- elm_widget_tree_unfocusable_get(prev_it->content);
- elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
- }
+ prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it));
+ elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE);
if (sd->freeze_events)
{
evas_object_freeze_events_set(VIEW(prev_it), EINA_TRUE);
}
- edje_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
+ elm_object_signal_emit(VIEW(prev_it), "elm,state,cur,pushed", "elm");
evas_object_show(VIEW(nit));
evas_object_raise(VIEW(nit));
- edje_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
+ elm_object_signal_emit(VIEW(nit), "elm,state,new,pushed", "elm");
- edje_object_message_signal_process(VIEW(prev_it));
- edje_object_message_signal_process(VIEW(nit));
+ edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it)));
+ edje_object_message_signal_process(elm_layout_edje_get(VIEW(nit)));
if (nit->animator) ecore_animator_del(nit->animator);
nit->animator = ecore_animator_add(_push_transition_cb, nit);
}
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;
+}
+
+EAPI void
elm_naviframe_prev_btn_auto_pushed_set(Evas_Object *obj,
Eina_Bool auto_pushed)
{