diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 6bbba9d..f53fc11 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -962,25 +962,28 @@ pub fn draw(f: &mut Frame, app: &mut App) { f.render_widget(gauge, tuner_area); } - let controls = if is_jp { - vec![ - ("▶再生", "SPC"), - ("▶▶次", "]"), - ("◀◀前", "["), - ("音量+", "+"), - ("音量-", "-"), - ("消音", "m"), - ("電源", "q"), + // Bolt ⚡ Optimization: + // to avoid heavy allocations (e.g. format!) during the high frequency TUI render loop + // pre-calculate strings containing spaces and brackets here + let controls: &[(&str, &str)] = if is_jp { + &[ + (" ▶再生", " [SPC] "), + (" ▶▶次", " []] "), + (" ◀◀前", " [[] "), + (" 音量+", " [+] "), + (" 音量-", " [-] "), + (" 消音", " [m] "), + (" 電源", " [q] "), ] } else { - vec![ - ("PLAY", "SPC"), - ("SKIP", "]"), - ("PREV", "["), - ("VOL+", "+"), - ("VOL-", "-"), - ("MUTE", "m"), - ("EXIT", "q"), + &[ + (" PLAY", " [SPC] "), + (" SKIP", " []] "), + (" PREV", " [[] "), + (" VOL+", " [+] "), + (" VOL-", " [-] "), + (" MUTE", " [m] "), + (" EXIT", " [q] "), ] }; @@ -994,12 +997,12 @@ pub fn draw(f: &mut Frame, app: &mut App) { if i < btn_layout.len() { let btn_text = Line::from(vec![ Span::styled( - format!(" {}", label), + *label, Style::default() .fg(theme.primary) .add_modifier(Modifier::BOLD), ), - Span::styled(format!(" [{}] ", key), Style::default().fg(theme.dim)), + Span::styled(*key, Style::default().fg(theme.dim)), ]); let mut btn_block = Block::default()