From e6dafd61328f94c0e8d427f43560ef0428540185 Mon Sep 17 00:00:00 2001 From: Gabor Date: Fri, 6 Jan 2017 13:28:10 +0100 Subject: [PATCH] lv_btnm: with a lot of buttons in row there was a minor position error --- lv_objx/lv_btnm.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lv_objx/lv_btnm.c b/lv_objx/lv_btnm.c index 3cdb8bd37..d788e2552 100644 --- a/lv_objx/lv_btnm.c +++ b/lv_objx/lv_btnm.c @@ -216,7 +216,8 @@ void lv_btnm_set_map(lv_obj_t * btnm, const char ** map) /* Count the units and the buttons in a line * (A button can be 1,2,3... unit wide)*/ - uint16_t unit_cnt; + uint16_t unit_cnt; /*Number of units in a row*/ + uint16_t unit_act_cnt; /*Number of units currently put in a row*/ uint16_t btn_cnt; /*Number of buttons in a row*/ uint16_t i_tot = 0; /*Act. index in the str map*/ uint16_t btn_i = 0; /*Act. index of button areas*/ @@ -243,17 +244,22 @@ void lv_btnm_set_map(lv_obj_t * btnm, const char ** map) uint16_t i; cord_t act_x = btnms->rects.hpad; cord_t act_unit_w; + unit_act_cnt = 0; for(i = 0; i < btn_cnt; i++) { /* one_unit_w = all_unit_w / unit_cnt * act_unit_w = one_unit_w * button_width - * do this two operation but the multiplications first to divide a greater number */ + * do this two operation but the multiply first to divide a greater number */ act_unit_w = (all_unit_w * lv_btnm_get_width_unit(map_p_tmp[i])) / unit_cnt; + + /*Always recalculate act_x because of rounding errors */ + act_x = (unit_act_cnt * all_unit_w) / unit_cnt + i * btnms->rects.opad + btnms->rects.hpad; + area_set(&ext->btn_areas[btn_i], act_x, act_y, act_x + act_unit_w, act_y + btn_h); - act_x += act_unit_w + btnms->rects.opad; + unit_act_cnt += lv_btnm_get_width_unit(map_p_tmp[i]); i_tot ++; btn_i ++; @@ -266,7 +272,6 @@ void lv_btnm_set_map(lv_obj_t * btnm, const char ** map) } lv_obj_inv(btnm); - } /** @@ -388,7 +393,7 @@ static bool lv_btnm_design(lv_obj_t * btnm, const area_t * mask, lv_design_mode_ lv_rects_t new_rects; lv_btn_state_t state; state = ext->btn_pr == btn_i ? LV_BTN_STATE_PR : LV_BTN_STATE_REL; - memcpy(&new_rects, &style->rects, sizeof(lv_rects_t)); + memcpy(&new_rects, &style->btns, sizeof(lv_rects_t)); new_rects.objs.color = style->btns.mcolor[state]; new_rects.gcolor = style->btns.gcolor[state]; new_rects.bcolor = style->btns.bcolor[state];