yazi/yazi-fm/src/confirm/list.rs
2024-11-13 11:38:11 +08:00

46 lines
1.2 KiB
Rust

use ratatui::{buffer::Buffer, layout::{Margin, Rect}, widgets::{Block, Borders, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget, Widget, Wrap}};
use yazi_config::THEME;
use crate::Ctx;
pub(crate) struct List<'a> {
cx: &'a Ctx,
}
impl<'a> List<'a> {
pub(crate) fn new(cx: &'a Ctx) -> Self { Self { cx } }
}
impl Widget for List<'_> {
fn render(self, mut area: Rect, buf: &mut Buffer) {
// List content area
let inner = area.inner(Margin::new(2, 0));
// Bottom border
let block = Block::new().borders(Borders::BOTTOM).border_style(THEME.confirm.border);
block.clone().render(area.inner(Margin::new(1, 0)), buf);
let list = self
.cx
.confirm
.list
.clone()
.scroll((self.cx.confirm.offset as u16, 0))
.block(block)
.style(THEME.confirm.list)
.wrap(Wrap { trim: false });
// Vertical scrollbar
let lines = list.line_count(inner.width);
if lines >= inner.height as usize {
area.height = area.height.saturating_sub(1);
Scrollbar::new(ScrollbarOrientation::VerticalRight).render(
area,
buf,
&mut ScrollbarState::new(lines).position(self.cx.confirm.offset),
);
}
list.render(inner, buf);
}
}