static const char SIGNAL_REORDER_MODE_UNSET[] = "elm,state,reorder,mode_unset";
//TIZEN ONLY
static const char SIGNAL_DEFAULT[] = "elm,state,default";
-static const char SIGNAL_FOCUSED[] = "elm,action,focus_highlight,show";
-static const char SIGNAL_UNFOCUSED[] = "elm,action,focus_highlight,hide";
+static const char SIGNAL_FOCUSED[] = "elm,state,focused";
+static const char SIGNAL_UNFOCUSED[] = "elm,state,unfocused";
static const char SIGNAL_BG_CHANGE[] = "bg_color_change";
static const char SIGNAL_ITEM_HIGHLIGHTED[] = "elm,state,highlighted";
static const char SIGNAL_ITEM_UNHIGHLIGHTED[] = "elm,state,unhighlighted";
_changed(GL_IT(it)->wsd->pan_obj);
}
-// FIXME: There are applications which do not use elm_win as top widget.
-// This is workaround! Those could not use focus!
-static Eina_Bool _focus_enabled(Evas_Object *obj)
-{
- if (!elm_widget_focus_get(obj)) return EINA_FALSE;
-
- const Evas_Object *win = elm_widget_top_get(obj);
- const char *type = evas_object_type_get(win);
-
- if (type && !strcmp(type, "elm_win"))
- {
- return elm_win_focus_highlight_enabled_get(win);
- }
- return EINA_FALSE;
-}
-
static Eina_List *
_item_content_realize(Elm_Gen_Item *it,
Evas_Object *target,
edje_object_signal_emit(VIEW(it), SIGNAL_FLIP_ENABLED, "elm");
}
- if (_focus_enabled(WIDGET(it)) && (it == sd->focused_item))
+ if (elm_widget_focus_highlight_enabled_get(WIDGET(it)) && (it == sd->focused_item))
{
edje_object_signal_emit(VIEW(it), SIGNAL_FOCUSED, "elm");
}
static void _item_focused(Elm_Gen_Item *it, Elm_Genlist_Item_Scrollto_Type type)
{
+ Evas_Coord x, y, w, h, sx, sy, sw, sh;
if (!it) return;
Elm_Genlist_Data *sd = GL_IT(it)->wsd;
- if (sd->focused_item != it) _item_unfocused(sd->focused_item);
-
- if (_focus_enabled(sd->obj))
+ evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
+ evas_object_geometry_get(sd->obj, &sx, &sy, &sw, &sh);
+ if ((x < sx) || (y < sy) || ((x + w) > (sx + sw)) || ((y + h) > (sy + sh)))
{
- Evas_Coord x, y, w, h, sx, sy, sw, sh;
- evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
- evas_object_geometry_get(sd->obj, &sx, &sy, &sw, &sh);
- if ((x < sx) || (y < sy) || ((x + w) > (sx + sw)) || ((y + h) > (sy + sh)))
- {
- elm_genlist_item_bring_in(EO_OBJ(it), type);
- }
+ elm_genlist_item_bring_in(EO_OBJ(it), type);
+ }
+ if (elm_widget_focus_highlight_enabled_get(sd->obj))
+ {
if (it->deco_all_view)
edje_object_signal_emit
(it->deco_all_view, SIGNAL_FOCUSED, "elm");
edje_object_signal_emit
(VIEW(it), SIGNAL_FOCUSED, "elm");
}
+
sd->focused_item = it;
evas_object_smart_callback_call(WIDGET(it), SIG_ITEM_FOCUSED, EO_OBJ(it));
if (_elm_atspi_enabled())
}
sd->last_selected_item = EO_OBJ(it);
_item_highlight(it);
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
// FIXME: after evas_object_raise, mouse event callbacks(ex, UP, DOWN)
// can be called again eventhough already received it.
{
it = ELM_GEN_ITEM_FROM_INLIST
(EINA_INLIST_GET(sd->focused_item)->next);
- _item_unfocused(sd->focused_item);
+ elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
}
else it = ELM_GEN_ITEM_FROM_INLIST(sd->items);
find_item = _item_focusable_search(&it, 1);
{
it = ELM_GEN_ITEM_FROM_INLIST
(EINA_INLIST_GET(sd->focused_item)->prev);
- _item_unfocused(sd->focused_item);
+ elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
}
else it = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
find_item = _item_focusable_search(&it, -1);
{
if (old_focused)
{
- sd->focused_item = old_focused;
if (old_content)
{
sd->focused_content = old_content;
elm_object_focus_set(old_content, EINA_TRUE);
}
else
- _item_focused(old_focused, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ {
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
+ elm_object_item_focus_set(EO_OBJ(old_focused), EINA_TRUE);
+ }
}
return EINA_FALSE;
}
else if (!find_item)
return EINA_TRUE;
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
}
else if (dir == FOCUS_DIR_LEFT || dir == FOCUS_DIR_RIGHT)
{
if (!sd->items) return EINA_FALSE;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
if (elm_widget_disabled_get(obj)) return EINA_FALSE;
- if (!_focus_enabled(obj)) return EINA_FALSE;
eo_do(obj,
elm_interface_scrollable_content_pos_get(&x, &y),
}
else
{
- _item_unfocused(sd->focused_item);
+ elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
_item_focus_next(sd, FOCUS_DIR_DOWN);
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
}
}
else
{
- _item_unfocused(sd->focused_item);
+ elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
sd->focused_item = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
_item_focus_next(sd, FOCUS_DIR_UP);
}
page_y += GL_IT(it)->minh;
}
if (_item_focusable_search(&it, -1))
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+ {
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
+ }
else if (!it)
{
_item_focusable_search(&it, 1);
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
}
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
page_y += GL_IT(it)->minh;
}
if (_item_focusable_search(&it, 1))
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+ {
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
+ }
else if(!it)
{
_item_focusable_search(&it, -1);
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
}
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_TOP;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
return EINA_TRUE;
Elm_Gen_Item *it = sd->focused_item;
found = _item_focusable_search(&it, 1);
if (found)
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ {
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
+ }
}
else elm_object_focus_set(sd->focused_content, EINA_TRUE);
}
}
EOLIAN static Eina_Bool
-_elm_genlist_elm_widget_on_focus(Eo *obj, Elm_Genlist_Data *sd, Elm_Object_Item *item)
+_elm_genlist_elm_widget_on_focus(Eo *obj, Elm_Genlist_Data *sd, Elm_Object_Item *item EINA_UNUSED)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
Eina_Bool int_ret = EINA_FALSE;
if (sd->select_on_focus_enabled) return EINA_TRUE;
if (elm_widget_focus_get(obj))
{
- if (_focus_enabled(obj))
+ if (sd->focused_item)
{
- if (sd->focused_item)
+ if (!sd->focused_content)
{
- if (!sd->focused_content)
+ Eina_Bool found = EINA_FALSE;
+ Elm_Gen_Item *it = sd->focused_item;
+ found = _item_focusable_search(&it, 1);
+ if (found)
{
- Eina_Bool found = EINA_FALSE;
- Elm_Gen_Item *it = sd->focused_item;
- found = _item_focusable_search(&it, 1);
- if (found)
- _item_focused(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
}
}
- else
- _item_focus_next(sd, FOCUS_DIR_DOWN);
}
+ else
+ _item_focus_next(sd, FOCUS_DIR_DOWN);
}
else
{
return EINA_TRUE;
}
+EOLIAN static void
+_elm_genlist_item_elm_widget_item_focus_set(Eo *eo_it, Elm_Gen_Item *it, Eina_Bool focused)
+{
+ Evas_Object *obj = WIDGET(it);
+ ELM_GENLIST_DATA_GET(obj, sd);
+
+ if (focused)
+ {
+ if (!elm_object_focus_get(obj))
+ elm_object_focus_set(obj, EINA_TRUE);
+
+ if (!elm_widget_focus_get(obj))
+ return;
+
+ if (it != sd->focused_item)
+ {
+ if (sd->focused_item)
+ _item_unfocused(sd->focused_item);
+ _item_focused(it, sd->focus_scrollto_type);
+
+ /* If item is not realized state, widget couldn't get focus_highlight data. */
+ if (it->realized)
+ {
+ _elm_widget_item_highlight_in_theme(obj, EO_OBJ(it));
+ _elm_widget_highlight_in_theme_update(obj);
+ _elm_widget_focus_highlight_start(obj);
+ }
+ }
+ }
+ else
+ {
+ if (!elm_widget_focus_get(obj))
+ return;
+ _item_unfocused(it);
+ }
+}
+
+EOLIAN static Eina_Bool
+_elm_genlist_item_elm_widget_item_focus_get(Eo *eo_it, Elm_Gen_Item *it)
+{
+ Evas_Object *obj = WIDGET(it);
+ ELM_GENLIST_DATA_GET(obj, sd);
+
+ if (it == sd->focused_item)
+ return EINA_TRUE;
+
+ return EINA_FALSE;
+}
+
+EOLIAN static Elm_Object_Item*
+_elm_genlist_elm_widget_focused_item_get(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd)
+{
+ return EO_OBJ(sd->focused_item);
+}
+
static Eina_Bool _elm_genlist_smart_focus_next_enable = EINA_FALSE;
EOLIAN static Eina_Bool
Eina_Bool ret;
_item_unselect(it);
- if (it == GL_IT(it)->wsd->focused_item) _item_unfocused(it);
+ if (it == GL_IT(it)->wsd->focused_item) elm_object_item_focus_set(EO_OBJ(it), EINA_FALSE);
if (GL_IT(it)->highlight_timer)
{
ecore_timer_del(GL_IT(it)->highlight_timer);
if (sd->mode_item) sd->mode_item = NULL;
if (it->selected) _item_unselect(it);
- if (it == sd->focused_item) _item_unfocused(it);
+ if (it == sd->focused_item) elm_object_item_focus_set(EO_OBJ(it), EINA_FALSE);
if (it == sd->key_down_item) sd->key_down_item = NULL;
if (it == sd->highlighted_item) sd->highlighted_item = NULL;
#ifndef TIZEN_PROFILE_WEARABLE
ELM_GENLIST_DATA_GET(obj, sd);
eina_hash_free_buckets(sd->size_caches);
- _item_unfocused(sd->focused_item);
+ elm_object_item_focus_set(EO_OBJ(sd->focused_item), EINA_FALSE);
if (sd->key_down_item) sd->key_down_item = NULL;
if (sd->mode_item) sd->mode_item = NULL;