feat(gridnav): single axis movement flags (#6044)
This commit is contained in:
@@ -90,6 +90,7 @@
|
||||
#define LV_USE_VECTOR_GRAPHIC 1
|
||||
#define LV_USE_PROFILER 1
|
||||
#define LV_PROFILER_INCLUDE "lv_profiler_builtin.h"
|
||||
#define LV_USE_GRIDNAV 1
|
||||
|
||||
#define LV_BUILD_EXAMPLES 1
|
||||
#define LV_USE_DEMO_WIDGETS 1
|
||||
|
||||
114
tests/src/test_cases/test_gridnav.c
Normal file
114
tests/src/test_cases/test_gridnav.c
Normal file
@@ -0,0 +1,114 @@
|
||||
#if LV_BUILD_TEST
|
||||
#include "../lvgl.h"
|
||||
|
||||
#include "unity/unity.h"
|
||||
#include "lv_test_indev.h"
|
||||
|
||||
static lv_obj_t * g_screen;
|
||||
static lv_group_t * g_group;
|
||||
static struct {
|
||||
bool press_happened;
|
||||
uint32_t key;
|
||||
lv_obj_t * obj;
|
||||
} g_key_data;
|
||||
|
||||
void setUp(void)
|
||||
{
|
||||
g_screen = lv_screen_active();
|
||||
g_group = lv_group_create();
|
||||
g_key_data.press_happened = false;
|
||||
}
|
||||
|
||||
void tearDown(void)
|
||||
{
|
||||
lv_obj_clean(g_screen);
|
||||
lv_group_delete(g_group); /* also removes all indevs set to the group */
|
||||
}
|
||||
|
||||
static void key_event_cb(lv_event_t * e)
|
||||
{
|
||||
TEST_ASSERT_FALSE(g_key_data.press_happened);
|
||||
g_key_data.press_happened = true;
|
||||
g_key_data.key = *(uint32_t *)lv_event_get_param(e);
|
||||
g_key_data.obj = lv_event_get_target_obj(e);
|
||||
}
|
||||
|
||||
static void gridnav_one_axis_move_only(uint32_t key_grid_axis_next,
|
||||
uint32_t key_grid_axis_prev,
|
||||
uint32_t key_obj_axis_next,
|
||||
uint32_t key_obj_axis_prev,
|
||||
lv_gridnav_ctrl_t gridnav_ctrl,
|
||||
lv_flex_flow_t flex_flow)
|
||||
{
|
||||
lv_indev_set_group(lv_test_keypad_indev, g_group);
|
||||
|
||||
lv_obj_t * cont = lv_obj_create(g_screen);
|
||||
lv_obj_set_flex_flow(cont, flex_flow);
|
||||
lv_obj_set_flex_align(cont, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
|
||||
lv_obj_set_size(cont, lv_pct(100), lv_pct(100));
|
||||
lv_obj_center(cont);
|
||||
lv_gridnav_add(cont, gridnav_ctrl);
|
||||
lv_group_add_obj(g_group, cont);
|
||||
lv_obj_t * objs[3];
|
||||
for(uint32_t i = 0; i < 3; i++) {
|
||||
lv_obj_t * obj = lv_obj_create(cont);
|
||||
lv_obj_create(obj); /* the obj needs a child to be focusable by gridnav */
|
||||
lv_group_remove_obj(obj);
|
||||
lv_obj_add_event_cb(obj, key_event_cb, LV_EVENT_KEY, NULL);
|
||||
objs[i] = obj;
|
||||
}
|
||||
|
||||
TEST_ASSERT(lv_obj_get_state(objs[0]) & LV_STATE_FOCUSED);
|
||||
|
||||
/* gridnav direction key moves the focus */
|
||||
lv_test_key_hit(key_grid_axis_next);
|
||||
TEST_ASSERT(lv_obj_get_state(objs[1]) & LV_STATE_FOCUSED);
|
||||
TEST_ASSERT_FALSE(g_key_data.press_happened);
|
||||
|
||||
/* non gridnav direction key does not move the focus. */
|
||||
/* the key is sent to the object instead */
|
||||
lv_test_key_hit(key_obj_axis_next);
|
||||
TEST_ASSERT(lv_obj_get_state(objs[1]) & LV_STATE_FOCUSED);
|
||||
TEST_ASSERT_TRUE(g_key_data.press_happened);
|
||||
TEST_ASSERT(g_key_data.key == key_obj_axis_next);
|
||||
TEST_ASSERT(g_key_data.obj == objs[1]);
|
||||
g_key_data.press_happened = false;
|
||||
|
||||
lv_test_key_hit(key_obj_axis_prev);
|
||||
TEST_ASSERT(lv_obj_get_state(objs[1]) & LV_STATE_FOCUSED);
|
||||
TEST_ASSERT_TRUE(g_key_data.press_happened);
|
||||
TEST_ASSERT(g_key_data.key == key_obj_axis_prev);
|
||||
TEST_ASSERT(g_key_data.obj == objs[1]);
|
||||
g_key_data.press_happened = false;
|
||||
|
||||
/* go back */
|
||||
lv_test_key_hit(key_grid_axis_prev);
|
||||
TEST_ASSERT(lv_obj_get_state(objs[0]) & LV_STATE_FOCUSED);
|
||||
TEST_ASSERT_FALSE(g_key_data.press_happened);
|
||||
/* at the beginning, can't move further back */
|
||||
lv_test_key_hit(key_grid_axis_prev);
|
||||
TEST_ASSERT(lv_obj_get_state(objs[0]) & LV_STATE_FOCUSED);
|
||||
TEST_ASSERT_FALSE(g_key_data.press_happened);
|
||||
}
|
||||
|
||||
void test_gridnav_vertical_move_only(void)
|
||||
{
|
||||
gridnav_one_axis_move_only(LV_KEY_DOWN,
|
||||
LV_KEY_UP,
|
||||
LV_KEY_RIGHT,
|
||||
LV_KEY_LEFT,
|
||||
LV_GRIDNAV_CTRL_VERTICAL_MOVE_ONLY,
|
||||
LV_FLEX_FLOW_COLUMN);
|
||||
}
|
||||
|
||||
void test_gridnav_horizontal_move_only(void)
|
||||
{
|
||||
gridnav_one_axis_move_only(LV_KEY_RIGHT,
|
||||
LV_KEY_LEFT,
|
||||
LV_KEY_DOWN,
|
||||
LV_KEY_UP,
|
||||
LV_GRIDNAV_CTRL_HORIZONTAL_MOVE_ONLY,
|
||||
LV_FLEX_FLOW_ROW);
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user