introduce efl_ui_multi_selectable and efl_ui_single_selectable

right now they are just thin wrappers from what have been in
efl_ui_collection. This is just a first effort, the interfaces have to
be equipped with more and better API, more events, and tests.

ref T8057

Reviewed-by: SangHyeon Jade Lee <sh10233.lee@samsung.com>
Differential Revision: https://phab.enlightenment.org/D9515
This commit is contained in:
Marcel Hollerbach 2019-08-06 19:55:40 +02:00
parent f34f92bb29
commit 54c524f7f6
16 changed files with 341 additions and 232 deletions

View File

@ -30,7 +30,7 @@ _list_selected(void *data EINA_UNUSED, const Efl_Event *ev)
Eo *item = ev->info, *tmp;
printf("list item [%p:%d] is %s\n", item, efl_ui_item_index_get(item), (efl_ui_selectable_selected_get(item)? "selected" : "unselected"));
Eina_Iterator *selects = efl_ui_collection_selected_items_get(list);
Eina_Iterator *selects = efl_ui_selected_items_get(list);
EINA_ITERATOR_FOREACH(selects, tmp)
printf("selected [%p:%d] ", tmp, efl_ui_item_index_get(tmp));
@ -82,7 +82,7 @@ _anim_radio_changed(void *data, const Efl_Event *ev EINA_UNUSED)
static void
_scrl_btn_clicked(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
{
Efl_Ui_List_Default_Item *item = efl_ui_collection_last_selected_item_get(priv_d.list);
Efl_Ui_List_Default_Item *item = efl_ui_single_selectable_last_selected_get(priv_d.list);
printf("show [%d:%p] [%d]\n", efl_ui_item_index_get(item), item, priv_d.anim);
efl_ui_collection_item_scroll(priv_d.list, item, priv_d.anim);
}
@ -90,7 +90,7 @@ _scrl_btn_clicked(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
static void
_scrl_align_btn_clicked(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
{
Efl_Ui_List_Default_Item *item = efl_ui_collection_last_selected_item_get(priv_d.list);
Efl_Ui_List_Default_Item *item = efl_ui_single_selectable_last_selected_get(priv_d.list);
double align = efl_ui_range_value_get(priv_d.slider);
printf("show [%d:%p] [%.2lf], [%d]\n", efl_ui_item_index_get(item), item, align, priv_d.anim);
efl_ui_collection_item_scroll_align(priv_d.list, item, align, priv_d.anim);

View File

@ -109,7 +109,6 @@ typedef Efl_Gfx_Path_Command_Type Efl_Gfx_Path_Command;
#include "interfaces/efl_ui_scrollable_interactive.eo.h"
#include "interfaces/efl_ui_text_selectable.eo.h"
#include "interfaces/efl_ui_container_selectable.eo.h"
#include "interfaces/efl_ui_multi_selectable.eo.h"
#include "interfaces/efl_ui_zoom.eo.h"
#include "interfaces/efl_screen.eo.h"

View File

@ -77,7 +77,7 @@
#include "interfaces/efl_ui_scrollbar.eo.c"
#include "interfaces/efl_ui_container_selectable.eo.c"
#include "interfaces/efl_ui_text_selectable.eo.c"
#include "interfaces/efl_ui_multi_selectable.eo.c"
#include "interfaces/efl_ui_zoom.eo.c"
#include "interfaces/efl_cached_item.eo.c"

View File

@ -84,7 +84,6 @@ pub_eo_files = [
'efl_ui_property_bind.eo',
'efl_ui_factory.eo',
'efl_ui_factory_bind.eo',
'efl_ui_multi_selectable.eo',
'efl_screen.eo',
'efl_io_closer.eo',
'efl_io_positioner.eo',

View File

@ -260,6 +260,8 @@ typedef Eo Efl_Ui_Spotlight_Indicator;
# include <efl_ui_grid_default_item.eo.h>
# include <efl_ui_list_placeholder_item.eo.h>
# include <efl_ui_selectable.eo.h>
# include <efl_ui_single_selectable.eo.h>
# include <efl_ui_multi_selectable.eo.h>
# include <efl_ui_popup.eo.h>
# include <efl_ui_alert_popup.eo.h>
# include <efl_ui_scroll_alert_popup.eo.h>

View File

@ -251,14 +251,14 @@ _efl_ui_collection_item_scroll_align(Eo *obj, Efl_Ui_Collection_Data *pd, Efl_Ui
_item_scroll_internal(obj, pd, item, align, animation);
}
EOLIAN static Efl_Ui_Item*
_efl_ui_collection_last_selected_item_get(const Eo *obj EINA_UNUSED, Efl_Ui_Collection_Data *pd)
EOLIAN static Efl_Ui_Selectable*
_efl_ui_collection_efl_ui_single_selectable_last_selected_get(const Eo *obj EINA_UNUSED, Efl_Ui_Collection_Data *pd)
{
return eina_list_last_data_get(pd->selected);
}
EOLIAN static Eina_Iterator*
_efl_ui_collection_selected_items_get(Eo *obj EINA_UNUSED, Efl_Ui_Collection_Data *pd)
_efl_ui_collection_efl_ui_multi_selectable_selected_items_get(Eo *obj EINA_UNUSED, Efl_Ui_Collection_Data *pd)
{
return eina_list_iterator_new(pd->selected);
}

View File

@ -32,18 +32,6 @@ class @beta Efl.Ui.Collection extends Efl.Ui.Layout_Base implements
@in animation: bool; [[If you want to have an animation or not.]]
}
}
@property last_selected_item {
[[The item that was selected most recently.
]]
get {}
values {
item: Efl.Ui.Item; [[The latest selected item.]]
}
}
selected_items_get {
[[Get the selected items iterator. The iterator sequence will be decided by selection.]]
return: iterator<Efl.Ui.Item> @owned @no_unused; [[User has to free the iterator after usage.]]
}
@property position_manager {
[[Position manager object that handles placement of items.]]
values {
@ -73,10 +61,12 @@ class @beta Efl.Ui.Collection extends Efl.Ui.Layout_Base implements
Efl.Pack_Linear.pack_index_get;
Efl.Pack_Linear.pack_content_get;
Efl.Ui.Scrollable_Interactive.match_content { set; }
Efl.Ui.Multi_Selectable.select_mode {get; set;}
Efl.Ui.Widget_Focus_Manager.focus_manager_create;
Efl.Ui.Widget.focus_state_apply;
Efl.Ui.Focus.Manager.move;
Efl.Ui.Single_Selectable.last_selected { get; }
Efl.Ui.Multi_Selectable.selected_items_get;
Efl.Ui.Multi_Selectable.select_mode {get; set;}
}
events {
item,pressed : Efl.Ui.Item; [[A $press event occurred over an item.]]

View File

@ -273,3 +273,5 @@ _efl_ui_item_container_get(const Eo *obj EINA_UNUSED, Efl_Ui_Item_Data *pd)
#include "efl_ui_item.eo.c"
#include "efl_ui_selectable.eo.c"
#include "efl_ui_multi_selectable.eo.c"
#include "efl_ui_single_selectable.eo.c"

View File

@ -8,10 +8,11 @@ enum @beta Efl.Ui.Select_Mode {
none [[Last value of select mode. child cannot be selected at all.]]
}
interface @beta Efl.Ui.Multi_Selectable
interface @beta Efl.Ui.Multi_Selectable extends Efl.Ui.Single_Selectable
{
[[Efl UI Multi selectable interface.
The container have to control select property of multiple chidren.]]
[[Interface for getting access to a range of selected items.
The implementor of this interface provides the possibility to select multiple Selectables. (If not, only Efl.Ui.Single_Selectable should be implemented)]]
c_prefix: efl_ui;
methods
{
@ -23,5 +24,9 @@ interface @beta Efl.Ui.Multi_Selectable
mode: Efl.Ui.Select_Mode; [[Type of selection of children]]
}
}
selected_items_get {
[[Get the selected items in a iterator. The iterator sequence will be decided by selection.]]
return: iterator<Efl.Ui.Selectable> @owned @no_unused; [[User has to free the iterator after usage.]]
}
}
}

View File

@ -0,0 +1,17 @@
interface @beta Efl.Ui.Single_Selectable {
[[Interface for getting access to a single selected item in the implementor.
The implementor is free to allow a specific number of selectables beeing selected or not. This interface just covers always the latest selected selectable.
]]
methods {
@property last_selected {
[[The selectable that was selected most recently.]]
get {
}
values {
selectable : Efl.Ui.Selectable; [[The latest selected item.]]
}
}
}
}

View File

@ -183,6 +183,8 @@ pub_eo_files = [
'efl_ui_position_manager_list.eo',
'efl_ui_position_manager_grid.eo',
'efl_ui_selectable.eo',
'efl_ui_multi_selectable.eo',
'efl_ui_single_selectable.eo',
]
foreach eo_file : pub_eo_files

View File

@ -22,212 +22,6 @@ fill_items(const Efl_Class *klass)
}
}
static void
_set_pointer_quit(void *data, const Efl_Event *ev)
void efl_ui_test_item_container_common_add(TCase *tc EINA_UNUSED)
{
Efl_Ui_Item **b = data;
ck_assert_ptr_eq(*b, NULL);
*b = ev->info;
}
static void
_iterator_to_array(Eina_Array **arr, Eina_Iterator *iter)
{
Efl_Ui_Widget *widget;
*arr = eina_array_new(10);
EINA_ITERATOR_FOREACH(iter, widget)
{
eina_array_push(*arr, widget);
}
eina_iterator_free(iter);
}
EFL_START_TEST(test_multi_select)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_MULTI);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 0));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 2));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container, 0)), EINA_TRUE);
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container, 2)), EINA_TRUE);
ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), efl_pack_content_get(item_container, 2));
_iterator_to_array(&arr_selected, efl_ui_collection_selected_items_get(item_container));
ck_assert_int_eq(eina_array_count(arr_selected), 2);
ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), efl_pack_content_get(item_container, 0));
ck_assert_ptr_eq(eina_array_data_get(arr_selected, 1), efl_pack_content_get(item_container, 2));
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
EFL_START_TEST(test_multi_select_removal)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_MULTI);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), EINA_TRUE);
selected = NULL;//No need to ckeck the flag, we asserted in the tcase before
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_TRUE);
selected = NULL;//No need to ckeck the flag, we asserted in the tcase before
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), EINA_FALSE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, efl_pack_content_get(item_container, 0));
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_FALSE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, efl_pack_content_get(item_container, 2));
selected = NULL;
unselected = NULL;
ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), NULL);
_iterator_to_array(&arr_selected, efl_ui_collection_selected_items_get(item_container));
ck_assert_int_eq(eina_array_count(arr_selected), 0);
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
EFL_START_TEST(test_single_select)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_SINGLE);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 0));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 2));
ck_assert_ptr_eq(unselected, efl_pack_content_get(item_container, 0));
selected = NULL;
unselected = NULL;
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container, 0)), EINA_FALSE);
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container, 2)), EINA_TRUE);
ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), efl_pack_content_get(item_container, 2));
_iterator_to_array(&arr_selected, efl_ui_collection_selected_items_get(item_container));
ck_assert_int_eq(eina_array_count(arr_selected), 1);
ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), efl_pack_content_get(item_container, 2));
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
EFL_START_TEST(test_single_select_always)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_SINGLE_ALWAYS);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 0));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 2));
ck_assert_ptr_eq(unselected, efl_pack_content_get(item_container, 0));
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 2));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container, 0)), EINA_FALSE);
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container, 2)), EINA_TRUE);
ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), efl_pack_content_get(item_container, 2));
_iterator_to_array(&arr_selected, efl_ui_collection_selected_items_get(item_container));
ck_assert_int_eq(eina_array_count(arr_selected), 1);
ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), efl_pack_content_get(item_container, 2));
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
EFL_START_TEST(test_none_select)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_NONE);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), EINA_TRUE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container, 0)), EINA_FALSE);
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container, 2)), EINA_FALSE);
ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), NULL);
_iterator_to_array(&arr_selected, efl_ui_collection_selected_items_get(item_container));
ck_assert_int_eq(eina_array_count(arr_selected), 0);
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
void efl_ui_test_item_container_common_add(TCase *tc)
{
tcase_add_test(tc, test_multi_select);
tcase_add_test(tc, test_multi_select_removal);
tcase_add_test(tc, test_single_select);
tcase_add_test(tc, test_none_select);
tcase_add_test(tc, test_single_select_always);
}

