From f426d546fae0e9e37967114d3fcb259d492a00ea Mon Sep 17 00:00:00 2001 From: Tim Stableford Date: Tue, 29 Mar 2022 12:57:48 +0100 Subject: [PATCH] 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. --- src/extra/widgets/tabview/lv_tabview.c | 44 +++++++++++++++++++------- 1 file changed, 32 insertions(+), 12 deletions(-) mode change 100644 => 100755 src/extra/widgets/tabview/lv_tabview.c diff --git a/src/extra/widgets/tabview/lv_tabview.c b/src/extra/widgets/tabview/lv_tabview.c old mode 100644 new mode 100755 index 8ccd143e1..c825a144e --- a/src/extra/widgets/tabview/lv_tabview.c +++ b/src/extra/widgets/tabview/lv_tabview.c @@ -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;