diff --git a/src/lv_api_map.h b/src/lv_api_map.h index b0b6d4eb3..b425799be 100644 --- a/src/lv_api_map.h +++ b/src/lv_api_map.h @@ -27,14 +27,6 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -#ifndef LV_HOR_RES_MAX -# define LV_HOR_RES_MAX LV_HOR_RES_DEF -#endif - -#ifndef LV_VER_RES_MAX -# define LV_VER_RES_MAX LV_VER_RES_DEF -#endif - /********************** * MACROS **********************/ diff --git a/src/lv_core/lv_indev_scroll.c b/src/lv_core/lv_indev_scroll.c index f95dd0685..549ed06ed 100644 --- a/src/lv_core/lv_indev_scroll.c +++ b/src/lv_core/lv_indev_scroll.c @@ -258,6 +258,9 @@ static lv_obj_t * find_scroll_obj(lv_indev_proc_t * proc) * 5. Use the last candidate. Always the "deepest" parent or the object from point 3 */ lv_obj_t * obj_act = proc->types.pointer.act_obj; while(obj_act) { + /*Halt search on a scroll freeze object*/ + if(lv_obj_get_scroll_freeze(obj_act)) return NULL; + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLLABLE) == false) { obj_act = lv_obj_get_parent(obj_act); continue; diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 72fa87e09..acc6b9e2e 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -1041,7 +1041,7 @@ lv_obj_spec_attr_t * lv_obj_allocate_spec_attr(lv_obj_t * obj) obj->spec_attr->scroll_dir = LV_DIR_ALL; obj->spec_attr->base_dir = LV_BIDI_DIR_INHERIT; - obj->spec_attr->scroll_mode = LV_SCROLL_MODE_AUTO; + obj->spec_attr->scrollbar_mode = LV_SCROLLBAR_MODE_AUTO; } return obj->spec_attr; @@ -2002,7 +2002,7 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param) if(res != LV_RES_OK) return res; } else if(sign == LV_SIGNAL_SCROLL_END) { - if(lv_obj_get_scroll_mode(obj) == LV_SCROLL_MODE_ACTIVE) { + if(lv_obj_get_scrollbar_mode(obj) == LV_SCROLLBAR_MODE_ACTIVE) { lv_obj_invalidate(obj); } } diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index 502e17c77..1c8bcbabd 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -219,10 +219,11 @@ typedef struct { lv_area_t ext_click_pad; /**< Extra click padding area. */ #endif - lv_scroll_mode_t scroll_mode :2; /**< How to display scrollbars*/ + lv_scrollbar_mode_t scrollbar_mode :2; /**< How to display scrollbars*/ lv_snap_align_t snap_align_x : 2; lv_snap_align_t snap_align_y : 2; lv_scroll_dir_t scroll_dir :4; + uint8_t scroll_freeze :1; /**< 1: Do not allow scrolling on this object and do not propagate the scroll to parent */ lv_bidi_dir_t base_dir : 2; /**< Base direction of texts related to this object */ }lv_obj_spec_attr_t; diff --git a/src/lv_core/lv_obj_draw.c b/src/lv_core/lv_obj_draw.c index 5b02a9734..b43920889 100644 --- a/src/lv_core/lv_obj_draw.c +++ b/src/lv_core/lv_obj_draw.c @@ -409,14 +409,14 @@ void _lv_obj_draw_scrollbar(lv_obj_t * obj, const lv_area_t * clip_area) { if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE) == false) return; - lv_scroll_dir_t sm = lv_obj_get_scroll_mode(obj); - if(sm == LV_SCROLL_MODE_OFF) { + lv_scroll_dir_t sm = lv_obj_get_scrollbar_mode(obj); + if(sm == LV_SCROLLBAR_MODE_OFF) { return; } /*If there is no indev scrolling this object but the moe is active return*/ lv_indev_t * indev = lv_indev_get_next(NULL); - if(sm == LV_SCROLL_MODE_ACTIVE) { + if(sm == LV_SCROLLBAR_MODE_ACTIVE) { bool found = false; while(indev) { if(lv_indev_get_scroll_obj(indev) == obj) { @@ -436,7 +436,7 @@ void _lv_obj_draw_scrollbar(lv_obj_t * obj, const lv_area_t * clip_area) lv_coord_t sr = lv_obj_get_scroll_right(obj); /*Return if too small content to scroll*/ - if(sm == LV_SCROLL_MODE_AUTO && st <= 0 && sb <= 0 && sl <= 0 && sr <= 0) { + if(sm == LV_SCROLLBAR_MODE_AUTO && st <= 0 && sb <= 0 && sl <= 0 && sr <= 0) { return; } @@ -451,18 +451,18 @@ void _lv_obj_draw_scrollbar(lv_obj_t * obj, const lv_area_t * clip_area) bool ver_draw = false; if((dir & LV_DIR_VER) && - ((sm == LV_SCROLL_MODE_ON) || - (sm == LV_SCROLL_MODE_AUTO && (st > 0 || sb > 0)) || - (sm == LV_SCROLL_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_VER))) { + ((sm == LV_SCROLLBAR_MODE_ON) || + (sm == LV_SCROLLBAR_MODE_AUTO && (st > 0 || sb > 0)) || + (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_VER))) { ver_draw = true; } bool hor_draw = false; if((dir & LV_DIR_HOR) && - ((sm == LV_SCROLL_MODE_ON) || - (sm == LV_SCROLL_MODE_AUTO && (sl > 0 || sr > 0)) || - (sm == LV_SCROLL_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_HOR))) { + ((sm == LV_SCROLLBAR_MODE_ON) || + (sm == LV_SCROLLBAR_MODE_AUTO && (sl > 0 || sr > 0)) || + (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_HOR))) { hor_draw = true; } diff --git a/src/lv_core/lv_obj_scroll.c b/src/lv_core/lv_obj_scroll.c index c35f5b8f7..a2b538441 100644 --- a/src/lv_core/lv_obj_scroll.c +++ b/src/lv_core/lv_obj_scroll.c @@ -44,14 +44,14 @@ static void scroll_anim_y_cb(lv_obj_t * obj, lv_anim_value_t v); * Setter functions *====================*/ -void lv_obj_set_scroll_mode(lv_obj_t * obj, lv_scroll_mode_t mode) +void lv_obj_set_scrollbar_mode(lv_obj_t * obj, lv_scrollbar_mode_t mode) { LV_ASSERT_OBJ(obj, LV_OBJX_NAME); lv_obj_allocate_spec_attr(obj); - if(obj->spec_attr->scroll_mode == mode) return; - obj->spec_attr->scroll_mode = mode; + if(obj->spec_attr->scrollbar_mode == mode) return; + obj->spec_attr->scrollbar_mode = mode; lv_obj_invalidate(obj); } @@ -61,7 +61,15 @@ void lv_obj_set_scroll_dir(struct _lv_obj_t * obj, lv_dir_t dir) if(dir != obj->spec_attr->scroll_dir) { obj->spec_attr->scroll_dir = dir; - lv_obj_invalidate(obj); + } +} + +void lv_obj_set_scroll_freeze(struct _lv_obj_t * obj, bool en) +{ + lv_obj_allocate_spec_attr(obj); + + if(en != obj->spec_attr->scroll_freeze) { + obj->spec_attr->scroll_freeze = en; } } @@ -81,10 +89,10 @@ void lv_obj_set_snap_align_y(struct _lv_obj_t * obj, lv_snap_align_t align) * Getter functions *====================*/ -lv_scroll_mode_t lv_obj_get_scroll_mode(const struct _lv_obj_t * obj) +lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const struct _lv_obj_t * obj) { - if(obj->spec_attr) return obj->spec_attr->scroll_mode; - else return LV_SCROLL_MODE_AUTO; + if(obj->spec_attr) return obj->spec_attr->scrollbar_mode; + else return LV_SCROLLBAR_MODE_AUTO; } lv_dir_t lv_obj_get_scroll_dir(const struct _lv_obj_t * obj) @@ -93,6 +101,12 @@ lv_dir_t lv_obj_get_scroll_dir(const struct _lv_obj_t * obj) else return LV_DIR_ALL; } +bool lv_obj_get_scroll_freeze(struct _lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->scroll_freeze; + else return false; +} + lv_snap_align_t lv_obj_get_snap_align_x(const struct _lv_obj_t * obj) { if(obj->spec_attr) return obj->spec_attr->snap_align_x; diff --git a/src/lv_core/lv_obj_scroll.h b/src/lv_core/lv_obj_scroll.h index 6e15100df..dac9a51e6 100644 --- a/src/lv_core/lv_obj_scroll.h +++ b/src/lv_core/lv_obj_scroll.h @@ -29,12 +29,12 @@ struct _lv_obj_t; /** Scrollbar modes: shows when should the scrollbars be visible*/ enum { - LV_SCROLL_MODE_OFF = 0x0, /**< Never show scroll bars*/ - LV_SCROLL_MODE_ON = 0x1, /**< Always show scroll bars*/ - LV_SCROLL_MODE_ACTIVE = 0x2, /**< Show scroll bars when object is being scrolled*/ - LV_SCROLL_MODE_AUTO = 0x3, /**< Show scroll bars when the content is large enough to be scrolled*/ + LV_SCROLLBAR_MODE_OFF = 0x0, /**< Never show scroll bars*/ + LV_SCROLLBAR_MODE_ON = 0x1, /**< Always show scroll bars*/ + LV_SCROLLBAR_MODE_ACTIVE = 0x2, /**< Show scroll bars when object is being scrolled*/ + LV_SCROLLBAR_MODE_AUTO = 0x3, /**< Show scroll bars when the content is large enough to be scrolled*/ }; -typedef uint8_t lv_scroll_mode_t; +typedef uint8_t lv_scrollbar_mode_t; enum { @@ -58,7 +58,7 @@ typedef uint8_t lv_snap_align_t; * @param obj pointer to an object * @param mode: LV_SCROLL_MODE_ON/OFF/AUTO/ACTIVE */ -void lv_obj_set_scroll_mode(struct _lv_obj_t * obj, lv_scroll_mode_t mode); +void lv_obj_set_scrollbar_mode(struct _lv_obj_t * obj, lv_scrollbar_mode_t mode); /** * Set the object in which directions can be scrolled @@ -67,6 +67,14 @@ void lv_obj_set_scroll_mode(struct _lv_obj_t * obj, lv_scroll_mode_t mode); */ void lv_obj_set_scroll_dir(struct _lv_obj_t * obj, lv_dir_t dir); +/** + * If enabled do not allow scrolling on this object and do not propagate the scroll to parent + * @param obj pointer to an object + * @param en true: enable scroll freeze; false: disable + */ +void lv_obj_set_scroll_freeze(struct _lv_obj_t * obj, bool en); + + /** * Set where to snap the children when scrolling ends horizontally * @param obj pointer to an object @@ -90,7 +98,7 @@ void lv_obj_set_snap_align_y(struct _lv_obj_t * obj, lv_snap_align_t align); * @param obj pointer to an object * @return the current scroll mode from `lv_scroll_mode_t` */ -lv_scroll_mode_t lv_obj_get_scroll_mode(const struct _lv_obj_t * obj); +lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const struct _lv_obj_t * obj); /** * Get the object in which directions can be scrolled @@ -99,6 +107,13 @@ lv_scroll_mode_t lv_obj_get_scroll_mode(const struct _lv_obj_t * obj); */ lv_dir_t lv_obj_get_scroll_dir(const struct _lv_obj_t * obj); +/** + * Get whether scroll freeze is enabled or not + * @param obj pointer to an object + * @return true: scroll freeze is enabled; false: disabled + */ +bool lv_obj_get_scroll_freeze(struct _lv_obj_t * obj); + /** * Get where to snap the children when scrolling ends horizontally * @param obj pointer to an object diff --git a/src/lv_hal/lv_hal.h b/src/lv_hal/lv_hal.h index a5e0a1dd5..79ad1110b 100644 --- a/src/lv_hal/lv_hal.h +++ b/src/lv_hal/lv_hal.h @@ -20,6 +20,13 @@ extern "C" { /********************* * DEFINES *********************/ +#ifndef LV_HOR_RES_MAX +# define LV_HOR_RES_MAX LV_HOR_RES_DEF +#endif + +#ifndef LV_VER_RES_MAX +# define LV_VER_RES_MAX LV_VER_RES_DEF +#endif /********************** * TYPEDEFS diff --git a/src/lv_hal/lv_hal_disp.c b/src/lv_hal/lv_hal_disp.c index 352047f59..fc8ded363 100644 --- a/src/lv_hal/lv_hal_disp.c +++ b/src/lv_hal/lv_hal_disp.c @@ -161,8 +161,8 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) lv_obj_clear_flag(disp->top_layer, LV_OBJ_FLAG_CLICKABLE); lv_obj_clear_flag(disp->sys_layer, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_scroll_mode(disp->top_layer, LV_SCROLL_MODE_OFF); - lv_obj_set_scroll_mode(disp->sys_layer, LV_SCROLL_MODE_OFF); + lv_obj_set_scrollbar_mode(disp->top_layer, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_scrollbar_mode(disp->sys_layer, LV_SCROLLBAR_MODE_OFF); lv_obj_invalidate(disp->act_scr); diff --git a/src/lv_widgets/lv_textarea.c b/src/lv_widgets/lv_textarea.c index 1862403c2..95e615fdf 100644 --- a/src/lv_widgets/lv_textarea.c +++ b/src/lv_widgets/lv_textarea.c @@ -1633,7 +1633,7 @@ static void update_cursor_position_on_click(lv_obj_t * ta, lv_signal_t sign, lv_ ext->sel_start = char_id_at_click; ext->sel_end = LV_LABEL_TEXT_SEL_OFF; ext->text_sel_in_prog = 1; - lv_obj_set_drag(lv_page_get_scrollable(ta), false); + lv_obj_set_scroll_freeze(ta, true); } else if(ext->text_sel_in_prog && sign == LV_SIGNAL_PRESSING) { /*Input device may be moving. Store the end position */ @@ -1641,7 +1641,7 @@ static void update_cursor_position_on_click(lv_obj_t * ta, lv_signal_t sign, lv_ } else if(ext->text_sel_in_prog && (sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_RELEASED)) { /*Input device is released. Check if anything was selected.*/ - lv_obj_set_drag(lv_page_get_scrollable(ta), true); + lv_obj_set_scroll_freeze(ta, false); } }