From 1fa580f6f00d7197097d588b3f6bc159f1be0a6a Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 10 Aug 2018 01:04:20 +0200 Subject: [PATCH] lv_page: add LV_SB_MODE_HIDE/UNHIDE and use it in ddlist --- lv_objx/lv_ddlist.c | 5 +++++ lv_objx/lv_page.c | 53 ++++++++++++++++++++++++++------------------- lv_objx/lv_page.h | 20 ++++++++++------- lv_objx/lv_win.h | 20 ++++++++++++----- 4 files changed, 62 insertions(+), 36 deletions(-) diff --git a/lv_objx/lv_ddlist.c b/lv_objx/lv_ddlist.c index c7a4400f9..dad90f062 100644 --- a/lv_objx/lv_ddlist.c +++ b/lv_objx/lv_ddlist.c @@ -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) { diff --git a/lv_objx/lv_page.c b/lv_objx/lv_page.c index 563f12b63..81e7fb8d6 100644 --- a/lv_objx/lv_page.c +++ b/lv_objx/lv_page.c @@ -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; diff --git a/lv_objx/lv_page.h b/lv_objx/lv_page.h index 7c38c3fab..669be36cf 100644 --- a/lv_objx/lv_page.h +++ b/lv_objx/lv_page.h @@ -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 diff --git a/lv_objx/lv_win.h b/lv_objx/lv_win.h index 9e0d8c188..97f0444af 100644 --- a/lv_objx/lv_win.h +++ b/lv_objx/lv_win.h @@ -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); } /**********************