View File

@ -0,0 +1,239 @@
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#include <Efl_Ui.h>
#include "efl_ui_spec_suite.h"
#include "suite_helpers.h"
/* spec-meta-start
{"test-interface":"Efl.Ui.Multi_Selectable",
"test-widgets": ["Efl.Ui.Grid", "Efl.Ui.List"],
"custom-mapping" : {
"Efl.Ui.Grid" : "EFL_UI_GRID_DEFAULT_ITEM_CLASS",
"Efl.Ui.List" : "EFL_UI_LIST_DEFAULT_ITEM_CLASS"
}
}
spec-meta-end */
static void
_setup(void)
{
Eo *c[3];
for (int i = 0; i < 3; ++i)
{
c[i] = create_test_widget();
efl_pack_end(widget, c[i]);
}
}
static void
_set_pointer_quit(void *data, const Efl_Event *ev)
{
Efl_Ui_Item **b = data;
ck_assert_ptr_eq(*b, NULL);
*b = ev->info;
}
static void
_iterator_to_array(Eina_Array **arr, Eina_Iterator *iter)
{
Efl_Ui_Widget *widget;
*arr = eina_array_new(10);
EINA_ITERATOR_FOREACH(iter, widget)
{
eina_array_push(*arr, widget);
}
eina_iterator_free(iter);
}
EFL_START_TEST(test_multi_select)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_MULTI);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 0));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 2));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 0)), EINA_TRUE);
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 2)), EINA_TRUE);
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), efl_pack_content_get(widget, 2));
_iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
ck_assert_int_eq(eina_array_count(arr_selected), 2);
ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), efl_pack_content_get(widget, 0));
ck_assert_ptr_eq(eina_array_data_get(arr_selected, 1), efl_pack_content_get(widget, 2));
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
EFL_START_TEST(test_multi_select_removal)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_MULTI);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
selected = NULL;//No need to ckeck the flag, we asserted in the tcase before
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
selected = NULL;//No need to ckeck the flag, we asserted in the tcase before
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_FALSE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, efl_pack_content_get(widget, 0));
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_FALSE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, efl_pack_content_get(widget, 2));
selected = NULL;
unselected = NULL;
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), NULL);
_iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
ck_assert_int_eq(eina_array_count(arr_selected), 0);
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
EFL_START_TEST(test_single_select)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_SINGLE);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 0));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 2));
ck_assert_ptr_eq(unselected, efl_pack_content_get(widget, 0));
selected = NULL;
unselected = NULL;
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 0)), EINA_FALSE);
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 2)), EINA_TRUE);
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), efl_pack_content_get(widget, 2));
_iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
ck_assert_int_eq(eina_array_count(arr_selected), 1);
ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), efl_pack_content_get(widget, 2));
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
EFL_START_TEST(test_single_select_always)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_SINGLE_ALWAYS);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 0));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 2));
ck_assert_ptr_eq(unselected, efl_pack_content_get(widget, 0));
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 2));
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 0)), EINA_FALSE);
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 2)), EINA_TRUE);
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), efl_pack_content_get(widget, 2));
_iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
ck_assert_int_eq(eina_array_count(arr_selected), 1);
ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), efl_pack_content_get(widget, 2));
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
EFL_START_TEST(test_none_select)
{
Efl_Ui_Item *selected = NULL;
Efl_Ui_Item *unselected = NULL;
Eina_Array *arr_selected;
efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_NONE);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
ck_assert_ptr_eq(selected, NULL);
ck_assert_ptr_eq(unselected, NULL);
selected = NULL;
unselected = NULL;
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 0)), EINA_FALSE);
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 2)), EINA_FALSE);
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), NULL);
_iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
ck_assert_int_eq(eina_array_count(arr_selected), 0);
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, _set_pointer_quit, &selected);
efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, _set_pointer_quit, &unselected);
}
EFL_END_TEST
void
efl_ui_multi_selectable_behavior_test(TCase *tc)
{
tcase_add_checked_fixture(tc, _setup, NULL);
tcase_add_test(tc, test_multi_select);
tcase_add_test(tc, test_multi_select_removal);
tcase_add_test(tc, test_single_select);
tcase_add_test(tc, test_none_select);
tcase_add_test(tc, test_single_select_always);
efl_ui_single_selectable_behavior_test(tc);
}

