refactor LV_SCROLL_MODE -> LV_SCROLLBAR_MODE and add lv_obj_set_scroll_freeze

This commit is contained in:
Gabor Kiss-Vamosi
2020-11-20 12:29:59 +01:00
parent fdfb69f066
commit fddd535013
10 changed files with 71 additions and 39 deletions

View File

@@ -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
**********************/

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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);
}
}