From b4d1174f46403810172eaff7a4670b507e962877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Tue, 3 Dec 2024 23:59:18 +0800 Subject: [PATCH] feat: move notification from top-right to bottom-right corner to avoid covering content as much as possible (#1984) --- yazi-fm/src/notify/notify.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/yazi-fm/src/notify/notify.rs b/yazi-fm/src/notify/notify.rs index ce94aa6c..d698dfd4 100644 --- a/yazi-fm/src/notify/notify.rs +++ b/yazi-fm/src/notify/notify.rs @@ -14,18 +14,21 @@ impl<'a> Notify<'a> { let chunks = layout::Layout::horizontal([Constraint::Fill(1), Constraint::Min(80)]).split(area); let chunks = - layout::Layout::vertical([Constraint::Max(1), Constraint::Fill(1)]).split(chunks[1]); + layout::Layout::vertical([Constraint::Fill(1), Constraint::Max(1)]).split(chunks[1]); - chunks[1] + chunks[0] } - fn tile(area: Rect, messages: &[Message]) -> Vec { + fn tiles<'m>(area: Rect, messages: impl Iterator + Clone) -> Vec { layout::Layout::vertical( - messages.iter().map(|m| Constraint::Length(m.height(area.width) as u16)), + [Constraint::Fill(1)] + .into_iter() + .chain(messages.clone().map(|m| Constraint::Length(m.height(area.width) as u16))), ) .spacing(1) .split(area) .iter() + .skip(1) .zip(messages) .map(|(&(mut r), m)| { if r.width > m.max_width as u16 { @@ -41,15 +44,15 @@ impl<'a> Notify<'a> { impl Widget for Notify<'_> { fn render(self, area: Rect, buf: &mut Buffer) { let notify = &self.cx.notify; - let available = Self::available(area); - let limit = notify.limit(available); - let tile = Self::tile(available, ¬ify.messages[..limit]); - for (i, m) in notify.messages.iter().enumerate().take(limit) { + let messages = notify.messages.iter().take(notify.limit(available)).rev(); + let tiles = Self::tiles(available, messages.clone()); + + for (i, m) in messages.enumerate() { let mut rect = - tile[i].offset(Offset { x: (100 - m.percent) as i32 * tile[i].width as i32 / 100, y: 0 }); - rect.width -= rect.x - tile[i].x; + tiles[i].offset(Offset { x: (100 - m.percent) as i32 * tiles[i].width as i32 / 100, y: 0 }); + rect.width -= rect.x - tiles[i].x; yazi_plugin::elements::Clear::default().render(rect, buf); Paragraph::new(m.content.as_str())