lv_page: add LV_SB_MODE_HIDE/UNHIDE and use it in ddlist
This commit is contained in:
@@ -108,6 +108,7 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy)
|
||||
lv_cont_set_fit(new_ddlist, true, false);
|
||||
lv_page_set_rel_action(new_ddlist, lv_ddlist_release_action);
|
||||
lv_page_set_sb_mode(new_ddlist, LV_SB_MODE_DRAG);
|
||||
lv_page_set_sb_mode(new_ddlist, LV_SB_MODE_HIDE);
|
||||
lv_page_set_style(new_ddlist, LV_PAGE_STYLE_SCRL, &lv_style_transp_tight);
|
||||
|
||||
lv_ddlist_set_options(new_ddlist, "Option 1\nOption 2\nOption 3");
|
||||
@@ -682,11 +683,15 @@ static void lv_ddlist_refr_size(lv_obj_t * ddlist, bool anim_en)
|
||||
if(ext->opened) { /*Open the list*/
|
||||
if(ext->fix_height == 0) new_height = lv_obj_get_height(lv_page_get_scrl(ddlist)) + 2 * style->body.padding.ver;
|
||||
else new_height = ext->fix_height;
|
||||
|
||||
lv_page_set_sb_mode(ddlist, LV_SB_MODE_UNHIDE);
|
||||
} else { /*Close the list*/
|
||||
const lv_font_t * font = style->text.font;
|
||||
lv_style_t * label_style = lv_obj_get_style(ext->label);
|
||||
lv_coord_t font_h = lv_font_get_height(font);
|
||||
new_height = font_h + 2 * label_style->text.line_space;
|
||||
|
||||
lv_page_set_sb_mode(ddlist, LV_SB_MODE_HIDE);
|
||||
}
|
||||
|
||||
if(anim_en == 0) {
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define LV_PAGE_SB_MIN_SIZE (LV_DPI / 8)
|
||||
#define LV_PAGE_GROUP_SCROLL_ANIM_TIME 200
|
||||
#define LV_PAGE_SCROLL_ANIM_TIME 200 /*[ms] Scroll anim time on `lv_page_scroll_up/down/left/rigth`*/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
@@ -193,9 +193,13 @@ void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode)
|
||||
lv_page_ext_t * ext = lv_obj_get_ext_attr(page);
|
||||
if(ext->sb.mode == sb_mode) return;
|
||||
|
||||
ext->sb.mode = sb_mode;
|
||||
if(sb_mode == LV_SB_MODE_HIDE) ext->sb.mode |= LV_SB_MODE_HIDE; /*Set the hidden flag*/
|
||||
else if (sb_mode == LV_SB_MODE_UNHIDE) ext->sb.mode &= (~LV_SB_MODE_HIDE); /*Clear the hidden flag*/
|
||||
else ext->sb.mode = sb_mode;
|
||||
|
||||
ext->sb.hor_draw = 0;
|
||||
ext->sb.ver_draw = 0;
|
||||
|
||||
lv_page_sb_refresh(page);
|
||||
lv_obj_invalidate(page);
|
||||
}
|
||||
@@ -389,58 +393,60 @@ void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, uint16_t anim_time)
|
||||
}
|
||||
|
||||
/**
|
||||
* Scroll down the page a little
|
||||
* Scroll the page horizontally
|
||||
* @param page pointer to a page object
|
||||
* @param dist the distance to scroll (< 0: scroll right; > 0 scroll left)
|
||||
*/
|
||||
void lv_page_scroll_down(lv_obj_t * page)
|
||||
void lv_page_scroll_hor(lv_obj_t * page, lv_coord_t dist)
|
||||
{
|
||||
lv_obj_t * scrl = lv_page_get_scrl(page);
|
||||
|
||||
#if USE_LV_ANIMATION
|
||||
lv_anim_t a;
|
||||
a.var = scrl;
|
||||
a.start = lv_obj_get_y(scrl);
|
||||
a.end = a.start - lv_obj_get_height(page) / 4;
|
||||
a.fp = (lv_anim_fp_t)lv_obj_set_y;
|
||||
a.start = lv_obj_get_x(scrl);
|
||||
a.end = a.start + dist;
|
||||
a.fp = (lv_anim_fp_t)lv_obj_set_x;
|
||||
a.path = lv_anim_path_linear;
|
||||
a.end_cb = NULL;
|
||||
a.act_time = 0;
|
||||
a.time = LV_PAGE_GROUP_SCROLL_ANIM_TIME;
|
||||
a.time = LV_PAGE_SCROLL_ANIM_TIME;
|
||||
a.playback = 0;
|
||||
a.playback_pause = 0;
|
||||
a.repeat = 0;
|
||||
a.repeat_pause = 0;
|
||||
lv_anim_create(&a);
|
||||
#else
|
||||
lv_obj_set_y(scrl, lv_obj_get_y(scrl) - lv_obj_get_height(page) / 4);
|
||||
lv_obj_set_x(scrl, lv_obj_get_x(scrl) + dist);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*Scroll up the page a little
|
||||
* Scroll the page vertically
|
||||
* @param page pointer to a page object
|
||||
* @param dist the distance to scroll (< 0: scroll down; > 0 scroll up)
|
||||
*/
|
||||
void lv_page_scroll_up(lv_obj_t * page)
|
||||
void lv_page_scroll_ver(lv_obj_t * page, lv_coord_t dist)
|
||||
{
|
||||
lv_obj_t * scrl = lv_page_get_scrl(page);
|
||||
|
||||
#if USE_LV_ANIMATION
|
||||
lv_anim_t a;
|
||||
a.var = scrl;
|
||||
a.start = lv_obj_get_y(scrl);
|
||||
a.end = a.start + lv_obj_get_height(page) / 4;
|
||||
a.end = a.start + dist;
|
||||
a.fp = (lv_anim_fp_t)lv_obj_set_y;
|
||||
a.path = lv_anim_path_linear;
|
||||
a.end_cb = NULL;
|
||||
a.act_time = 0;
|
||||
a.time = LV_PAGE_GROUP_SCROLL_ANIM_TIME;
|
||||
a.time = LV_PAGE_SCROLL_ANIM_TIME;
|
||||
a.playback = 0;
|
||||
a.playback_pause = 0;
|
||||
a.repeat = 0;
|
||||
a.repeat_pause = 0;
|
||||
lv_anim_create(&a);
|
||||
#else
|
||||
lv_obj_set_y(scrl, lv_obj_get_y(scrl) + lv_obj_get_height(page) / 4);
|
||||
lv_obj_set_y(scrl, lv_obj_get_x(scrl) + dist);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -487,7 +493,7 @@ static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mo
|
||||
|
||||
/*Draw the scrollbars*/
|
||||
lv_area_t sb_area;
|
||||
if(ext->sb.hor_draw) {
|
||||
if(ext->sb.hor_draw && (ext->sb.mode & LV_SB_MODE_HIDE) == 0) {
|
||||
/*Convert the relative coordinates to absolute*/
|
||||
lv_area_copy(&sb_area, &ext->sb.hor_area);
|
||||
sb_area.x1 += page->coords.x1;
|
||||
@@ -497,7 +503,7 @@ static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mo
|
||||
lv_draw_rect(&sb_area, mask, ext->sb.style, lv_obj_get_opa_scale(page));
|
||||
}
|
||||
|
||||
if(ext->sb.ver_draw) {
|
||||
if(ext->sb.ver_draw && (ext->sb.mode & LV_SB_MODE_HIDE) == 0) {
|
||||
/*Convert the relative coordinates to absolute*/
|
||||
lv_area_copy(&sb_area, &ext->sb.ver_area);
|
||||
sb_area.x1 += page->coords.x1;
|
||||
@@ -627,11 +633,14 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param)
|
||||
} else if(sign == LV_SIGNAL_CONTROLL) {
|
||||
uint32_t c = *((uint32_t *) param);
|
||||
|
||||
if((c == LV_GROUP_KEY_DOWN || c == LV_GROUP_KEY_RIGHT) && ext->arrow_scroll) {
|
||||
lv_page_scroll_down(page);
|
||||
|
||||
} else if((c == LV_GROUP_KEY_UP || c == LV_GROUP_KEY_LEFT) && ext->arrow_scroll) {
|
||||
lv_page_scroll_up(page);
|
||||
if((c == LV_GROUP_KEY_DOWN) && ext->arrow_scroll) {
|
||||
lv_page_scroll_ver(page, - lv_obj_get_height(page) / 4);
|
||||
} else if((c == LV_GROUP_KEY_UP) && ext->arrow_scroll) {
|
||||
lv_page_scroll_ver(page, lv_obj_get_height(page) / 4);
|
||||
} else if((c == LV_GROUP_KEY_RIGHT) && ext->arrow_scroll) {
|
||||
lv_page_scroll_hor(page, - lv_obj_get_width(page) / 4);
|
||||
} else if((c == LV_GROUP_KEY_LEFT) && ext->arrow_scroll) {
|
||||
lv_page_scroll_hor(page, lv_obj_get_width(page) / 4);
|
||||
}
|
||||
} else if(sign == LV_SIGNAL_GET_EDITABLE) {
|
||||
bool * editable = (bool *)param;
|
||||
|
||||
@@ -40,10 +40,12 @@ extern "C" {
|
||||
/*Scrollbar modes: shows when should the scrollbars be visible*/
|
||||
typedef enum
|
||||
{
|
||||
LV_SB_MODE_OFF, /*Never show scrollbars*/
|
||||
LV_SB_MODE_ON, /*Always show scrollbars*/
|
||||
LV_SB_MODE_DRAG, /*Show scrollbars when page is being dragged*/
|
||||
LV_SB_MODE_AUTO, /*Show scrollbars when the scrollable container is large enough to be scrolled*/
|
||||
LV_SB_MODE_OFF = 0x0, /*Never show scrollbars*/
|
||||
LV_SB_MODE_ON = 0x1, /*Always show scrollbars*/
|
||||
LV_SB_MODE_DRAG = 0x2, /*Show scrollbars when page is being dragged*/
|
||||
LV_SB_MODE_AUTO = 0x3, /*Show scrollbars when the scrollable container is large enough to be scrolled*/
|
||||
LV_SB_MODE_HIDE = 0x4, /*Hide the scroll bar temporally*/
|
||||
LV_SB_MODE_UNHIDE = 0x5, /*Unhide the previously hidden scrollbar. Recover it's type too*/
|
||||
} lv_sb_mode_t;
|
||||
|
||||
/*Data of page*/
|
||||
@@ -279,16 +281,18 @@ void lv_page_glue_obj(lv_obj_t * obj, bool glue);
|
||||
void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, uint16_t anim_time);
|
||||
|
||||
/**
|
||||
* Scroll down the page a little
|
||||
* Scroll the page horizontally
|
||||
* @param page pointer to a page object
|
||||
* @param dist the distance to scroll (< 0: scroll left; > 0 scroll right)
|
||||
*/
|
||||
void lv_page_scroll_down(lv_obj_t * page);
|
||||
void lv_page_scroll_hor(lv_obj_t * page, lv_coord_t dist);
|
||||
|
||||
/**
|
||||
* Scroll up the page a little
|
||||
* Scroll the page vertically
|
||||
* @param page pointer to a page object
|
||||
* @param dist the distance to scroll (< 0: scroll down; > 0 scroll up)
|
||||
*/
|
||||
void lv_page_scroll_up(lv_obj_t * page);
|
||||
void lv_page_scroll_ver(lv_obj_t * page, lv_coord_t dist);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
|
||||
@@ -223,17 +223,25 @@ lv_style_t * lv_win_get_style(const lv_obj_t *win, lv_win_style_t type);
|
||||
*/
|
||||
void lv_win_focus(lv_obj_t * win, lv_obj_t * obj, uint16_t anim_time);
|
||||
|
||||
|
||||
static inline void lv_win_scroll_down(lv_obj_t * win)
|
||||
/**
|
||||
* Scroll the window horizontally
|
||||
* @param win pointer to a window object
|
||||
* @param dist the distance to scroll (< 0: scroll right; > 0 scroll left)
|
||||
*/
|
||||
static inline void lv_win_scroll_hor(lv_obj_t * win, lv_coord_t dist)
|
||||
{
|
||||
lv_win_ext_t * ext = lv_obj_get_ext_attr(win);
|
||||
lv_page_scroll_down(ext->page);
|
||||
lv_page_scroll_hor(ext->page, dist);
|
||||
}
|
||||
|
||||
static inline void lv_win_scroll_up(lv_obj_t * win)
|
||||
/**
|
||||
* Scroll the window vertically
|
||||
* @param win pointer to a window object
|
||||
* @param dist the distance to scroll (< 0: scroll down; > 0 scroll up)
|
||||
*/
|
||||
static inline void lv_win_scroll_ver(lv_obj_t * win, lv_coord_t dist)
|
||||
{
|
||||
lv_win_ext_t * ext = lv_obj_get_ext_attr(win);
|
||||
lv_page_scroll_up(ext->page);
|
||||
lv_page_scroll_ver(ext->page, dist);
|
||||
}
|
||||
|
||||
/**********************
|
||||
|
||||
Reference in New Issue
Block a user