BigW Consortium Gitlab

Commit 9aba30ed by Gabor

lv_page: further scrollbar improvements

parent 6884f673
......@@ -166,9 +166,16 @@ bool lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param)
break;
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);
/*The scrolbars are important olny if they are visible now*/
if(ext->sbh_draw != 0 || ext->sbv_draw != 0)
lv_page_sb_refresh(page);
}
break;
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 obj_cords;
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);
cord_t hpad = pages->bg_rects.hpad;
cord_t vpad = pages->bg_rects.vpad;
cord_t hpad = style->bg_rects.hpad;
cord_t vpad = style->bg_rects.vpad;
switch(sign) {
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;
case LV_SIGNAL_DRAG_BEGIN:
if(pages->sb_mode == LV_PAGE_SB_MODE_AUTO ) {
if(area_get_height(&page_ext->sbv) < lv_obj_get_height(scrl) - pages->sb_width) {
if(style->sb_mode == LV_PAGE_SB_MODE_AUTO ) {
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;
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;
lv_inv_area(&page_ext->sbh);
}
}
break;
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->sbv_draw = 0;
lv_inv_area(&page_ext->sbh);
lv_inv_area(&page_ext->sbv);
area_t sb_area_tmp;
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;
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;
/*Draw the scrollbars*/
area_t sb_area;
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) {
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 obj_w = lv_obj_get_width(page);
cord_t obj_h = lv_obj_get_height(page);
cord_t page_x0 = page->cords.x1;
cord_t page_y0 = page->cords.y1;
cord_t sbh_pad = max(style->sb_width, style->bg_rects.hpad);
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_ON) {
page_ext->sbh_draw = 1;
page_ext->sbv_draw = 1;
}
/*Invalidate the current (old) scrollbar areas*/
if(page_ext->sbh_draw != 0) lv_inv_area(&page_ext->sbh);
if(page_ext->sbv_draw != 0) lv_inv_area(&page_ext->sbv);
area_t sb_area_tmp;
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*/
if(scrl_w <= obj_w - 2 * hpad) { /*Full sized scroll bar*/
area_set_width(&page_ext->sbh, obj_w - style->sb_width);
area_set_pos(&page_ext->sbh, page_x0, page_y0 + obj_h - style->sb_width);
page_ext->sbh_draw = 0;
area_set_width(&page_ext->sbh, obj_w - 2 * sbh_pad);
area_set_pos(&page_ext->sbh, sbh_pad, obj_h - style->sb_width);
} else {
if(style->sb_mode == LV_PAGE_SB_MODE_ON) {
page_ext->sbh_draw = 1;
}
size_tmp = (obj_w * (obj_w - (2 * style->sb_width))) / (scrl_w + 2 * hpad);
size_tmp = (obj_w * (obj_w - (2 * sbh_pad))) / (scrl_w + 2 * hpad);
area_set_width(&page_ext->sbh, size_tmp);
area_set_pos(&page_ext->sbh, page_x0 + style->sb_width +
(-(lv_obj_get_x(scrl) - hpad) * (obj_w - size_tmp - 2 * style->sb_width)) /
(scrl_w + 2 * hpad - obj_w ),
page_y0 + obj_h - style->sb_width);
area_set_pos(&page_ext->sbh, sbh_pad +
(-(lv_obj_get_x(scrl) - hpad) * (obj_w - size_tmp - 2 * sbh_pad)) /
(scrl_w + 2 * hpad - obj_w ), obj_h - style->sb_width);
}
/*Vertical scrollbar*/
if(scrl_h <= obj_h - 2 * vpad) { /*Full sized scroll bar*/
area_set_height(&page_ext->sbv, obj_h - style->sb_width);
area_set_pos(&page_ext->sbv, page_x0 + obj_w - style->sb_width, 0);
page_ext->sbv_draw = 0;
area_set_height(&page_ext->sbv, obj_h - 2 * sbv_pad);
area_set_pos(&page_ext->sbv, obj_w - style->sb_width, sbv_pad);
} else {
if(style->sb_mode == LV_PAGE_SB_MODE_ON) {
page_ext->sbv_draw = 1;
}
size_tmp = (obj_h * (obj_h - (2 * style->sb_width))) / (scrl_h + 2 * vpad);
size_tmp = (obj_h * (obj_h - (2 * sbv_pad))) / (scrl_h + 2 * vpad);
area_set_height(&page_ext->sbv, size_tmp);
area_set_pos(&page_ext->sbv, page_x0 + obj_w - style->sb_width,
page_y0 + style->sb_width +
(-(lv_obj_get_y(scrl) - vpad) * (obj_h - size_tmp - 2 * style->sb_width)) /
area_set_pos(&page_ext->sbv, obj_w - style->sb_width,
sbv_pad +
(-(lv_obj_get_y(scrl) - vpad) * (obj_h - size_tmp - 2 * sbv_pad)) /
(scrl_h + 2 * vpad - obj_h ));
}
/*Invalidate the new scrollbar areas*/
if(page_ext->sbh_draw != 0) lv_inv_area(&page_ext->sbh);
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);
}
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment