bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=54c524f7f6186bffcfc3059e8268fabf618a9797
commit 54c524f7f6186bffcfc3059e8268fabf618a9797 Author: Marcel Hollerbach <m...@marcel-hollerbach.de> Date: Tue Aug 6 19:55:40 2019 +0200 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....@samsung.com> Differential Revision: https://phab.enlightenment.org/D9515 --- src/examples/elementary/efl_ui_list_example_1.c | 6 +- src/lib/efl/Efl.h | 1 - src/lib/efl/interfaces/efl_interfaces_main.c | 2 +- src/lib/efl/interfaces/meson.build | 1 - src/lib/elementary/Efl_Ui.h | 2 + src/lib/elementary/efl_ui_collection.c | 6 +- src/lib/elementary/efl_ui_collection.eo | 16 +- src/lib/elementary/efl_ui_item.c | 2 + .../efl_ui_multi_selectable.eo | 11 +- src/lib/elementary/efl_ui_single_selectable.eo | 17 ++ src/lib/elementary/meson.build | 2 + .../elementary/efl_ui_test_collection_common.c | 208 +----------------- .../elementary/spec/efl_test_multi_selectable.c | 239 +++++++++++++++++++++ .../elementary/spec/efl_test_single_selectable.c | 56 +++++ src/tests/elementary/spec/efl_ui_spec_suite.h | 2 + src/tests/elementary/spec/meson.build | 2 + 16 files changed, 341 insertions(+), 232 deletions(-) diff --git a/src/examples/elementary/efl_ui_list_example_1.c b/src/examples/elementary/efl_ui_list_example_1.c index bb8aa4011f..efac2de088 100644 --- a/src/examples/elementary/efl_ui_list_example_1.c +++ b/src/examples/elementary/efl_ui_list_example_1.c @@ -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); diff --git a/src/lib/efl/Efl.h b/src/lib/efl/Efl.h index c1c934f6b0..a75b683b52 100644 --- a/src/lib/efl/Efl.h +++ b/src/lib/efl/Efl.h @@ -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" diff --git a/src/lib/efl/interfaces/efl_interfaces_main.c b/src/lib/efl/interfaces/efl_interfaces_main.c index 141a2904a7..47c143c120 100644 --- a/src/lib/efl/interfaces/efl_interfaces_main.c +++ b/src/lib/efl/interfaces/efl_interfaces_main.c @@ -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" diff --git a/src/lib/efl/interfaces/meson.build b/src/lib/efl/interfaces/meson.build index 7467882665..992915c69e 100644 --- a/src/lib/efl/interfaces/meson.build +++ b/src/lib/efl/interfaces/meson.build @@ -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', diff --git a/src/lib/elementary/Efl_Ui.h b/src/lib/elementary/Efl_Ui.h index a54ee690fa..9683ee74d0 100644 --- a/src/lib/elementary/Efl_Ui.h +++ b/src/lib/elementary/Efl_Ui.h @@ -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> diff --git a/src/lib/elementary/efl_ui_collection.c b/src/lib/elementary/efl_ui_collection.c index f1c5b568c3..1889067a5e 100644 --- a/src/lib/elementary/efl_ui_collection.c +++ b/src/lib/elementary/efl_ui_collection.c @@ -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); } diff --git a/src/lib/elementary/efl_ui_collection.eo b/src/lib/elementary/efl_ui_collection.eo index 679ef39062..a3e302e320 100644 --- a/src/lib/elementary/efl_ui_collection.eo +++ b/src/lib/elementary/efl_ui_collection.eo @@ -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.]] diff --git a/src/lib/elementary/efl_ui_item.c b/src/lib/elementary/efl_ui_item.c index 1ccc987759..6e88a84f10 100644 --- a/src/lib/elementary/efl_ui_item.c +++ b/src/lib/elementary/efl_ui_item.c @@ -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" diff --git a/src/lib/efl/interfaces/efl_ui_multi_selectable.eo b/src/lib/elementary/efl_ui_multi_selectable.eo similarity index 57% rename from src/lib/efl/interfaces/efl_ui_multi_selectable.eo rename to src/lib/elementary/efl_ui_multi_selectable.eo index 2f7eac4788..3957fe332e 100644 --- a/src/lib/efl/interfaces/efl_ui_multi_selectable.eo +++ b/src/lib/elementary/efl_ui_multi_selectable.eo @@ -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.]] + } } } diff --git a/src/lib/elementary/efl_ui_single_selectable.eo b/src/lib/elementary/efl_ui_single_selectable.eo new file mode 100644 index 0000000000..c2777ff106 --- /dev/null +++ b/src/lib/elementary/efl_ui_single_selectable.eo @@ -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.]] + } + } + } +} diff --git a/src/lib/elementary/meson.build b/src/lib/elementary/meson.build index e42223682b..06cad2bff3 100644 --- a/src/lib/elementary/meson.build +++ b/src/lib/elementary/meson.build @@ -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 diff --git a/src/tests/elementary/efl_ui_test_collection_common.c b/src/tests/elementary/efl_ui_test_collection_common.c index 746b86d938..7be3c7c532 100644 --- a/src/tests/elementary/efl_ui_test_collection_common.c +++ b/src/tests/elementary/efl_ui_test_collection_common.c @@ -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); } diff --git a/src/tests/elementary/spec/efl_test_multi_selectable.c b/src/tests/elementary/spec/efl_test_multi_selectable.c new file mode 100644 index 0000000000..38c9a9a59e --- /dev/null +++ b/src/tests/elementary/spec/efl_test_multi_selectable.c @@ -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); +} diff --git a/src/tests/elementary/spec/efl_test_single_selectable.c b/src/tests/elementary/spec/efl_test_single_selectable.c new file mode 100644 index 0000000000..c62f78afc4 --- /dev/null +++ b/src/tests/elementary/spec/efl_test_single_selectable.c @@ -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); +} diff --git a/src/tests/elementary/spec/efl_ui_spec_suite.h b/src/tests/elementary/spec/efl_ui_spec_suite.h index 01be37652d..187d87b0c0 100644 --- a/src/tests/elementary/spec/efl_ui_spec_suite.h +++ b/src/tests/elementary/spec/efl_ui_spec_suite.h @@ -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); diff --git a/src/tests/elementary/spec/meson.build b/src/tests/elementary/spec/meson.build index d23c3860dc..4de4037eb4 100644 --- a/src/tests/elementary/spec/meson.build +++ b/src/tests/elementary/spec/meson.build @@ -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([ --