static Eina_Bool _item_process(Elm_Genlist_Data *sd, Elm_Gen_Item *it);
static int _is_item_in_viewport(int viewport_y, int viewport_h, int obj_y, int obj_h);
static Eina_Bool _item_filtered_get(Elm_Gen_Item *it);
+static Eina_Bool _item_focusable_search(Elm_Gen_Item **it, int dir);
typedef struct _Size_Cache {
Evas_Coord minw;
if (!it) return;
Elm_Genlist_Data *sd = GL_IT(it)->wsd;
if (!sd->focused_item || it != sd->focused_item) return;
- Evas_Object *content = sd->focused_content;
- if (content)
- {
- elm_object_focus_set(sd->obj, EINA_FALSE);
- elm_object_focus_set(sd->obj, EINA_TRUE);
- sd->focused_content = NULL;
- }
edje_object_signal_emit
(VIEW(sd->focused_item), SIGNAL_UNFOCUSED, "elm");
if (sd->focused_item->deco_all_view)
}
sd->last_selected_item = EO_OBJ(it);
_item_highlight(it);
+
+ if (sd->focused_content)
+ {
+ elm_object_focus_set(sd->focused_content, EINA_FALSE);
+ sd->focused_content = NULL;
+ }
+
sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
next = eina_list_data_get(l);
if (next && (elm_widget_can_focus_get(next) &&
(evas_object_visible_get(next))))
- break;
+ break;
else if (next && (elm_widget_child_can_focus_get(next)))
{
- if ((dir == 1) && (elm_widget_focus_next_get
- (next, ELM_FOCUS_RIGHT, &next, &next_item)))
- break;
- else if ((dir == -1) && (elm_widget_focus_next_get
- (next, ELM_FOCUS_LEFT, &next, &next_item)))
- break;
+ if (elm_widget_focused_object_get(next))
+ break;
+ else
+ {
+ Evas_Object *child = next;
+ if ((dir == 1) &&
+ (elm_widget_focus_next_get(next, ELM_FOCUS_RIGHT, &child, &next_item)))
+ break;
+ else if ((dir == -1) &&
+ (elm_widget_focus_next_get(next, ELM_FOCUS_LEFT, &child, &next_item)))
+ break;
+ }
}
next = NULL;
if ((tmp->select_mode == ELM_OBJECT_SELECT_MODE_DEFAULT) ||
(tmp->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS))
{
+
+ if (GL_IT(tmp)->wsd->focused_content)
+ {
+ elm_object_focus_set(GL_IT(tmp)->wsd->focused_content, EINA_FALSE);
+ GL_IT(tmp)->wsd->focused_content = NULL;
+ }
*it = tmp;
return EINA_TRUE;
}
if ((tmp->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
+ (tmp->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
(tmp->flipped))
{
Evas_Object *obj = NULL;
if (obj)
{
- GL_IT(tmp)->wsd->focused_item = tmp;
+ if (GL_IT(tmp)->wsd->focused_content)
+ elm_object_focus_set(GL_IT(tmp)->wsd->focused_content, EINA_FALSE);
GL_IT(tmp)->wsd->focused_content = obj;
elm_object_focus_set(obj, EINA_TRUE);
*it = tmp;
- return EINA_FALSE;
+ return EINA_TRUE;
}
}
}
//search focused content is child of content
if (sd->focused_content)
l = eina_list_data_find_list(contents,
- elm_widget_parent_get
- (sd->focused_content));
+ sd->focused_content);
if (!l) l = eina_list_last(contents);
obj = _item_focusable_content_search(obj, l, -1);
}
//search focused content is child of content
if (sd->focused_content)
l = eina_list_data_find_list(contents,
- elm_widget_parent_get
- (sd->focused_content));
+ sd->focused_content);
if (!l) l = contents;
obj = _item_focusable_content_search(obj, l, 1);
}
(NULL, NULL, &v_w, &v_h));
if ((!strcmp(ev->keyname, "Left")) ||
+ ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)) ||
+ (!strcmp(ev->keyname, "Right")) ||
+ ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)) ||
+ (!strcmp(ev->keyname, "Up")) ||
+ ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)) ||
+ (!strcmp(ev->keyname, "Down")) ||
+ ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)) ||
+ (!strcmp(ev->keyname, "Home")) ||
+ ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)) ||
+ (!strcmp(ev->keyname, "End")) ||
+ ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)) ||
+ (!strcmp(ev->keyname, "Prior")) ||
+ ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)) ||
+ (!strcmp(ev->keyname, "Next")) ||
+ ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
+ {
+ if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
+ _elm_widget_focus_auto_show(obj);
+ }
+
+ if ((!strcmp(ev->keyname, "Left")) ||
((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
{
if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
}
}
+ else
+ elm_object_focus_set(sd->focused_content, EINA_TRUE);
+ }
+ else if (elm_widget_focused_object_get(obj) &&
+ (obj != elm_widget_focused_object_get(obj)))
+ {
+ Item_Block *itb, *nib;
+ Eina_List *l, *ll;
+ Evas_Object *content = NULL;
+ Elm_Gen_Item *it;
+ EINA_INLIST_FOREACH(sd->blocks, itb)
+ {
+ if (itb->realized)
+ {
+ EINA_LIST_FOREACH(itb->items, l, it)
+ {
+ EINA_LIST_FOREACH(it->content_objs, ll, content)
+ {
+ if (elm_widget_focused_object_get(content))
+ {
+ sd->focused_item = it;
+ sd->focused_content = content;
+ goto success;
+ }
+ }
+ }
+
+ nib = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(itb)->next, Item_Block);
+ if (!nib || !nib->realized) goto fail;
+ }
+ }
}
else
{
if (ELM_RECTS_INCLUDE(sx, sy, sw, sh, x, y, w, h))
{
elm_object_item_focus_set(EO_OBJ(tmp), EINA_TRUE);
- goto done;
+ goto success;
}
}
}
nib = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(itb)->next, Item_Block);
- if (!nib || !nib->realized) goto done;
+ if (!nib || !nib->realized) break;
}
}
-done:
if (!sd->focused_item) _item_focus_next(sd, FOCUS_DIR_DOWN);
}
}
edje_object_signal_emit
(sd->focused_item->deco_all_view, SIGNAL_UNFOCUSED, "elm");
}
- return EINA_FALSE;
}
+success:
return EINA_TRUE;
+
+fail:
+ return EINA_FALSE;
}
EOLIAN static void
if (eo_do_ret(EO_OBJ(it), ret, elm_wdg_item_disabled_get()) ||
(it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
- (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY))
+ (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE) ||
+ (sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
+ (sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
goto end;
if ((sd->reorder_mode) &&
((!wd->scroll_item_align_enable) || (it == sd->aligned_item)))
GL_IT(it)->highlight_timer =
ecore_timer_add(ITEM_SELECT_TIMER, _select_timer, it);
+ else if ((it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
+ (it->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
+ {
+ if (sd->focused_item != it)
+ {
+ Eina_Bool found = EINA_FALSE;
+ found = _item_focusable_search(&it, 1);
+ if (found)
+ {
+ sd->focus_scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN;
+ elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
+ }
+ }
+ }
}
}
else if (sd->reorder.it == it)