mirror of
https://github.com/lvgl/lvgl.git
synced 2024-12-12 11:04:06 +08:00
fix(obj) fix infinit loop in object repositioning
This commit is contained in:
parent
e1355dbeee
commit
88979ccff9
@ -96,45 +96,59 @@ void lv_obj_refr_size(lv_obj_t * obj)
|
||||
if(parent == NULL) return;
|
||||
|
||||
lv_coord_t w;
|
||||
lv_coord_t h;
|
||||
if(obj->w_layout) w = lv_obj_get_width(obj);
|
||||
else w = lv_obj_get_style_width(obj, LV_PART_MAIN);
|
||||
if(obj->h_layout) h = lv_obj_get_height(obj);
|
||||
else h = lv_obj_get_style_height(obj, LV_PART_MAIN);
|
||||
|
||||
/*Calculate the required auto sizes*/
|
||||
bool w_content = w == LV_SIZE_CONTENT ? true : false;
|
||||
bool h_content = h == LV_SIZE_CONTENT ? true : false;
|
||||
lv_coord_t sl_ori = lv_obj_get_scroll_left(obj);
|
||||
bool w_content = false;
|
||||
if(obj->w_layout) {
|
||||
w = lv_obj_get_width(obj);
|
||||
} else {
|
||||
w = lv_obj_get_style_width(obj, LV_PART_MAIN);
|
||||
w_content = w == LV_SIZE_CONTENT ? true : false;
|
||||
|
||||
/*Be sure the object is not scrolled when it has auto size*/
|
||||
lv_coord_t sl_ori = lv_obj_get_scroll_left(obj);
|
||||
if(w_content) lv_obj_scroll_to_x(obj, 0, LV_ANIM_OFF);
|
||||
lv_coord_t st_ori = lv_obj_get_scroll_top(obj);
|
||||
if(h_content) lv_obj_scroll_to_y(obj, 0, LV_ANIM_OFF);
|
||||
if(w_content) {
|
||||
lv_obj_scroll_to_x(obj, 0, LV_ANIM_OFF);
|
||||
calc_auto_size(obj, &w, NULL);
|
||||
}
|
||||
|
||||
if(w_content && h_content) calc_auto_size(obj, &w, &h);
|
||||
else if(w_content) calc_auto_size(obj, &w, NULL);
|
||||
else if(h_content) calc_auto_size(obj, NULL, &h);
|
||||
|
||||
/*Calculate the required auto sizes*/
|
||||
/*Calculate the sizes in percentage*/
|
||||
bool pct_w = LV_COORD_IS_PCT(w) ? true : false;
|
||||
bool pct_h = LV_COORD_IS_PCT(h) ? true : false;
|
||||
|
||||
lv_coord_t parent_w = lv_obj_get_width_fit(parent);
|
||||
lv_coord_t parent_h = lv_obj_get_height_fit(parent);
|
||||
if(pct_w) w = (LV_COORD_GET_PCT(w) * parent_w) / 100;
|
||||
if(pct_h) h = (LV_COORD_GET_PCT(h) * parent_h) / 100;
|
||||
|
||||
w += lv_obj_get_style_transform_width(obj, LV_PART_MAIN);
|
||||
h += lv_obj_get_style_transform_height(obj, LV_PART_MAIN);
|
||||
|
||||
lv_coord_t minw = lv_obj_get_style_min_width(obj, LV_PART_MAIN);
|
||||
lv_coord_t maxw = lv_obj_get_style_max_width(obj, LV_PART_MAIN);
|
||||
w = lv_clamp_width(w, minw, maxw, parent_w);
|
||||
}
|
||||
|
||||
lv_coord_t h;
|
||||
lv_coord_t st_ori = lv_obj_get_scroll_top(obj);
|
||||
bool h_content = false;
|
||||
if(obj->h_layout) {
|
||||
h = lv_obj_get_height(obj);
|
||||
} else {
|
||||
h = lv_obj_get_style_height(obj, LV_PART_MAIN);
|
||||
h_content = h == LV_SIZE_CONTENT ? true : false;
|
||||
|
||||
/*Be sure the object is not scrolled when it has auto size*/
|
||||
if(h_content) {
|
||||
lv_obj_scroll_to_y(obj, 0, LV_ANIM_OFF);
|
||||
calc_auto_size(obj, NULL, &h);
|
||||
}
|
||||
|
||||
/*Calculate the sizes in percentage*/
|
||||
bool pct_h = LV_COORD_IS_PCT(h) ? true : false;
|
||||
lv_coord_t parent_h = lv_obj_get_height_fit(parent);
|
||||
if(pct_h) h = (LV_COORD_GET_PCT(h) * parent_h) / 100;
|
||||
|
||||
h += lv_obj_get_style_transform_height(obj, LV_PART_MAIN);
|
||||
|
||||
lv_coord_t minh = lv_obj_get_style_min_height(obj, LV_PART_MAIN);
|
||||
lv_coord_t maxh = lv_obj_get_style_max_height(obj, LV_PART_MAIN);
|
||||
h = lv_clamp_width(h, minh, maxh, parent_h);
|
||||
}
|
||||
|
||||
/*calc_auto_size set the scroll x/y to 0 so revert the original value*/
|
||||
if(w_content || h_content) {
|
||||
|
Loading…
Reference in New Issue
Block a user