refactor LV_SCROLL_MODE -> LV_SCROLLBAR_MODE and add lv_obj_set_scroll_freeze
This commit is contained in:
@@ -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
|
||||
**********************/
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user