forked from enlightenment/efl
748 lines
25 KiB
C
748 lines
25 KiB
C
#ifdef HAVE_CONFIG_H
|
|
# include "elementary_config.h"
|
|
#endif
|
|
|
|
#include <Efl_Ui.h>
|
|
#include "efl_ui_suite.h"
|
|
#include "eo_internal.h"
|
|
|
|
EFL_CLASS_SIMPLE_CLASS(efl_ui_spotlight_manager, "Efl.Ui.Spotlight.Manager", EFL_UI_SPOTLIGHT_MANAGER_CLASS);
|
|
EFL_CLASS_SIMPLE_CLASS(efl_ui_spotlight_indicator, "Efl.Ui.Spotlight.Indicator", EFL_UI_SPOTLIGHT_INDICATOR_CLASS);
|
|
|
|
static Efl_Ui_Win *win;
|
|
static Efl_Ui_Spotlight_Container *container;
|
|
|
|
typedef struct {
|
|
struct {
|
|
int called;
|
|
double position;
|
|
} position_update;
|
|
struct {
|
|
int called;
|
|
Efl_Gfx_Entity *subobj;
|
|
int index;
|
|
Efl_Ui_Widget *current_page_at_call;
|
|
} content_del;
|
|
struct {
|
|
int called;
|
|
Efl_Gfx_Entity *subobj;
|
|
int index;
|
|
Efl_Ui_Widget *current_page_at_call;
|
|
} content_add;
|
|
struct {
|
|
int called;
|
|
Efl_Ui_Spotlight_Container *spotlight;
|
|
} spotlight;
|
|
} Indicator_Calls;
|
|
|
|
Indicator_Calls indicator_calls = { 0 };
|
|
|
|
static void
|
|
_indicator_content_del(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Efl_Gfx_Entity *subobj, int index EINA_UNUSED)
|
|
{
|
|
indicator_calls.content_del.called ++;
|
|
indicator_calls.content_del.subobj = subobj;
|
|
indicator_calls.content_del.index = index;
|
|
indicator_calls.content_del.current_page_at_call = efl_ui_spotlight_active_element_get(container);
|
|
}
|
|
|
|
static void
|
|
_indicator_content_add(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Efl_Gfx_Entity *subobj, int index EINA_UNUSED)
|
|
{
|
|
indicator_calls.content_add.called ++;
|
|
indicator_calls.content_add.subobj = subobj;
|
|
indicator_calls.content_add.index = index;
|
|
indicator_calls.content_add.current_page_at_call = efl_ui_spotlight_active_element_get(container);
|
|
}
|
|
|
|
static void
|
|
_indicator_position_update(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, double position)
|
|
{
|
|
indicator_calls.position_update.called ++;
|
|
indicator_calls.position_update.position = position;
|
|
}
|
|
|
|
static void
|
|
_indicator_bind(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Efl_Ui_Spotlight_Container *spotlight)
|
|
{
|
|
indicator_calls.spotlight.called++;
|
|
indicator_calls.spotlight.spotlight = spotlight;
|
|
}
|
|
|
|
EFL_OPS_DEFINE(indicator_tracker,
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_indicator_content_add, _indicator_content_add),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_indicator_content_del, _indicator_content_del),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_indicator_position_update, _indicator_position_update),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_indicator_bind, _indicator_bind),
|
|
);
|
|
|
|
static Efl_Ui_Spotlight_Manager*
|
|
_create_indicator(void)
|
|
{
|
|
Eo *obj;
|
|
|
|
obj = efl_new(efl_ui_spotlight_indicator_realized_class_get());
|
|
efl_object_override(obj, &indicator_tracker);
|
|
|
|
return obj;
|
|
}
|
|
|
|
typedef struct {
|
|
struct {
|
|
int called;
|
|
Efl_Gfx_Entity *subobj;
|
|
int index;
|
|
Efl_Ui_Widget *current_page_at_call;
|
|
} content_del;
|
|
struct {
|
|
int called;
|
|
Efl_Gfx_Entity *subobj;
|
|
int index;
|
|
Efl_Ui_Widget *current_page_at_call;
|
|
} content_add;
|
|
struct {
|
|
int called;
|
|
int from;
|
|
int to;
|
|
} request_switch;
|
|
struct {
|
|
int called;
|
|
Eina_Size2D size;
|
|
} page_size;
|
|
struct {
|
|
int called;
|
|
Efl_Ui_Spotlight_Container *spotlight;
|
|
Efl_Canvas_Group *group;
|
|
} spotlight;
|
|
struct {
|
|
int called;
|
|
Eina_Bool value;
|
|
} animation;
|
|
double last_position;
|
|
} Transition_Calls;
|
|
|
|
Transition_Calls transition_calls = { 0 };
|
|
|
|
static void
|
|
_emit_pos(Eo *obj, double d)
|
|
{
|
|
printf("EMITTING %f %f\n", d, transition_calls.last_position);
|
|
if (EINA_DBL_EQ(d, transition_calls.last_position)) return;
|
|
|
|
efl_event_callback_call(obj, EFL_UI_SPOTLIGHT_MANAGER_EVENT_POS_UPDATE, &d);
|
|
transition_calls.last_position = d;
|
|
}
|
|
|
|
static void
|
|
_transition_content_add(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Efl_Gfx_Entity *subobj, int index EINA_UNUSED)
|
|
{
|
|
transition_calls.content_add.called ++;
|
|
transition_calls.content_add.subobj = subobj;
|
|
transition_calls.content_add.index = index;
|
|
transition_calls.content_add.current_page_at_call = efl_ui_spotlight_active_element_get(container);
|
|
|
|
int i = efl_pack_index_get(container, efl_ui_spotlight_active_element_get(container));
|
|
if (i != -1)
|
|
_emit_pos(obj, i);
|
|
}
|
|
|
|
static void
|
|
_transition_content_del(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Efl_Gfx_Entity *subobj, int index EINA_UNUSED)
|
|
{
|
|
transition_calls.content_del.called ++;
|
|
transition_calls.content_del.subobj = subobj;
|
|
transition_calls.content_del.index = index;
|
|
transition_calls.content_del.current_page_at_call = efl_ui_spotlight_active_element_get(container);
|
|
|
|
int i = efl_pack_index_get(container, efl_ui_spotlight_active_element_get(container));
|
|
if (i != -1)
|
|
_emit_pos(obj, i);
|
|
}
|
|
|
|
static void
|
|
_transition_request_switch(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, int from, int to)
|
|
{
|
|
transition_calls.request_switch.called++;
|
|
transition_calls.request_switch.from = from;
|
|
transition_calls.request_switch.to = to;
|
|
|
|
_emit_pos(obj, to);
|
|
}
|
|
|
|
static void
|
|
_transition_page_size_set(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Eina_Size2D size)
|
|
{
|
|
transition_calls.page_size.called++;
|
|
transition_calls.page_size.size = size;
|
|
}
|
|
|
|
static void
|
|
_transition_bind(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Efl_Ui_Spotlight_Container *spotlight, Efl_Canvas_Group *group)
|
|
{
|
|
transition_calls.spotlight.called++;
|
|
transition_calls.spotlight.spotlight = spotlight;
|
|
transition_calls.spotlight.group = group;
|
|
}
|
|
|
|
static void
|
|
_transition_animation_set(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, Eina_Bool animation)
|
|
{
|
|
transition_calls.animation.called++;
|
|
transition_calls.animation.value = animation;
|
|
}
|
|
|
|
static Eina_Bool
|
|
_transition_animation_get(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED)
|
|
{
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
EFL_OPS_DEFINE(transition_tracker,
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_manager_animated_transition_set, _transition_animation_set),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_manager_animated_transition_get, _transition_animation_get),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_manager_content_add, _transition_content_add),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_manager_content_del, _transition_content_del),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_manager_switch_to, _transition_request_switch),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_manager_size_set, _transition_page_size_set),
|
|
EFL_OBJECT_OP_FUNC(efl_ui_spotlight_manager_bind, _transition_bind),
|
|
);
|
|
|
|
static Efl_Ui_Spotlight_Manager*
|
|
_create_transition(void)
|
|
{
|
|
Eo *obj;
|
|
|
|
obj = efl_new(efl_ui_spotlight_manager_realized_class_get());
|
|
efl_object_override(obj, &transition_tracker);
|
|
|
|
return obj;
|
|
}
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_init)
|
|
{
|
|
ck_assert_ptr_ne(container, NULL);
|
|
ck_assert_ptr_ne(win, NULL);
|
|
ck_assert_ptr_eq(efl_ui_spotlight_indicator_get(container), NULL);
|
|
ck_assert_ptr_eq(efl_ui_spotlight_manager_get(container), NULL);
|
|
Eina_Size2D s = efl_ui_spotlight_size_get(container);
|
|
ck_assert_int_eq(s.w, 0); //FIXME
|
|
ck_assert_int_eq(s.h, 0); //FIXME
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_active_index)
|
|
{
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_pack(container, w);
|
|
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), w);
|
|
EXPECT_ERROR_START;
|
|
efl_ui_spotlight_active_element_set(container, 0x0);
|
|
EXPECT_ERROR_END;
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), w);
|
|
EXPECT_ERROR_START;
|
|
efl_ui_spotlight_active_element_set(container, (void*)0xAFFE);
|
|
EXPECT_ERROR_END;
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), w);
|
|
EXPECT_ERROR_START;
|
|
efl_ui_spotlight_active_element_set(container, efl_main_loop_get());
|
|
EXPECT_ERROR_END;
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), w);
|
|
|
|
efl_del(w);
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
static void
|
|
_verify_transition_calls(int number_of_animation_calls, Eina_Bool animation_value)
|
|
{
|
|
Efl_Ui_Widget *w, *w1, *w2;
|
|
|
|
w = efl_add(WIDGET_CLASS, win);
|
|
w1 = efl_add(WIDGET_CLASS, win);
|
|
w2 = efl_add(WIDGET_CLASS, win);
|
|
|
|
transition_calls.last_position = -2.0;
|
|
ck_assert_int_eq(transition_calls.animation.called, number_of_animation_calls);
|
|
ck_assert_int_eq(transition_calls.animation.value, animation_value);
|
|
ck_assert_int_eq(transition_calls.spotlight.called, 1);
|
|
ck_assert_ptr_eq(transition_calls.spotlight.spotlight, container);
|
|
//We cannot verify group
|
|
ck_assert_int_eq(transition_calls.page_size.called, 1);
|
|
ck_assert_int_eq(transition_calls.page_size.size.w, 0); //FIXME
|
|
ck_assert_int_eq(transition_calls.page_size.size.h, 0); //FIXME
|
|
ck_assert_int_eq(transition_calls.request_switch.called, 0);
|
|
ck_assert_int_eq(transition_calls.content_add.called, 0);
|
|
ck_assert_int_eq(transition_calls.content_del.called, 0);
|
|
transition_calls.spotlight.called = 0;
|
|
transition_calls.page_size.called = 0;
|
|
|
|
//must update content, and request a switch from -1 to 1
|
|
efl_pack(container, w);
|
|
ck_assert_int_eq(transition_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(transition_calls.page_size.called, 0);
|
|
ck_assert_int_eq(transition_calls.request_switch.called, 1);
|
|
ck_assert_int_eq(transition_calls.request_switch.from, -1);
|
|
ck_assert_int_eq(transition_calls.request_switch.to, 0);
|
|
ck_assert_int_eq(transition_calls.content_add.called, 1);
|
|
ck_assert_int_eq(transition_calls.content_add.index, 0);
|
|
ck_assert_ptr_eq(transition_calls.content_add.subobj, w);
|
|
ck_assert_ptr_eq(transition_calls.content_add.current_page_at_call, NULL);
|
|
ck_assert_int_eq(transition_calls.content_del.called, 0);
|
|
transition_calls.content_add.called = 0;
|
|
transition_calls.request_switch.called = 0;
|
|
|
|
//this must update content and a updated current page, but no other call
|
|
efl_pack_begin(container, w1);
|
|
ck_assert_int_eq(transition_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(transition_calls.page_size.called, 0);
|
|
ck_assert_int_eq(transition_calls.request_switch.called, 0);
|
|
ck_assert_int_eq(transition_calls.content_add.called, 1);
|
|
ck_assert_int_eq(transition_calls.content_add.index, 0);
|
|
ck_assert_ptr_eq(transition_calls.content_add.subobj, w1);
|
|
ck_assert_ptr_eq(transition_calls.content_add.current_page_at_call, w);
|
|
ck_assert_int_eq(transition_calls.content_del.called, 0);
|
|
transition_calls.content_add.called = 0;
|
|
transition_calls.request_switch.called = 0;
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), w);
|
|
|
|
//new object, must update the content and a not update current page
|
|
efl_pack_end(container, w2);
|
|
ck_assert_int_eq(transition_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(transition_calls.page_size.called, 0);
|
|
ck_assert_int_eq(transition_calls.request_switch.called, 0);
|
|
ck_assert_int_eq(transition_calls.content_add.called, 1);
|
|
ck_assert_int_eq(transition_calls.content_add.index, 2);
|
|
ck_assert_ptr_eq(transition_calls.content_add.subobj, w2);
|
|
ck_assert_ptr_eq(transition_calls.content_add.current_page_at_call, w);
|
|
ck_assert_int_eq(transition_calls.content_del.called, 0);
|
|
transition_calls.content_add.called = 0;
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), w);
|
|
|
|
//page change must result in a call to request a switch
|
|
efl_ui_spotlight_active_element_set(container, w2);
|
|
ck_assert_int_eq(transition_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(transition_calls.page_size.called, 0);
|
|
ck_assert_int_eq(transition_calls.request_switch.called, 1);
|
|
ck_assert_int_eq(transition_calls.request_switch.from, 1);
|
|
ck_assert_int_eq(transition_calls.request_switch.to, 2);
|
|
ck_assert_int_eq(transition_calls.content_add.called, 0);
|
|
ck_assert_int_eq(transition_calls.content_del.called, 0);
|
|
transition_calls.request_switch.called = 0;
|
|
|
|
//deletion of object must result in a content update
|
|
efl_del(w);
|
|
ck_assert_int_eq(transition_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(transition_calls.page_size.called, 0);
|
|
ck_assert_int_eq(transition_calls.request_switch.called, 0);
|
|
ck_assert_int_eq(transition_calls.content_add.called, 0);
|
|
ck_assert_int_eq(transition_calls.content_del.called, 1);
|
|
ck_assert_int_eq(transition_calls.content_del.index, 1);
|
|
ck_assert_ptr_eq(transition_calls.content_del.subobj, w);
|
|
ck_assert_ptr_eq(transition_calls.content_del.current_page_at_call, w2);
|
|
transition_calls.content_del.called = 0;
|
|
}
|
|
|
|
EFL_START_TEST (efl_ui_smart_transition_calls)
|
|
{
|
|
Efl_Ui_Spotlight_Manager*t = _create_transition();
|
|
efl_ui_spotlight_manager_set(container, t);
|
|
|
|
_verify_transition_calls(2, EINA_TRUE);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_smart_transition_calls_no_animation)
|
|
{
|
|
Efl_Ui_Spotlight_Manager*t = _create_transition();
|
|
efl_ui_spotlight_manager_set(container, t);
|
|
efl_ui_spotlight_animated_transition_set(container, EINA_FALSE);
|
|
|
|
_verify_transition_calls(3, EINA_FALSE);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
|
|
EFL_START_TEST (efl_ui_smart_transition_lifetime)
|
|
{
|
|
Efl_Ui_Spotlight_Manager*t, *t1;
|
|
|
|
t = _create_transition();
|
|
efl_wref_add(t, &t);
|
|
t1 = _create_transition();
|
|
|
|
efl_ui_spotlight_manager_set(container, t);
|
|
efl_ui_spotlight_manager_set(container, t1);
|
|
ck_assert_ptr_eq(t, NULL);
|
|
ck_assert_ptr_ne(t1, NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
static void
|
|
_verify_indicator_calls(void)
|
|
{
|
|
Efl_Ui_Widget *w, *w1, *w2;
|
|
|
|
w = efl_add(WIDGET_CLASS, win);
|
|
w1 = efl_add(WIDGET_CLASS, win);
|
|
w2 = efl_add(WIDGET_CLASS, win);
|
|
|
|
ck_assert_int_eq(indicator_calls.spotlight.called, 1);
|
|
ck_assert_ptr_eq(indicator_calls.spotlight.spotlight, container);
|
|
ck_assert_int_eq(indicator_calls.content_add.called, 0);
|
|
ck_assert_int_eq(indicator_calls.content_del.called, 0);
|
|
ck_assert_int_eq(indicator_calls.position_update.called, 0);
|
|
indicator_calls.spotlight.called = 0;
|
|
|
|
efl_pack(container, w);
|
|
ck_assert_int_eq(indicator_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(indicator_calls.content_add.called, 1);
|
|
ck_assert_int_eq(indicator_calls.content_add.index, 0);
|
|
ck_assert_ptr_eq(indicator_calls.content_add.subobj, w);
|
|
ck_assert_int_eq(indicator_calls.content_del.called, 0);
|
|
ck_assert_int_eq(indicator_calls.position_update.called, 1);
|
|
ck_assert(EINA_DBL_EQ(indicator_calls.position_update.position, 0.0));
|
|
indicator_calls.content_add.called = 0;
|
|
indicator_calls.position_update.called = 0;
|
|
|
|
efl_pack_begin(container, w1);
|
|
ck_assert_int_eq(indicator_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(indicator_calls.content_add.called, 1);
|
|
ck_assert_int_eq(indicator_calls.content_add.index, 0);
|
|
ck_assert_ptr_eq(indicator_calls.content_add.subobj, w1);
|
|
ck_assert_int_eq(indicator_calls.content_del.called, 0);
|
|
ck_assert_int_eq(indicator_calls.position_update.called, 1);
|
|
ck_assert(EINA_DBL_EQ(indicator_calls.position_update.position, 1.0));
|
|
indicator_calls.content_add.called = 0;
|
|
indicator_calls.position_update.called = 0;
|
|
|
|
efl_pack_end(container, w2);
|
|
ck_assert_int_eq(indicator_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(indicator_calls.content_add.called, 1);
|
|
ck_assert_int_eq(indicator_calls.content_add.index, 2);
|
|
ck_assert_ptr_eq(indicator_calls.content_add.subobj, w2);
|
|
ck_assert_int_eq(indicator_calls.content_del.called, 0);
|
|
ck_assert_int_eq(indicator_calls.position_update.called, 0);
|
|
indicator_calls.content_add.called = 0;
|
|
indicator_calls.position_update.called = 0;
|
|
|
|
efl_del(w1);
|
|
ck_assert_int_eq(indicator_calls.spotlight.called, 0);
|
|
ck_assert_int_eq(indicator_calls.content_add.called, 0);
|
|
ck_assert_int_eq(indicator_calls.content_del.called, 1);
|
|
ck_assert_int_eq(indicator_calls.content_del.index, 0);
|
|
ck_assert_ptr_eq(indicator_calls.content_del.subobj, w1);
|
|
ck_assert_int_eq(indicator_calls.position_update.called, 1);
|
|
ck_assert(EINA_DBL_EQ(indicator_calls.position_update.position, 0.0));
|
|
indicator_calls.content_del.called = 0;
|
|
indicator_calls.position_update.called = 0;
|
|
}
|
|
|
|
EFL_START_TEST (efl_ui_smart_indicator_calls)
|
|
{
|
|
Efl_Ui_Spotlight_Manager*i = _create_indicator();
|
|
efl_ui_spotlight_indicator_set(container, i);
|
|
_verify_indicator_calls();
|
|
ck_assert_ptr_ne(i, NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_smart_indicator_transition_calls)
|
|
{
|
|
Efl_Ui_Spotlight_Manager *i = _create_indicator();
|
|
Efl_Ui_Spotlight_Manager *t = _create_transition();
|
|
|
|
transition_calls.last_position = -2.0;
|
|
efl_ui_spotlight_indicator_set(container, i);
|
|
efl_ui_spotlight_manager_set(container, t);
|
|
_verify_indicator_calls();
|
|
ck_assert_ptr_ne(i, NULL);
|
|
ck_assert_ptr_ne(t, NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
Efl_Ui_Spotlight_Transition_Event start;
|
|
Efl_Ui_Spotlight_Transition_Event end;
|
|
|
|
static void
|
|
_start(void *data EINA_UNUSED, const Efl_Event *ev)
|
|
{
|
|
Efl_Ui_Spotlight_Transition_Event *e = ev->info;
|
|
|
|
memcpy(&start, e, sizeof(Efl_Ui_Spotlight_Transition_Event));
|
|
}
|
|
|
|
static void
|
|
_end(void *data EINA_UNUSED, const Efl_Event *ev)
|
|
{
|
|
Efl_Ui_Spotlight_Transition_Event *e = ev->info;
|
|
|
|
memcpy(&end, e, sizeof(Efl_Ui_Spotlight_Transition_Event));
|
|
}
|
|
|
|
#define EV_RESET \
|
|
start.from = -8; \
|
|
start.to = -8; \
|
|
end.from = -8; \
|
|
end.to = -8;
|
|
|
|
static void
|
|
_verify_transition_start_end_events(void)
|
|
{
|
|
Efl_Ui_Widget *w, *w1, *w2;
|
|
|
|
w = efl_add(WIDGET_CLASS, win);
|
|
w1 = efl_add(WIDGET_CLASS, win);
|
|
w2 = efl_add(WIDGET_CLASS, win);
|
|
|
|
efl_event_callback_add(container, EFL_UI_SPOTLIGHT_EVENT_TRANSITION_START, _start, NULL);
|
|
efl_event_callback_add(container, EFL_UI_SPOTLIGHT_EVENT_TRANSITION_END, _end, NULL);
|
|
|
|
EV_RESET
|
|
efl_pack_end(container, w);
|
|
ck_assert_int_eq(start.to, 0);
|
|
ck_assert_int_eq(end.to, 0);
|
|
ck_assert_int_eq(start.from, -1);
|
|
ck_assert_int_eq(end.from, -1);
|
|
|
|
EV_RESET
|
|
efl_pack_begin(container, w1);
|
|
efl_pack_end(container, w2);
|
|
ck_assert_int_eq(start.to, -8);
|
|
ck_assert_int_eq(end.to, -8);
|
|
ck_assert_int_eq(start.from, -8);
|
|
ck_assert_int_eq(end.from, -8);
|
|
|
|
EV_RESET
|
|
efl_ui_spotlight_active_element_set(container, w2);
|
|
ck_assert_int_eq(start.to, 2);
|
|
ck_assert_int_eq(end.to, 2);
|
|
ck_assert_int_eq(start.from, 1);
|
|
ck_assert_int_eq(end.from, 1);
|
|
}
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_manager_start_end)
|
|
{
|
|
transition_calls.last_position = -2.0;
|
|
|
|
_verify_transition_start_end_events();
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_test_push1)
|
|
{
|
|
for (int i = 0; i < 5; ++i)
|
|
{
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_pack_end(container, w);
|
|
}
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_ui_spotlight_push(container, w);
|
|
ck_assert_int_eq(efl_pack_index_get(container, w), 1);
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), efl_pack_content_get(container, 1));
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_test_push2)
|
|
{
|
|
for (int i = 0; i < 5; ++i)
|
|
{
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_pack_end(container, w);
|
|
if (i == 3)
|
|
efl_ui_spotlight_active_element_set(container, w);
|
|
}
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_ui_spotlight_push(container, w);
|
|
ck_assert_int_eq(efl_pack_index_get(container, w), 4);
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), w);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
static Eina_Value
|
|
_then_cb(void *data, const Eina_Value v, const Eina_Future *dead_future EINA_UNUSED)
|
|
{
|
|
Eo **value = data;
|
|
|
|
*value = eina_value_object_get(&v);
|
|
|
|
return EINA_VALUE_EMPTY;
|
|
}
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_test_pop1)
|
|
{
|
|
Eo *called;
|
|
for (int i = 0; i < 5; ++i)
|
|
{
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_pack_end(container, w);
|
|
}
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_ui_spotlight_push(container, w);
|
|
Eina_Future *f = efl_ui_spotlight_pop(container, EINA_FALSE);
|
|
eina_future_then(f, _then_cb, &called);
|
|
for (int i = 0; i < 10; ++i)
|
|
{
|
|
efl_loop_iterate(efl_provider_find(container, EFL_LOOP_CLASS));
|
|
}
|
|
ck_assert_ptr_eq(efl_ui_widget_parent_get(w), win);
|
|
ck_assert_int_eq(efl_content_count(container), 5);
|
|
ck_assert_ptr_eq(called, w);
|
|
ck_assert_ptr_ne(f, NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_test_pop2)
|
|
{
|
|
for (int i = 0; i < 5; ++i)
|
|
{
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_pack_end(container, w);
|
|
}
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_ui_spotlight_push(container, w);
|
|
Eina_Future *f = efl_ui_spotlight_pop(container, EINA_TRUE);
|
|
for (int i = 0; i < 10; ++i)
|
|
{
|
|
efl_loop_iterate(efl_provider_find(container, EFL_LOOP_CLASS));
|
|
}
|
|
ck_assert_int_eq(efl_ref_count(w), 0);
|
|
ck_assert_int_eq(efl_content_count(container), 5);
|
|
ck_assert_ptr_ne(f, NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_test_pop3)
|
|
{
|
|
for (int i = 0; i < 5; ++i)
|
|
{
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_pack_end(container, w);
|
|
if (i == 3)
|
|
efl_ui_spotlight_active_element_set(container, w);
|
|
}
|
|
Efl_Ui_Widget *w = efl_add(WIDGET_CLASS, win);
|
|
efl_ui_spotlight_push(container, w);
|
|
Eina_Future *f = efl_ui_spotlight_pop(container, EINA_TRUE);
|
|
for (int i = 0; i < 10; ++i)
|
|
{
|
|
efl_loop_iterate(efl_provider_find(container, EFL_LOOP_CLASS));
|
|
}
|
|
ck_assert_ptr_eq(efl_ui_spotlight_active_element_get(container), efl_pack_content_get(container, 3));
|
|
ck_assert_int_eq(efl_ref_count(w), 0);
|
|
ck_assert_int_eq(efl_content_count(container), 5);
|
|
ck_assert_ptr_ne(f, NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_animated_transition)
|
|
{
|
|
//this checks animation handing with the plain manager, there is no animation that will be played, but the flag should be preserved
|
|
ck_assert_int_eq(efl_ui_spotlight_animated_transition_get(container), EINA_TRUE);
|
|
efl_ui_spotlight_animated_transition_set(container, EINA_FALSE);
|
|
ck_assert_int_eq(efl_ui_spotlight_manager_animated_transition_get(efl_ui_spotlight_manager_get(container)), EINA_FALSE);
|
|
|
|
//now check with a real spotlight manager
|
|
efl_ui_spotlight_manager_set(container, efl_new(EFL_UI_SPOTLIGHT_FADE_MANAGER_CLASS));
|
|
efl_ui_spotlight_animated_transition_set(container, EINA_TRUE);
|
|
ck_assert_int_eq(efl_ui_spotlight_animated_transition_get(container), EINA_TRUE);
|
|
ck_assert_int_eq(efl_ui_spotlight_manager_animated_transition_get(efl_ui_spotlight_manager_get(container)), EINA_TRUE);
|
|
|
|
efl_ui_spotlight_animated_transition_set(container, EINA_FALSE);
|
|
ck_assert_int_eq(efl_ui_spotlight_animated_transition_get(container), EINA_FALSE);
|
|
ck_assert_int_eq(efl_ui_spotlight_manager_animated_transition_get(efl_ui_spotlight_manager_get(container)), EINA_FALSE);
|
|
|
|
Eo *manager2 = efl_new(EFL_UI_SPOTLIGHT_FADE_MANAGER_CLASS);
|
|
Eina_Bool animated_transition_manager;
|
|
efl_add(EFL_UI_SPOTLIGHT_CONTAINER_CLASS, win,
|
|
efl_ui_spotlight_manager_set(efl_added, manager2),
|
|
efl_ui_spotlight_animated_transition_set(efl_added, EINA_TRUE),
|
|
animated_transition_manager = efl_ui_spotlight_manager_animated_transition_get(manager2));
|
|
ck_assert_int_eq(animated_transition_manager, EINA_FALSE);
|
|
ck_assert_int_eq(efl_ui_spotlight_manager_animated_transition_get(manager2), EINA_TRUE);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST (efl_ui_spotlight_min_max_sizing)
|
|
{
|
|
Efl_Ui_Button *btn0, *btn1;
|
|
Eina_Size2D min, size;
|
|
|
|
btn0 = efl_add(WIDGET_CLASS, container);
|
|
efl_gfx_hint_size_min_set(btn0, EINA_SIZE2D(20, 200));
|
|
|
|
btn1 = efl_add(WIDGET_CLASS, container);
|
|
efl_gfx_hint_size_min_set(btn1, EINA_SIZE2D(200, 20));
|
|
|
|
efl_pack_end(container, btn0);
|
|
efl_pack_end(container, btn1);
|
|
min = efl_gfx_hint_size_restricted_min_get(container);
|
|
ck_assert_int_eq(min.w, 200);
|
|
ck_assert_int_eq(min.h, 200);
|
|
|
|
efl_gfx_hint_size_min_set(btn0, EINA_SIZE2D(20, 300));
|
|
efl_canvas_group_calculate(container);
|
|
|
|
min = efl_gfx_hint_size_restricted_min_get(container);
|
|
ck_assert_int_eq(min.w, 200);
|
|
ck_assert_int_eq(min.h, 300);
|
|
|
|
efl_gfx_hint_size_min_set(btn0, EINA_SIZE2D(20, 20));
|
|
efl_canvas_group_calculate(container);
|
|
|
|
min = efl_gfx_hint_size_restricted_min_get(container);
|
|
ck_assert_int_eq(min.w, 200);
|
|
ck_assert_int_eq(min.h, 20);
|
|
|
|
efl_ui_spotlight_size_set(container, EINA_SIZE2D(2000, 2000));
|
|
|
|
efl_gfx_entity_size_set(container, EINA_SIZE2D(200, 200));
|
|
size = efl_gfx_entity_size_get(btn0);
|
|
ck_assert_int_eq(size.w, 200);
|
|
ck_assert_int_eq(size.h, 200);
|
|
|
|
}
|
|
EFL_END_TEST
|
|
|
|
static void
|
|
spotlight_setup()
|
|
{
|
|
win = efl_add(EFL_UI_WIN_CLASS, efl_main_loop_get(),
|
|
efl_ui_win_type_set(efl_added, EFL_UI_WIN_TYPE_BASIC));
|
|
|
|
container = efl_add(EFL_UI_SPOTLIGHT_CONTAINER_CLASS, win,
|
|
efl_content_set(win, efl_added));
|
|
|
|
efl_gfx_entity_size_set(win, EINA_SIZE2D(200, 200));
|
|
}
|
|
|
|
static void
|
|
spotlight_teardown()
|
|
{
|
|
memset(&transition_calls, 0, sizeof(transition_calls));
|
|
memset(&indicator_calls, 0, sizeof(indicator_calls));
|
|
}
|
|
|
|
void efl_ui_test_spotlight(TCase *tc)
|
|
{
|
|
tcase_add_checked_fixture(tc, fail_on_errors_setup, fail_on_errors_teardown);
|
|
tcase_add_checked_fixture(tc, spotlight_setup, spotlight_teardown);
|
|
tcase_add_test(tc, efl_ui_spotlight_init);
|
|
tcase_add_test(tc, efl_ui_spotlight_active_index);
|
|
tcase_add_test(tc, efl_ui_smart_transition_calls);
|
|
tcase_add_test(tc, efl_ui_smart_transition_calls_no_animation);
|
|
tcase_add_test(tc, efl_ui_smart_transition_lifetime);
|
|
tcase_add_test(tc, efl_ui_smart_indicator_calls);
|
|
tcase_add_test(tc, efl_ui_smart_indicator_transition_calls);
|
|
tcase_add_test(tc, efl_ui_spotlight_manager_start_end);
|
|
tcase_add_test(tc, efl_ui_spotlight_test_push1);
|
|
tcase_add_test(tc, efl_ui_spotlight_test_push2);
|
|
tcase_add_test(tc, efl_ui_spotlight_test_pop1);
|
|
tcase_add_test(tc, efl_ui_spotlight_test_pop2);
|
|
tcase_add_test(tc, efl_ui_spotlight_test_pop3);
|
|
tcase_add_test(tc, efl_ui_spotlight_animated_transition);
|
|
tcase_add_test(tc, efl_ui_spotlight_min_max_sizing);
|
|
}
|