1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

feat(tabview): support vertical scrolling (#3184)

This makes it so when the tabview has the tabs on the left or right
it will be scrolled up and down rather than left and right in all cases.
This commit is contained in:
Tim Stableford 2022-03-29 12:57:48 +01:00 committed by GitHub
parent 47791926f9
commit f426d546fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

44
src/extra/widgets/tabview/lv_tabview.c Normal file → Executable file
View File

@ -135,14 +135,22 @@ void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en)
lv_obj_t * cont = lv_tabview_get_content(obj);
if(cont == NULL) return;
lv_coord_t gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN);
lv_coord_t w = lv_obj_get_content_width(cont);
if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) {
lv_obj_scroll_to_x(cont, id * (gap + w), anim_en);
if((tabview->tab_pos & LV_DIR_VER) != 0) {
lv_coord_t gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN);
lv_coord_t w = lv_obj_get_content_width(cont);
if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) {
lv_obj_scroll_to_x(cont, id * (gap + w), anim_en);
}
else {
int32_t id_rtl = -(int32_t)id;
lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en);
}
}
else {
int32_t id_rtl = -(int32_t)id;
lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en);
lv_coord_t gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN);
lv_coord_t h = lv_obj_get_content_height(cont);
lv_obj_scroll_to_y(cont, id * (gap + h), anim_en);
}
lv_obj_t * btns = lv_tabview_get_tab_btns(obj);
@ -229,8 +237,14 @@ static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * ob
lv_group_t * g = lv_group_get_default();
if(g) lv_group_add_obj(g, btnm);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW);
lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER);
if((tabview->tab_pos & LV_DIR_VER) != 0) {
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW);
lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER);
}
else {
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER);
}
lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE);
lv_obj_clear_flag(cont, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
}
@ -289,6 +303,7 @@ static void cont_scroll_end_event_cb(lv_event_t * e)
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * tv = lv_obj_get_parent(cont);
lv_tabview_t * tv_obj = (lv_tabview_t *)tv;
if(code == LV_EVENT_LAYOUT_CHANGED) {
lv_tabview_set_act(tv, lv_tabview_get_tab_act(tv), LV_ANIM_OFF);
}
@ -296,11 +311,16 @@ static void cont_scroll_end_event_cb(lv_event_t * e)
lv_point_t p;
lv_obj_get_scroll_end(cont, &p);
lv_coord_t w = lv_obj_get_content_width(cont);
lv_coord_t t;
if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL) t = -(p.x - w / 2) / w;
else t = (p.x + w / 2) / w;
if((tv_obj->tab_pos & LV_DIR_VER) != 0) {
lv_coord_t w = lv_obj_get_content_width(cont);
if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL) t = -(p.x - w / 2) / w;
else t = (p.x + w / 2) / w;
}
else {
lv_coord_t h = lv_obj_get_content_height(cont);
t = (p.y + h / 2) / h;
}
if(t < 0) t = 0;
bool new_tab = false;