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:
parent
47791926f9
commit
f426d546fa
24
src/extra/widgets/tabview/lv_tabview.c
Normal file → Executable file
24
src/extra/widgets/tabview/lv_tabview.c
Normal file → Executable file
@ -135,6 +135,8 @@ 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;
|
||||
|
||||
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) {
|
||||
@ -144,6 +146,12 @@ void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en)
|
||||
int32_t id_rtl = -(int32_t)id;
|
||||
lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en);
|
||||
}
|
||||
}
|
||||
else {
|
||||
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);
|
||||
lv_btnmatrix_set_btn_ctrl(btns, id, LV_BTNMATRIX_CTRL_CHECKED);
|
||||
@ -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);
|
||||
|
||||
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((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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user