diff --git a/lv_objx/lv_page.c b/lv_objx/lv_page.c index e36ca7f48..8c7f98741 100644 --- a/lv_objx/lv_page.c +++ b/lv_objx/lv_page.c @@ -456,8 +456,10 @@ void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, uint16_t anim_time) /* Be sure there is no position changing animation in progress * because it can overide the current changes*/ lv_anim_del(page, (lv_anim_fp_t)lv_obj_set_y); + lv_anim_del(page, (lv_anim_fp_t)lv_obj_set_x); lv_anim_del(page, (lv_anim_fp_t)lv_obj_set_pos); lv_anim_del(ext->scrl, (lv_anim_fp_t)lv_obj_set_y); + lv_anim_del(ext->scrl, (lv_anim_fp_t)lv_obj_set_x); lv_anim_del(ext->scrl, (lv_anim_fp_t)lv_obj_set_pos); #endif @@ -469,8 +471,15 @@ void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, uint16_t anim_time) lv_coord_t scrlable_y = lv_obj_get_y(ext->scrl); lv_coord_t page_h = lv_obj_get_height(page); + lv_coord_t obj_x = obj->coords.x1 - ext->scrl->coords.x1; + lv_coord_t obj_w = lv_obj_get_width(obj); + lv_coord_t scrlable_x = lv_obj_get_x(ext->scrl); + lv_coord_t page_w = lv_obj_get_width(page); + lv_coord_t top_err = -(scrlable_y + obj_y); lv_coord_t bot_err = scrlable_y + obj_y + obj_h - page_h; + lv_coord_t left_err = -(scrlable_x + obj_x); + lv_coord_t right_err = scrlable_x + obj_x + obj_w - page_w; /*If obj is higher then the page focus where the "error" is smaller*/ @@ -488,6 +497,21 @@ void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, uint16_t anim_time) scrlable_y = -(obj_y + style_scrl->body.padding.ver + style->body.padding.ver); scrlable_y -= style_scrl->body.padding.ver; scrlable_y += page_h - obj_h; + } + /*Out of the page on the left*/ + if((obj_w <= page_w && left_err > 0) || + (obj_w > page_w && left_err < right_err)) { + /*Calculate a new position and let some space above*/ + scrlable_x = -(obj_x - style_scrl->body.padding.ver - style->body.padding.ver); + scrlable_x += style_scrl->body.padding.ver; + } + /*Out of the page on the right*/ + else if((obj_w <= page_w && right_err > 0) || + (obj_w > page_w && left_err >= right_err)) { + /*Calculate a new position and let some space below*/ + scrlable_x = -(obj_x + style_scrl->body.padding.ver + style->body.padding.ver); + scrlable_x -= style_scrl->body.padding.ver; + scrlable_x += page_w - obj_w; } else { /*Already in focus*/ return; @@ -495,6 +519,7 @@ void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, uint16_t anim_time) if(anim_time == 0) { lv_obj_set_y(ext->scrl, scrlable_y); + lv_obj_set_x(ext->scrl, scrlable_x); #if USE_LV_ANIMATION } else { lv_anim_t a; @@ -509,6 +534,12 @@ void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, uint16_t anim_time) a.path = lv_anim_path_linear; a.fp = (lv_anim_fp_t) lv_obj_set_y; lv_anim_create(&a); + + a.start = lv_obj_get_x(ext->scrl); + a.end = scrlable_x; + a.var = ext->scrl; + a.fp = (lv_anim_fp_t) lv_obj_set_x; + lv_anim_create(&a); #endif } }