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 <cursoragent@cursor.com>
This commit is contained in:
parent
f1f9520637
commit
ad0d990c55
|
|
@ -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)
|
void show_Param(const LEBEL_UI *UI, GUI_SWITCH *Group)
|
||||||
{
|
{
|
||||||
char Textstr_new[40] = {0};
|
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;
|
const uint16_t text_y = row_y + (row_h - UI->Text_size) / 2 + 1;
|
||||||
uint8_t idx = Group->Current + 1;
|
uint8_t idx = Group->Current + 1;
|
||||||
uint16_t c_top, c_bot;
|
uint16_t c_top, c_bot;
|
||||||
|
uint16_t x1, x2;
|
||||||
|
|
||||||
UI_GetFocusGrad(GUI_MODE_PARAM, &c_top, &c_bot);
|
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
|
c_top, c_bot
|
||||||
);
|
);
|
||||||
|
|
||||||
// 拼接序号 1. 2. 3.
|
/* 序号+名称整体居中(约等于标注「右移7px」的视觉效果) */
|
||||||
sprintf(NumBuf, "%d.", idx);
|
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)
|
if (Group->Id == EXPRESS_MODE_PARAM && Group->Current < LOCAL_SONG_COUNT)
|
||||||
strcpy(Textstr_new, LocalSongNameGbk[Group->Current]);
|
strcpy(Textstr_new, LocalSongNameGbk[Group->Current]);
|
||||||
else
|
else
|
||||||
GET_ParamNum_Str(Group->Current, 0, Textstr_new, Group->Id);
|
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);
|
x1 = (uint16_t)(UI->x + 10);
|
||||||
//序号X = 中文起点 - 数字宽度 - 5,间<EFBC8C>?像素
|
x2 = (uint16_t)(UI->x + UI->w - 10);
|
||||||
uint16_t num_x = string_start_x - num_w;
|
UI_DrawIndexedName_Mixed(x1, x2, text_y, NumBuf, Textstr_new,
|
||||||
// 绘制左侧数字序号
|
WHITE, BLACK, UI->Text_size);
|
||||||
LCD_ShowString(num_x, text_y, (const uint8_t *)NumBuf, UI->Text_fc, UI->Text_bc, UI->Text_size, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -851,22 +902,17 @@ void label_TimbreSelece_ui(const LEBEL_UI *UI, GUI_SWITCH * Group)
|
||||||
c_top, c_bot
|
c_top, c_bot
|
||||||
);
|
);
|
||||||
sprintf(NumBuf, "%d.", idx);
|
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);
|
GET_Num_Str(mGuiData[UI->Id].Current, 0, (char*)Textstr, UI->Id);
|
||||||
uint32_t chinese_start_x = LCD_ShowChinese_AutoAlign_Gradient(
|
UI_DrawIndexedName_Grad(
|
||||||
UI->x + num_w,
|
(uint16_t)(UI->x + 10),
|
||||||
UI->x + UI->w,
|
(uint16_t)(UI->x + UI->w - 10),
|
||||||
text_y,
|
text_y,
|
||||||
(const uint8_t*)Textstr,
|
NumBuf,
|
||||||
UI->Text_Align,
|
Textstr,
|
||||||
UI->Text_fc,
|
UI->Text_fc,
|
||||||
c_top, c_bot,
|
c_top, c_bot,
|
||||||
UI->Text_size
|
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);
|
|
||||||
switch(Group->Id)
|
switch(Group->Id)
|
||||||
{
|
{
|
||||||
case GUI_TIMBRE_SELECT:
|
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 uint8_t pitch = UI0902_SECTION_PITCH;
|
||||||
const uint16_t start_x = UI0902_MARGIN_X; /* 0902-04:12/69/126/183 */
|
const uint16_t start_x = UI0902_MARGIN_X; /* 0902-04:12/69/126/183 */
|
||||||
const uint16_t start_y = UI->y;
|
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 uint16_t text_y = start_y + (tab_h - UI0902_FONT_BODY) / 2 + 1;
|
||||||
const char *nums[4] = {"1", "2", "3", "4"};
|
const char *nums[4] = {"1", "2", "3", "4"};
|
||||||
uint8_t i;
|
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;
|
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_FillRoundRect(x, start_y, tab_w, tab_h, tab_r, bg);
|
||||||
LCD_ShowString_AutoAlign(
|
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],
|
(const uint8_t*)nums[i],
|
||||||
UI->Text_Align,
|
UI->Text_Align,
|
||||||
WHITE,
|
WHITE,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue