diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 595399dd0..aa6e48880 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -48,7 +48,7 @@ #define LV_OBJX_NAME "lv_obj" #define LV_OBJ_DEF_WIDTH (LV_DPX(100)) #define LV_OBJ_DEF_HEIGHT (LV_DPX(50)) -#define GRID_DEBUG 0 /*Draw rectangles on grid cells*/ +#define GRID_DEBUG 1 /*Draw rectangles on grid cells*/ /********************** * TYPEDEFS @@ -1759,13 +1759,13 @@ static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area uint32_t row; uint32_t col; - for(row = 0; row < calc.row_dsc_len - 1; row ++) { - for(col = 0; col < calc.col_dsc_len - 1; col ++) { + for(row = 0; row < calc.row_num; row ++) { + for(col = 0; col < calc.col_num; col ++) { lv_area_t a; - a.x1 = grid_abs.x + calc.col_dsc[col]; - a.x2 = grid_abs.x + calc.col_dsc[col + 1]; - a.y1 = grid_abs.y + calc.row_dsc[row]; - a.y2 = grid_abs.y + calc.row_dsc[row + 1]; + a.x1 = grid_abs.x + calc.x[col]; + a.x2 = a.x1 + calc.w[col]; + a.y1 = grid_abs.y + calc.y[row]; + a.y2 = a.y1 + calc.h[row]; lv_draw_rect(&a, clip_area, &grid_rect_dsc); } } @@ -1914,6 +1914,17 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param) _lv_grid_full_refresh(obj); } } + + /* If the parent has an implicit grid in a direction and this object (whose child has changed) + * is stretched in that direction then the grid of the parent might have changed because + * the track size of implicit grids with stretched cells is calculated from the children bounding box.*/ + lv_obj_t * par = lv_obj_get_parent(obj); + if(par && _lv_obj_is_grid_item(obj) && + ((par->grid->col_dsc == NULL && _GRID_GET_CELL_FLAG(obj->x_set) == LV_GRID_STRETCH) || + (par->grid->row_dsc == NULL && _GRID_GET_CELL_FLAG(obj->y_set) == LV_GRID_STRETCH))) { + _lv_grid_full_refresh(par); + } + } else if(sign == LV_SIGNAL_SCROLL) { res = lv_event_send(obj, LV_EVENT_SCROLL, NULL); diff --git a/src/lv_core/lv_obj_pos.c b/src/lv_core/lv_obj_pos.c index e1a719fe9..ad78c3d34 100644 --- a/src/lv_core/lv_obj_pos.c +++ b/src/lv_core/lv_obj_pos.c @@ -264,19 +264,120 @@ void lv_obj_align(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, lv_co LV_ASSERT_OBJ(base, LV_OBJX_NAME); - lv_point_t new_pos; - _lv_area_align(&base->coords, &obj->coords, align, &new_pos); +// lv_point_t new_pos; +// _lv_area_align(&base->coords, &obj->coords, align, &new_pos); - /*Bring together the coordination system of base and obj*/ - lv_obj_t * par = lv_obj_get_parent(obj); - lv_coord_t par_abs_x = par->coords.x1; - lv_coord_t par_abs_y = par->coords.y1; - new_pos.x += x_ofs; - new_pos.y += y_ofs; - new_pos.x -= par_abs_x; - new_pos.y -= par_abs_y; - lv_obj_set_pos(obj, new_pos.x, new_pos.y); + lv_coord_t x; + lv_coord_t y; + switch(align) { + case LV_ALIGN_CENTER: + x = lv_obj_get_width_fit(base) / 2 - lv_obj_get_width_fit(obj) / 2; + y = lv_obj_get_height_fit(base) / 2 - lv_obj_get_height_fit(obj) / 2; + break; + case LV_ALIGN_IN_TOP_LEFT: + x = 0; + y = 0; + break; + case LV_ALIGN_IN_TOP_MID: + x = lv_obj_get_width_fit(base) / 2 - lv_obj_get_width_fit(obj) / 2; + y = 0; + break; + + case LV_ALIGN_IN_TOP_RIGHT: + x = lv_obj_get_width_fit(base) - lv_obj_get_width_fit(obj); + y = 0; + break; + + case LV_ALIGN_IN_BOTTOM_LEFT: + x = 0; + y = lv_obj_get_height_fit(base) - lv_obj_get_height_fit(obj); + break; + case LV_ALIGN_IN_BOTTOM_MID: + x = lv_obj_get_width_fit(base) / 2 - lv_obj_get_width_fit(obj) / 2; + y = lv_obj_get_height_fit(base) - lv_obj_get_height_fit(obj); + break; + + case LV_ALIGN_IN_BOTTOM_RIGHT: + x = lv_obj_get_width_fit(base) - lv_obj_get_width_fit(obj); + y = lv_obj_get_height_fit(base) - lv_obj_get_height_fit(obj); + break; + + case LV_ALIGN_IN_LEFT_MID: + x = 0; + y = lv_obj_get_height_fit(base) / 2 - lv_obj_get_height_fit(obj) / 2; + break; + + case LV_ALIGN_IN_RIGHT_MID: + x = lv_obj_get_width_fit(base) - lv_obj_get_width_fit(obj); + y = lv_obj_get_height_fit(base) / 2 - lv_obj_get_height_fit(obj) / 2; + break; + + case LV_ALIGN_OUT_TOP_LEFT: + x = 0; + y = -lv_obj_get_height_fit(obj); + break; + + case LV_ALIGN_OUT_TOP_MID: + x = lv_obj_get_width_fit(base) / 2 - lv_obj_get_width_fit(obj) / 2; + y = -lv_obj_get_height_fit(obj); + break; + + case LV_ALIGN_OUT_TOP_RIGHT: + x = lv_obj_get_width_fit(base) - lv_obj_get_width_fit(obj); + y = -lv_obj_get_height_fit(obj); + break; + + case LV_ALIGN_OUT_BOTTOM_LEFT: + x = 0; + y = lv_obj_get_height_fit(base); + break; + + case LV_ALIGN_OUT_BOTTOM_MID: + x = lv_obj_get_width_fit(base) / 2 - lv_obj_get_width_fit(obj) / 2; + y = lv_obj_get_height_fit(base); + break; + + case LV_ALIGN_OUT_BOTTOM_RIGHT: + x = lv_obj_get_width_fit(base) - lv_obj_get_width_fit(obj); + y = lv_obj_get_height_fit(base); + break; + + case LV_ALIGN_OUT_LEFT_TOP: + x = -lv_obj_get_width_fit(obj); + y = 0; + break; + + case LV_ALIGN_OUT_LEFT_MID: + x = -lv_obj_get_width_fit(obj); + y = lv_obj_get_height_fit(base) / 2 - lv_obj_get_height_fit(obj) / 2; + break; + + case LV_ALIGN_OUT_LEFT_BOTTOM: + x = -lv_obj_get_width_fit(obj); + y = lv_obj_get_height_fit(base) - lv_obj_get_height_fit(obj); + break; + + case LV_ALIGN_OUT_RIGHT_TOP: + x = lv_obj_get_width_fit(base); + y = 0; + break; + + case LV_ALIGN_OUT_RIGHT_MID: + x = lv_obj_get_width_fit(base); + y = lv_obj_get_height_fit(base) / 2 - lv_obj_get_height_fit(obj) / 2; + break; + + case LV_ALIGN_OUT_RIGHT_BOTTOM: + x = lv_obj_get_width_fit(base); + y = lv_obj_get_height_fit(base) - lv_obj_get_height_fit(obj); + break; + } + + x += x_ofs; + y += y_ofs; + + lv_obj_set_pos(obj, x, y); } diff --git a/src/lv_misc/lv_anim.c b/src/lv_misc/lv_anim.c index 37e62a9f7..4996eb8b1 100644 --- a/src/lv_misc/lv_anim.c +++ b/src/lv_misc/lv_anim.c @@ -314,7 +314,7 @@ lv_anim_value_t lv_anim_path_ease_in_out(const lv_anim_path_t * path, const lv_a else t = (uint32_t)((uint32_t)a->act_time * 1024) / a->time; - int32_t step = _lv_bezier3(t, 0, 0, 1024, 1024); + int32_t step = _lv_bezier3(t, 0, 64, 1024 - 64, 1024); int32_t new_value; new_value = (int32_t)step * (a->end - a->start); diff --git a/src/lv_misc/lv_mem.c b/src/lv_misc/lv_mem.c index 3ef1bd9ae..c943aa674 100644 --- a/src/lv_misc/lv_mem.c +++ b/src/lv_misc/lv_mem.c @@ -25,7 +25,7 @@ *********************/ /*Add memory junk on alloc (0xaa) and free(0xbb) (just for testing purposes)*/ #ifndef LV_MEM_ADD_JUNK - #define LV_MEM_ADD_JUNK 0 + #define LV_MEM_ADD_JUNK 1 #endif #ifndef LV_MEM_FULL_DEFRAG_CNT diff --git a/src/lv_widgets/lv_btn.c b/src/lv_widgets/lv_btn.c index b30744c3d..02c6a730b 100644 --- a/src/lv_widgets/lv_btn.c +++ b/src/lv_widgets/lv_btn.c @@ -71,6 +71,7 @@ lv_obj_t * lv_btn_create(lv_obj_t * parent, const lv_obj_t * copy) /*Set layout if the button is not a screen*/ if(parent) { lv_obj_set_size(btn, LV_DPI, LV_DPI / 3); + lv_obj_clear_flag(btn, LV_OBJ_FLAG_SCROLLABLE); } lv_theme_apply(btn, LV_THEME_BTN);