summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaeun Choi <jaeun12.choi@samsung.com>2015-02-12 17:31:00 +0900
committerJaeun Choi <jaeun12.choi@samsung.com>2015-02-12 17:53:55 +0900
commitfdd222c78e73481125d881a912794f0364212ab4 (patch)
treeb67090eb3ce5d1c0f439ea0f6cf777ec22448568
parenta54da8aab46176525f9db88300af74e21553be91 (diff)
downloadelementary-fdd222c78e73481125d881a912794f0364212ab4.tar.gz
genlist: select the focused item on enter key input
there was no way to select an item with key input on ELM_ITEM_SELECT_ON_FOCUS_DISABLE mode. this patch enables select and multi select with enter/space key input. @fix
-rw-r--r--config/default/base.src.in54
-rw-r--r--config/mobile/base.src.in54
-rw-r--r--config/standard/base.src.in54
-rw-r--r--src/lib/elm_genlist.c49
4 files changed, 210 insertions, 1 deletions
diff --git a/config/default/base.src.in b/config/default/base.src.in
index 35f9984fa..78b387395 100644
--- a/config/default/base.src.in
+++ b/config/default/base.src.in
@@ -1243,18 +1243,72 @@ group "Elm_Config" struct {
value "key" string: "Return";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
value "key" string: "KP_Enter";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
value "key" string: "space";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "Return";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "KP_Enter";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "space";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
diff --git a/config/mobile/base.src.in b/config/mobile/base.src.in
index 4e4afd483..127c8a923 100644
--- a/config/mobile/base.src.in
+++ b/config/mobile/base.src.in
@@ -1247,18 +1247,72 @@ group "Elm_Config" struct {
value "key" string: "Return";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
value "key" string: "KP_Enter";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
value "key" string: "space";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "Return";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "KP_Enter";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "space";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
diff --git a/config/standard/base.src.in b/config/standard/base.src.in
index e55f879dd..b7f9a4b60 100644
--- a/config/standard/base.src.in
+++ b/config/standard/base.src.in
@@ -1244,18 +1244,72 @@ group "Elm_Config" struct {
value "key" string: "Return";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
value "key" string: "KP_Enter";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
value "key" string: "space";
value "action" string: "select";
value "params" string: "";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 0;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "Return";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "KP_Enter";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
+ }
+ group "Elm_Config_Binding_Key" struct {
+ value "context" int: 0;
+ value "key" string: "space";
+ value "action" string: "select";
+ value "params" string: "multi";
+ group "modifiers" list {
+ group "Elm_Config_Binding_Modifier" struct {
+ value "mod" string: "Control";
+ value "flag" uchar: 1;
+ }
+ }
}
group "Elm_Config_Binding_Key" struct {
value "context" int: 0;
diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c
index 13cb1ed9e..914468c7f 100644
--- a/src/lib/elm_genlist.c
+++ b/src/lib/elm_genlist.c
@@ -141,6 +141,8 @@ static const char SIGNAL_GROUP_MIDDLE[] = "elm,state,group,middle";
static void _item_unrealize(Elm_Gen_Item *it);
static Eina_Bool _item_select(Elm_Gen_Item *it);
+static void _item_unselect(Elm_Gen_Item *it);
+static void _item_highlight(Elm_Gen_Item *it);
static Eina_Bool _key_action_move(Evas_Object *obj, const char *params);
static Eina_Bool _key_action_select(Evas_Object *obj, const char *params);
static Eina_Bool _key_action_escape(Evas_Object *obj, const char *params);
@@ -2863,7 +2865,7 @@ _key_action_move(Evas_Object *obj, const char *params)
}
static Eina_Bool
-_key_action_select(Evas_Object *obj, const char *params EINA_UNUSED)
+_key_action_select(Evas_Object *obj, const char *params)
{
Elm_Object_Item *eo_it = NULL;
@@ -2871,9 +2873,53 @@ _key_action_select(Evas_Object *obj, const char *params EINA_UNUSED)
if (!eo_it) return EINA_TRUE;
elm_genlist_item_expanded_set(eo_it, !elm_genlist_item_expanded_get(eo_it));
ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
+ ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd);
+
+ if (sd->multi &&
+ ((sd->multi_select_mode != ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL) ||
+ (!strcmp(params, "multi"))))
+ {
+ if (!it->selected)
+ {
+ _item_highlight(it);
+ if (_item_select(it)) goto deleted;
+ }
+ else
+ _item_unselect(it);
+ }
+ else
+ {
+ if (!it->selected)
+ {
+ while (sd->selected)
+ {
+ Elm_Object_Item *eo_sel = sd->selected->data;
+ Elm_Gen_Item *sel = eo_data_scope_get(eo_sel, ELM_GENLIST_ITEM_CLASS);
+ _item_unselect(sel);
+ }
+ }
+ else
+ {
+ const Eina_List *l, *l_next;
+ Elm_Object_Item *eo_it2;
+
+ EINA_LIST_FOREACH_SAFE(sd->selected, l, l_next, eo_it2)
+ {
+ ELM_GENLIST_ITEM_DATA_GET(eo_it2, it2);
+ if (it2 != it)
+ _item_unselect(it2);
+ }
+ }
+ _item_highlight(it);
+ if (_item_select(it)) goto deleted;
+ }
+
evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, EO_OBJ(it));
return EINA_TRUE;
+
+deleted:
+ return EINA_FALSE;
}
static Eina_Bool
@@ -7670,6 +7716,7 @@ _elm_genlist_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUS
{ "move,first", "move", "first", _key_action_move},
{ "move,last", "move", "last", _key_action_move},
{ "select", "select", NULL, _key_action_select},
+ { "select,multi", "select", "multi", _key_action_select},
{ "escape", "escape", NULL, _key_action_escape},
{ NULL, NULL, NULL, NULL }
};