add mechanism for getting the list of selected ilist items

SVN revision: 73143
This commit is contained in:
Mike Blumenkrantz 2012-07-02 09:56:47 +00:00
parent f5923a03e4
commit 0fe8872ab7
4 changed files with 34 additions and 30 deletions

View File

@ -10,6 +10,7 @@ struct _E_Smart_Data
Evas_Coord x, y, w, h, iw, ih;
Evas_Object *o_smart, *o_box;
Eina_List *items;
Eina_List *selected_items;
int selected;
unsigned char selector : 1;
unsigned char multi_select : 1;
@ -416,6 +417,7 @@ e_ilist_clear(Evas_Object *obj)
evas_object_del(si->o_base);
E_FREE(si);
}
if (sd->selected_items) sd->selected_items = eina_list_free(sd->selected_items);
e_ilist_thaw(obj);
sd->selected = -1;
}
@ -479,17 +481,15 @@ e_ilist_size_min_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
EAPI void
e_ilist_unselect(Evas_Object *obj)
{
Eina_List *l = NULL;
E_Ilist_Item *si = NULL;
API_ENTRY return;
if (!sd->items) return;
if (sd->selected < 0) return;
EINA_LIST_FOREACH(sd->items, l, si)
EINA_LIST_FREE(sd->selected_items, si)
{
if (!si) continue;
if (!si->selected) continue;
_item_unselect(si);
}
sd->selected = -1;
@ -499,7 +499,6 @@ EAPI void
e_ilist_selected_set(Evas_Object *obj, int n)
{
E_Ilist_Item *si = NULL;
Eina_List *l = NULL;
int i;
API_ENTRY return;
@ -510,13 +509,7 @@ e_ilist_selected_set(Evas_Object *obj, int n)
else if (n < 0)
n = 0;
EINA_LIST_FOREACH(sd->items, l, si)
{
if (!si) continue;
if ((!si->selected) || (si->header)) continue;
_item_unselect(si);
}
sd->selected = -1;
e_ilist_unselect(obj);
if (!(si = eina_list_nth(sd->items, n))) return;
/* NB: Remove this if headers ever become selectable */
@ -536,6 +529,13 @@ e_ilist_selected_set(Evas_Object *obj, int n)
}
}
EAPI const Eina_List *
e_ilist_selected_items_get(Evas_Object *obj)
{
API_ENTRY return NULL;
return sd->selected_items;
}
EAPI int
e_ilist_selected_get(Evas_Object *obj)
{
@ -547,17 +547,14 @@ e_ilist_selected_get(Evas_Object *obj)
if (!sd->items) return -1;
if (!sd->multi_select)
return sd->selected;
else
j = -1;
i = 0;
EINA_LIST_FOREACH(sd->selected_items, l, li)
{
j = -1;
i = 0;
EINA_LIST_FOREACH(sd->items, l, li)
{
if (li && li->selected) j = i;
i++;
}
return j;
if (li && li->selected) j = i;
i++;
}
return j;
}
EAPI const char *
@ -656,18 +653,9 @@ e_ilist_selected_geometry_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Ev
EAPI int
e_ilist_selected_count_get(Evas_Object *obj)
{
Eina_List *l = NULL;
E_Ilist_Item *si = NULL;
int count = 0;
API_ENTRY return 0;
if (!sd->items) return 0;
EINA_LIST_FOREACH(sd->items, l, si)
{
if (!si) continue;
if (si->selected) count++;
}
return count;
return eina_list_count(sd->selected_items);
}
EAPI void
@ -683,6 +671,7 @@ e_ilist_remove_num(Evas_Object *obj, int n)
si = eina_list_data_get(item);
if (!si) return;
sd->items = eina_list_remove_list(sd->items, item);
if (si->selected) sd->selected_items = eina_list_remove(sd->selected_items, si);
if (sd->selected == n) sd->selected = -1;
if (si->o_icon) evas_object_del(si->o_icon);
@ -1402,6 +1391,7 @@ static void
_item_select(E_Ilist_Item *si)
{
const char *selectraise;
E_Smart_Data *sd = si->sd;
si->selected = EINA_TRUE;
selectraise = edje_object_data_get(si->o_base, "selectraise");
if ((selectraise) && (!strcmp(selectraise, "on")))
@ -1414,12 +1404,14 @@ _item_select(E_Ilist_Item *si)
else
e_icon_selected_set(si->o_icon, EINA_TRUE);
}
sd->selected_items = eina_list_append(sd->selected_items, si);
}
static void
_item_unselect(E_Ilist_Item *si)
{
const char *stacking, *selectraise;
E_Smart_Data *sd = si->sd;
si->selected = EINA_FALSE;
edje_object_signal_emit(si->o_base, "e,state,unselected", "e");
if (si->o_icon)
@ -1436,5 +1428,6 @@ _item_unselect(E_Ilist_Item *si)
if ((stacking) && (!strcmp(stacking, "below")))
evas_object_lower(si->o_base);
}
sd->selected_items = eina_list_remove(sd->selected_items, si);
}

View File

@ -45,6 +45,7 @@ EAPI void *e_ilist_selected_data2_get (Evas_Object *obj);
EAPI Evas_Object *e_ilist_selected_icon_get (Evas_Object *obj);
EAPI Evas_Object *e_ilist_selected_end_get (Evas_Object *obj);
EAPI void e_ilist_selected_geometry_get (Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
EAPI const Eina_List *e_ilist_selected_items_get(Evas_Object *obj);
EAPI int e_ilist_selected_count_get (Evas_Object *obj);
EAPI void e_ilist_remove_num (Evas_Object *obj, int n);
EAPI const char *e_ilist_nth_label_get (Evas_Object *obj, int n);

View File

@ -778,6 +778,15 @@ e_widget_ilist_selected_set(Evas_Object *obj, int n)
*/
}
EAPI const Eina_List *
e_widget_ilist_selected_items_get(Evas_Object *obj)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
return e_ilist_selected_items_get(wd->o_ilist);
}
EAPI int
e_widget_ilist_selected_get(Evas_Object *obj)
{

View File

@ -42,6 +42,7 @@ EAPI const char *e_widget_ilist_item_value_get(const E_Ilist_Item *it);
EAPI void e_widget_ilist_nth_show(Evas_Object *obj, int n, int top);
EAPI void e_widget_ilist_selected_set(Evas_Object *obj, int n);
EAPI const Eina_List *e_widget_ilist_selected_items_get(Evas_Object *obj);
EAPI int e_widget_ilist_selected_get(Evas_Object *obj);
EAPI const char *e_widget_ilist_selected_label_get(Evas_Object *obj);
EAPI Evas_Object *e_widget_ilist_selected_icon_get(Evas_Object *obj);