View File

@ -0,0 +1,56 @@
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#include <Efl_Ui.h>
#include "efl_ui_spec_suite.h"
#include "suite_helpers.h"
/* spec-meta-start
{"test-interface":"Efl.Ui.Single_Selectable",
"test-widgets": ["Efl.Ui.Grid", "Efl.Ui.List"],
"custom-mapping" : {
"Efl.Ui.Grid" : "EFL_UI_GRID_DEFAULT_ITEM_CLASS",
"Efl.Ui.List" : "EFL_UI_LIST_DEFAULT_ITEM_CLASS"
}
}
spec-meta-end */
static void
_setup(void)
{
Eo *c[3];
for (int i = 0; i < 3; ++i)
{
c[i] = create_test_widget();
if (efl_isa(c[i], EFL_UI_RADIO_CLASS))
efl_ui_radio_state_value_set(c[i], i+1);
efl_pack_end(widget, c[i]);
}
}
EFL_START_TEST(last_selectable_check)
{
Eo *c1 = efl_pack_content_get(widget, 0);
Eo *c2 = efl_pack_content_get(widget, 2);
efl_ui_selectable_selected_set(c1, EINA_TRUE);
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), c1);
efl_ui_selectable_selected_set(c2, EINA_TRUE);
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), c2);
efl_ui_selectable_selected_set(c1, EINA_FALSE);
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), c2);
efl_ui_selectable_selected_set(c2, EINA_FALSE);
ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), NULL);
}
EFL_END_TEST
void
efl_ui_single_selectable_behavior_test(TCase *tc)
{
tcase_add_checked_fixture(tc, _setup, NULL);
tcase_add_test(tc, last_selectable_check);
}

View File

@ -19,6 +19,8 @@ void efl_ui_format_behavior_test(TCase *tc);
void efl_ui_range_display_behavior_test(TCase *tc);
void efl_ui_range_display_interactive_behavior_test(TCase *tc);
void efl_ui_view_behavior_test(TCase *tc);
void efl_ui_single_selectable_behavior_test(TCase *tc);
void efl_ui_multi_selectable_behavior_test(TCase *tc);
void efl_test_container_content_equal(Efl_Ui_Widget **wid, unsigned int len);
void efl_test_container_expect_evt_content_added(Efl_Ui_Widget *widget, const Efl_Event_Description *ev, Eina_Bool *flag, void *event_data);

View File

@ -8,6 +8,8 @@ efl_ui_suite_behavior_test_files = files([
'efl_test_range_display.c',
'efl_test_range_interactive.c',
'efl_test_ui_view.c',
'efl_test_single_selectable.c',
'efl_test_multi_selectable.c',
])
efl_ui_suite_behavior_src = files([