From a4128a83562e0daacd949333ba7cbfec650f8050 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 29 Sep 2021 12:06:01 +0200 Subject: [PATCH] fix(scroll) minor fixes on obj scroll handling fixes https://github.com/lvgl/lvgl/issues/2547#issuecomment-927242760 --- src/core/lv_obj.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/core/lv_obj.c b/src/core/lv_obj.c index 3a81dee3e..f677cf0ef 100644 --- a/src/core/lv_obj.c +++ b/src/core/lv_obj.c @@ -226,6 +226,7 @@ void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) LV_ASSERT_OBJ(obj, MY_CLASS); bool was_on_layout = lv_obj_is_layout_positioned(obj); + bool scrollable_chg = (f & LV_OBJ_FLAG_SCROLLABLE) != (obj->flags & LV_OBJ_FLAG_SCROLLABLE); if(f & LV_OBJ_FLAG_HIDDEN) lv_obj_invalidate(obj); @@ -238,6 +239,13 @@ void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); } + + if(scrollable_chg) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } } void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t f) @@ -245,6 +253,7 @@ void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t f) LV_ASSERT_OBJ(obj, MY_CLASS); bool was_on_layout = lv_obj_is_layout_positioned(obj); + bool scrollable_chg = (f & LV_OBJ_FLAG_SCROLLABLE) != (obj->flags & LV_OBJ_FLAG_SCROLLABLE); obj->flags &= (~f); @@ -258,6 +267,13 @@ void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t f) if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); } + + if(scrollable_chg) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } } void lv_obj_add_state(lv_obj_t * obj, lv_state_t state) @@ -787,6 +803,12 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) } else if(code == LV_EVENT_SCROLL_END) { lv_obj_clear_state(obj, LV_STATE_SCROLLED); + if(lv_obj_get_scrollbar_mode(obj) == LV_SCROLLBAR_MODE_ACTIVE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } } else if(code == LV_EVENT_DEFOCUSED) { lv_obj_clear_state(obj, LV_STATE_FOCUSED | LV_STATE_EDITED | LV_STATE_FOCUS_KEY); @@ -814,11 +836,6 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_obj_mark_layout_as_dirty(obj); } } - else if(code == LV_EVENT_SCROLL_END) { - if(lv_obj_get_scrollbar_mode(obj) == LV_SCROLLBAR_MODE_ACTIVE) { - lv_obj_invalidate(obj); - } - } else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { lv_coord_t * s = lv_event_get_param(e); lv_coord_t d = lv_obj_calculate_ext_draw_size(obj, LV_PART_MAIN);