lv_page: further scrollbar improvements

This commit is contained in:
Gabor
2017-01-04 11:54:39 +01:00
parent 6884f6735c
commit 9aba30ed11

View File

@@ -166,9 +166,16 @@ bool lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param)
break; break;
case LV_SIGNAL_CORD_CHG: case LV_SIGNAL_CORD_CHG:
if(ext->scrl != NULL) { /*Refresh the scrollbar and notify the scrl if the size is changed*/
if(ext->scrl != NULL &&
(lv_obj_get_width(page) != area_get_width(param) ||
lv_obj_get_height(page) != area_get_height(param))) {
ext->scrl->signal_f(ext->scrl, LV_SIGNAL_CORD_CHG, &ext->scrl->cords); ext->scrl->signal_f(ext->scrl, LV_SIGNAL_CORD_CHG, &ext->scrl->cords);
/*The scrolbars are important olny if they are visible now*/
if(ext->sbh_draw != 0 || ext->sbv_draw != 0)
lv_page_sb_refresh(page); lv_page_sb_refresh(page);
} }
break; break;
case LV_SIGNAL_PRESSED: case LV_SIGNAL_PRESSED:
@@ -216,10 +223,10 @@ static bool lv_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void* param)
area_t page_cords; area_t page_cords;
area_t obj_cords; area_t obj_cords;
lv_obj_t * page = lv_obj_get_parent(scrl); lv_obj_t * page = lv_obj_get_parent(scrl);
lv_pages_t * pages = lv_obj_get_style(page); lv_pages_t * style = lv_obj_get_style(page);
lv_page_ext_t * page_ext = lv_obj_get_ext(page); lv_page_ext_t * page_ext = lv_obj_get_ext(page);
cord_t hpad = pages->bg_rects.hpad; cord_t hpad = style->bg_rects.hpad;
cord_t vpad = pages->bg_rects.vpad; cord_t vpad = style->bg_rects.vpad;
switch(sign) { switch(sign) {
case LV_SIGNAL_CORD_CHG: case LV_SIGNAL_CORD_CHG:
@@ -271,24 +278,40 @@ static bool lv_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void* param)
break; break;
case LV_SIGNAL_DRAG_BEGIN: case LV_SIGNAL_DRAG_BEGIN:
if(pages->sb_mode == LV_PAGE_SB_MODE_AUTO ) { if(style->sb_mode == LV_PAGE_SB_MODE_AUTO ) {
if(area_get_height(&page_ext->sbv) < lv_obj_get_height(scrl) - pages->sb_width) { cord_t sbh_pad = max(style->sb_width, style->bg_rects.hpad);
cord_t sbv_pad = max(style->sb_width, style->bg_rects.vpad);
area_t sb_area_tmp;
if(area_get_height(&page_ext->sbv) < lv_obj_get_height(scrl) - 2 * sbv_pad) {
page_ext->sbv_draw = 1; page_ext->sbv_draw = 1;
lv_inv_area(&page_ext->sbv);
} }
if(area_get_width(&page_ext->sbh) < lv_obj_get_width(scrl) - pages->sb_width) { if(area_get_width(&page_ext->sbh) < lv_obj_get_width(scrl) - 2 * sbh_pad) {
page_ext->sbh_draw = 1; page_ext->sbh_draw = 1;
lv_inv_area(&page_ext->sbh);
} }
} }
break; break;
case LV_SIGNAL_DRAG_END: case LV_SIGNAL_DRAG_END:
if(pages->sb_mode == LV_PAGE_SB_MODE_AUTO) { if(style->sb_mode == LV_PAGE_SB_MODE_AUTO) {
page_ext->sbh_draw = 0; page_ext->sbh_draw = 0;
page_ext->sbv_draw = 0; page_ext->sbv_draw = 0;
lv_inv_area(&page_ext->sbh); area_t sb_area_tmp;
lv_inv_area(&page_ext->sbv); if(page_ext->sbh_draw != 0) {
area_cpy(&sb_area_tmp, &page_ext->sbh);
sb_area_tmp.x1 += page->cords.x1;
sb_area_tmp.y1 += page->cords.y1;
sb_area_tmp.x2 += page->cords.x2;
sb_area_tmp.y2 += page->cords.y2;
lv_inv_area(&sb_area_tmp);
}
if(page_ext->sbv_draw != 0) {
area_cpy(&sb_area_tmp, &page_ext->sbv);
sb_area_tmp.x1 += page->cords.x1;
sb_area_tmp.y1 += page->cords.y1;
sb_area_tmp.x2 += page->cords.x2;
sb_area_tmp.y2 += page->cords.y2;
lv_inv_area(&sb_area_tmp);
}
} }
break; break;
case LV_SIGNAL_PRESSED: case LV_SIGNAL_PRESSED:
@@ -499,12 +522,25 @@ static bool lv_page_design(lv_obj_t * page, const area_t * mask, lv_design_mode_
opa_t sb_opa = lv_obj_get_opa(page) * style->sb_opa /100; opa_t sb_opa = lv_obj_get_opa(page) * style->sb_opa /100;
/*Draw the scrollbars*/ /*Draw the scrollbars*/
area_t sb_area;
if(ext->sbh_draw != 0) { if(ext->sbh_draw != 0) {
lv_draw_rect(&ext->sbh, mask, &style->sb_rects, sb_opa); /*Convert the relative coordinates to absolute*/
area_cpy(&sb_area, &ext->sbh);
sb_area.x1 += page->cords.x1;
sb_area.y1 += page->cords.y1;
sb_area.x2 += page->cords.x1;
sb_area.y2 += page->cords.y1;
lv_draw_rect(&sb_area, mask, &style->sb_rects, sb_opa);
} }
if(ext->sbv_draw != 0) { if(ext->sbv_draw != 0) {
lv_draw_rect(&ext->sbv, mask, &style->sb_rects, sb_opa); /*Convert the relative coordinates to absolute*/
area_cpy(&sb_area, &ext->sbv);
sb_area.x1 += page->cords.x1;
sb_area.y1 += page->cords.y1;
sb_area.x2 += page->cords.x1;
sb_area.y2 += page->cords.y1;
lv_draw_rect(&sb_area, mask, &style->sb_rects, sb_opa);
} }
} }
@@ -532,54 +568,79 @@ static void lv_page_sb_refresh(lv_obj_t * page)
cord_t vpad = style->bg_rects.vpad; cord_t vpad = style->bg_rects.vpad;
cord_t obj_w = lv_obj_get_width(page); cord_t obj_w = lv_obj_get_width(page);
cord_t obj_h = lv_obj_get_height(page); cord_t obj_h = lv_obj_get_height(page);
cord_t page_x0 = page->cords.x1; cord_t sbh_pad = max(style->sb_width, style->bg_rects.hpad);
cord_t page_y0 = page->cords.y1; cord_t sbv_pad = max(style->sb_width, style->bg_rects.vpad);
if(style->sb_mode == LV_PAGE_SB_MODE_OFF) return; if(style->sb_mode == LV_PAGE_SB_MODE_OFF) return;
if(style->sb_mode == LV_PAGE_SB_MODE_ON) {
page_ext->sbh_draw = 1;
page_ext->sbv_draw = 1;
}
/*Invalidate the current (old) scrollbar areas*/ /*Invalidate the current (old) scrollbar areas*/
if(page_ext->sbh_draw != 0) lv_inv_area(&page_ext->sbh); area_t sb_area_tmp;
if(page_ext->sbv_draw != 0) lv_inv_area(&page_ext->sbv); if(page_ext->sbh_draw != 0) {
area_cpy(&sb_area_tmp, &page_ext->sbh);
sb_area_tmp.x1 += page->cords.x1;
sb_area_tmp.y1 += page->cords.y1;
sb_area_tmp.x2 += page->cords.x2;
sb_area_tmp.y2 += page->cords.y2;
lv_inv_area(&sb_area_tmp);
}
if(page_ext->sbv_draw != 0) {
area_cpy(&sb_area_tmp, &page_ext->sbv);
sb_area_tmp.x1 += page->cords.x1;
sb_area_tmp.y1 += page->cords.y1;
sb_area_tmp.x2 += page->cords.x2;
sb_area_tmp.y2 += page->cords.y2;
lv_inv_area(&sb_area_tmp);
}
/*Horizontal scrollbar*/ /*Horizontal scrollbar*/
if(scrl_w <= obj_w - 2 * hpad) { /*Full sized scroll bar*/ if(scrl_w <= obj_w - 2 * hpad) { /*Full sized scroll bar*/
area_set_width(&page_ext->sbh, obj_w - style->sb_width); area_set_width(&page_ext->sbh, obj_w - 2 * sbh_pad);
area_set_pos(&page_ext->sbh, page_x0, page_y0 + obj_h - style->sb_width); area_set_pos(&page_ext->sbh, sbh_pad, obj_h - style->sb_width);
page_ext->sbh_draw = 0;
} else { } else {
if(style->sb_mode == LV_PAGE_SB_MODE_ON) { size_tmp = (obj_w * (obj_w - (2 * sbh_pad))) / (scrl_w + 2 * hpad);
page_ext->sbh_draw = 1;
}
size_tmp = (obj_w * (obj_w - (2 * style->sb_width))) / (scrl_w + 2 * hpad);
area_set_width(&page_ext->sbh, size_tmp); area_set_width(&page_ext->sbh, size_tmp);
area_set_pos(&page_ext->sbh, page_x0 + style->sb_width + area_set_pos(&page_ext->sbh, sbh_pad +
(-(lv_obj_get_x(scrl) - hpad) * (obj_w - size_tmp - 2 * style->sb_width)) / (-(lv_obj_get_x(scrl) - hpad) * (obj_w - size_tmp - 2 * sbh_pad)) /
(scrl_w + 2 * hpad - obj_w ), (scrl_w + 2 * hpad - obj_w ), obj_h - style->sb_width);
page_y0 + obj_h - style->sb_width);
} }
/*Vertical scrollbar*/ /*Vertical scrollbar*/
if(scrl_h <= obj_h - 2 * vpad) { /*Full sized scroll bar*/ if(scrl_h <= obj_h - 2 * vpad) { /*Full sized scroll bar*/
area_set_height(&page_ext->sbv, obj_h - style->sb_width); area_set_height(&page_ext->sbv, obj_h - 2 * sbv_pad);
area_set_pos(&page_ext->sbv, page_x0 + obj_w - style->sb_width, 0); area_set_pos(&page_ext->sbv, obj_w - style->sb_width, sbv_pad);
page_ext->sbv_draw = 0;
} else { } else {
if(style->sb_mode == LV_PAGE_SB_MODE_ON) { size_tmp = (obj_h * (obj_h - (2 * sbv_pad))) / (scrl_h + 2 * vpad);
page_ext->sbv_draw = 1;
}
size_tmp = (obj_h * (obj_h - (2 * style->sb_width))) / (scrl_h + 2 * vpad);
area_set_height(&page_ext->sbv, size_tmp); area_set_height(&page_ext->sbv, size_tmp);
area_set_pos(&page_ext->sbv, page_x0 + obj_w - style->sb_width, area_set_pos(&page_ext->sbv, obj_w - style->sb_width,
page_y0 + style->sb_width + sbv_pad +
(-(lv_obj_get_y(scrl) - vpad) * (obj_h - size_tmp - 2 * style->sb_width)) / (-(lv_obj_get_y(scrl) - vpad) * (obj_h - size_tmp - 2 * sbv_pad)) /
(scrl_h + 2 * vpad - obj_h )); (scrl_h + 2 * vpad - obj_h ));
} }
/*Invalidate the new scrollbar areas*/ /*Invalidate the new scrollbar areas*/
if(page_ext->sbh_draw != 0) lv_inv_area(&page_ext->sbh); if(page_ext->sbh_draw != 0) {
if(page_ext->sbv_draw != 0) lv_inv_area(&page_ext->sbv); area_cpy(&sb_area_tmp, &page_ext->sbh);
sb_area_tmp.x1 += page->cords.x1;
sb_area_tmp.y1 += page->cords.y1;
sb_area_tmp.x2 += page->cords.x2;
sb_area_tmp.y2 += page->cords.y2;
lv_inv_area(&sb_area_tmp);
}
if(page_ext->sbv_draw != 0) {
area_cpy(&sb_area_tmp, &page_ext->sbv);
sb_area_tmp.x1 += page->cords.x1;
sb_area_tmp.y1 += page->cords.y1;
sb_area_tmp.x2 += page->cords.x2;
sb_area_tmp.y2 += page->cords.y2;
lv_inv_area(&sb_area_tmp);
}
} }
/** /**