aboutsummaryrefslogtreecommitdiff
path: root/src/ui/status.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/status.rs')
-rw-r--r--src/ui/status.rs24
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();