diff options
Diffstat (limited to 'src/ui/status.rs')
| -rw-r--r-- | src/ui/status.rs | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/ui/status.rs b/src/ui/status.rs index a3aa78fa..a49a53f6 100644 --- a/src/ui/status.rs +++ b/src/ui/status.rs @@ -6,6 +6,7 @@ use ratatui::{ Frame, }; +use super::text::display_width_u16; use super::widgets::panel_contrast_fg; use crate::{ app::state::{CopyFeedback, Palette, ToastKind, ToastNotification}, @@ -54,7 +55,9 @@ pub(crate) fn toast_notification_rect( offset_for_warning: bool, position: ToastHerdrPosition, ) -> Rect { - let content_width = (toast.title.len().max(toast.context.len()) as u16) + 4; + let content_width = display_width_u16(&toast.title) + .max(display_width_u16(&toast.context)) + .saturating_add(4); let width = content_width.saturating_add(2).min(area.width); let content_height = if toast.context.is_empty() { 1 } else { 2 }; let height = (content_height + 2).min(area.height); @@ -281,6 +284,25 @@ mod tests { } #[test] + fn toast_rect_uses_display_width_for_cjk_labels() { + let area = Rect::new(0, 0, 100, 20); + let toast = ToastNotification { + kind: ToastKind::NeedsAttention, + title: "重构用户认证模块".to_string(), + context: "提交 herdr 的反馈".to_string(), + position: None, + target: None, + }; + + let rect = toast_notification_rect(area, &toast, false, ToastHerdrPosition::TopRight); + + let expected_content_width = + display_width_u16(&toast.title).max(display_width_u16(&toast.context)) + 6; + assert_eq!(rect.width, expected_content_width); + assert_eq!(rect.x + rect.width, area.x + area.width); + } + + #[test] fn copy_feedback_rect_uses_configured_position() { let area = Rect::new(10, 20, 100, 40); let feedback = feedback(); |
