From ad0d990c55f46d614085728a21fd058b5853ac42 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Wed, 9 Sep 2026 07:34:48 +0800 Subject: [PATCH] Center indexed param/timbre labels as one block and nudge section digits. Fixes the left-biased index+name layout, unifies index-name gap across rows, and shifts play-section numbers +2px per UI markup. Co-authored-by: Cursor --- UI/UI_global.c | 94 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 24 deletions(-) diff --git a/UI/UI_global.c b/UI/UI_global.c index 019833e..2231bd8 100644 --- a/UI/UI_global.c +++ b/UI/UI_global.c @@ -443,6 +443,58 @@ void Show_Battery_Icon(uint8_t flag) } +/* 中英文混排像素宽(与 LCD_GetMixedStringWidth 规则一致:CJK=sizey,ASCII=UI0902_ASCII_W) */ +static uint16_t UI_MixedTextWidth(const uint8_t *str, uint8_t sizey) +{ + uint16_t width = 0; + uint8_t ascii_w = UI0902_ASCII_W(sizey); + + if (str == NULL) + return 0; + while (*str != '\0') { + if (*str > 0x80) { + width = (uint16_t)(width + sizey); + str += 2; + } else { + width = (uint16_t)(width + ascii_w); + str += 1; + } + } + return width; +} + +/* 曲目/音色共用:序号与名称间距(与「1.名称」拼接一致,保证两行视觉间距相同) */ +#define UI0902_INDEX_NAME_GAP 0 + +/* 在 [x1,x2] 内整体居中绘制「N.」+ 名称(无渐变,show_Param 用) */ +static void UI_DrawIndexedName_Mixed(uint16_t x1, uint16_t x2, uint16_t text_y, + const char *num, const char *name, + uint16_t fc, uint16_t bc, uint8_t sizey) +{ + char line[48] = {0}; + snprintf(line, sizeof(line), "%s%s", num, name); + LCD_ShowMixedString(x1, x2, text_y, (uint8_t *)line, LCD_ALIGN_CENTER, + fc, bc, sizey, 1); +} + +/* 在 [x1,x2] 内整体居中绘制「N.」+ 中文名(渐变底,音色行用);间隙与曲目行一致 */ +static void UI_DrawIndexedName_Grad(uint16_t x1, uint16_t x2, uint16_t text_y, + const char *num, const uint8_t *name, + uint16_t fc, uint16_t c_top, uint16_t c_bot, uint8_t sizey) +{ + uint16_t num_w = (uint16_t)(strlen(num) * UI0902_ASCII_W(sizey)); + uint16_t name_w = UI_MixedTextWidth(name, sizey); + uint16_t total_w = (uint16_t)(num_w + UI0902_INDEX_NAME_GAP + name_w); + uint16_t area_w = (x2 > x1) ? (uint16_t)(x2 - x1) : 0; + uint16_t start_x = (total_w >= area_w) ? x1 : (uint16_t)(x1 + (area_w - total_w) / 2); + uint16_t name_x = (uint16_t)(start_x + num_w + UI0902_INDEX_NAME_GAP); + + LCD_ShowString_AutoAlign_Gradient(start_x, (uint16_t)(start_x + num_w), text_y, + (const uint8_t *)num, LCD_ALIGN_LEFT, fc, c_top, c_bot, sizey); + LCD_ShowChinese_AutoAlign_Gradient(name_x, x2, text_y, name, LCD_ALIGN_LEFT, + fc, c_top, c_bot, sizey); +} + void show_Param(const LEBEL_UI *UI, GUI_SWITCH *Group) { char Textstr_new[40] = {0}; @@ -453,6 +505,7 @@ void show_Param(const LEBEL_UI *UI, GUI_SWITCH *Group) const uint16_t text_y = row_y + (row_h - UI->Text_size) / 2 + 1; uint8_t idx = Group->Current + 1; uint16_t c_top, c_bot; + uint16_t x1, x2; UI_GetFocusGrad(GUI_MODE_PARAM, &c_top, &c_bot); @@ -464,18 +517,16 @@ void show_Param(const LEBEL_UI *UI, GUI_SWITCH *Group) c_top, c_bot ); - // 拼接序号 1. 2. 3. + /* 序号+名称整体居中(约等于标注「右移7px」的视觉效果) */ sprintf(NumBuf, "%d.", idx); - uint16_t num_w = (uint16_t)(strlen(NumBuf) * UI0902_ASCII_W(UI->Text_size)); if (Group->Id == EXPRESS_MODE_PARAM && Group->Current < LOCAL_SONG_COUNT) strcpy(Textstr_new, LocalSongNameGbk[Group->Current]); else GET_ParamNum_Str(Group->Current, 0, Textstr_new, Group->Id); - uint32_t string_start_x = LCD_ShowMixedString(UI->x+10, UI->x + UI->w, text_y, (uint8_t *)Textstr_new , LCD_ALIGN_CENTER, WHITE, BLACK, UI->Text_size, 1); - //序号X = 中文起点 - 数字宽度 - 5,间�?像素 - uint16_t num_x = string_start_x - num_w; - // 绘制左侧数字序号 - LCD_ShowString(num_x, text_y, (const uint8_t *)NumBuf, UI->Text_fc, UI->Text_bc, UI->Text_size, 1); + x1 = (uint16_t)(UI->x + 10); + x2 = (uint16_t)(UI->x + UI->w - 10); + UI_DrawIndexedName_Mixed(x1, x2, text_y, NumBuf, Textstr_new, + WHITE, BLACK, UI->Text_size); } @@ -851,22 +902,17 @@ void label_TimbreSelece_ui(const LEBEL_UI *UI, GUI_SWITCH * Group) c_top, c_bot ); sprintf(NumBuf, "%d.", idx); - uint16_t num_w = (uint16_t)(strlen(NumBuf) * UI0902_ASCII_W(UI->Text_size)); GET_Num_Str(mGuiData[UI->Id].Current, 0, (char*)Textstr, UI->Id); - uint32_t chinese_start_x = LCD_ShowChinese_AutoAlign_Gradient( - UI->x + num_w, - UI->x + UI->w, - text_y, - (const uint8_t*)Textstr, - UI->Text_Align, - UI->Text_fc, - c_top, c_bot, - UI->Text_size - ); - uint16_t num_x = chinese_start_x - num_w - 5; - LCD_ShowString_AutoAlign_Gradient(num_x, num_x + num_w, text_y, - (const uint8_t *)NumBuf, LCD_ALIGN_LEFT, UI->Text_fc, - c_top, c_bot, UI->Text_size); + UI_DrawIndexedName_Grad( + (uint16_t)(UI->x + 10), + (uint16_t)(UI->x + UI->w - 10), + text_y, + NumBuf, + Textstr, + UI->Text_fc, + c_top, c_bot, + UI->Text_size + ); switch(Group->Id) { case GUI_TIMBRE_SELECT: @@ -988,7 +1034,7 @@ void Draw_Tab_Section_Menu(const LEBEL_UI *UI, TAB_SECTION_INDEX select_tab) const uint8_t pitch = UI0902_SECTION_PITCH; const uint16_t start_x = UI0902_MARGIN_X; /* 0902-04:12/69/126/183 */ const uint16_t start_y = UI->y; - /* 0819:演奏段落数字与标题同为 13,按钮内垂直居中(视觉重心 +1) */ + /* 0819:演奏段落数字与标题同为 13,按钮内垂直居中(视觉重心 +1);稿面数字整体右移 2px */ const uint16_t text_y = start_y + (tab_h - UI0902_FONT_BODY) / 2 + 1; const char *nums[4] = {"1", "2", "3", "4"}; uint8_t i; @@ -999,7 +1045,7 @@ void Draw_Tab_Section_Menu(const LEBEL_UI *UI, TAB_SECTION_INDEX select_tab) uint16_t bg = (select_tab == i) ? COLOR_GRAD_MID : UI0902_ROW_BG; LCD_FillRoundRect(x, start_y, tab_w, tab_h, tab_r, bg); LCD_ShowString_AutoAlign( - x, (uint16_t)(x + tab_w - 1), text_y, + (uint16_t)(x + 2), (uint16_t)(x + tab_w - 1 + 2), text_y, (const uint8_t*)nums[i], UI->Text_Align, WHITE,