mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-21 14:51:03 +00:00
42 lines
1 KiB
Rust
42 lines
1 KiB
Rust
use std::ops::ControlFlow;
|
|
|
|
use ratatui_core::layout::{Constraint, Layout, Rect};
|
|
use tokio::task::JoinHandle;
|
|
|
|
use super::{Message, NOTIFY_SPACING};
|
|
|
|
#[derive(Default)]
|
|
pub struct Notify {
|
|
pub ticker: Option<JoinHandle<()>>,
|
|
pub messages: Vec<Message>,
|
|
}
|
|
|
|
impl Notify {
|
|
pub fn available(area: Rect) -> Rect {
|
|
let chunks = Layout::horizontal([Constraint::Fill(1), Constraint::Min(80)]).split(area);
|
|
let chunks = Layout::vertical([Constraint::Fill(1), Constraint::Max(1)]).split(chunks[1]);
|
|
chunks[0]
|
|
}
|
|
|
|
pub fn limit(&self, area: Rect) -> usize {
|
|
if self.messages.is_empty() {
|
|
return 0;
|
|
}
|
|
|
|
let mut height = area.height as usize;
|
|
let flow = (0..self.messages.len().min(3)).try_fold(0, |acc, i| {
|
|
match height.checked_sub(self.messages[i].height(area.width) + NOTIFY_SPACING as usize) {
|
|
Some(h) => {
|
|
height = h;
|
|
ControlFlow::Continue(acc + 1)
|
|
}
|
|
None => ControlFlow::Break(acc),
|
|
}
|
|
});
|
|
|
|
1.max(match flow {
|
|
ControlFlow::Continue(i) => i,
|
|
ControlFlow::Break(i) => i,
|
|
})
|
|
}
|
|
}
|