mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-24 16:21:04 +00:00
38 lines
1 KiB
Rust
38 lines
1 KiB
Rust
use ratatui::{buffer::Buffer, layout::{Margin, Rect}, widgets::{ListItem, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget, Widget}};
|
|
use yazi_config::THEME;
|
|
use yazi_core::Core;
|
|
use yazi_widgets::Scrollable;
|
|
|
|
pub(crate) struct List<'a> {
|
|
core: &'a Core,
|
|
}
|
|
|
|
impl<'a> List<'a> {
|
|
pub(crate) fn new(core: &'a Core) -> Self { Self { core } }
|
|
}
|
|
|
|
impl Widget for List<'_> {
|
|
fn render(self, area: Rect, buf: &mut Buffer) {
|
|
let pick = &self.core.pick;
|
|
|
|
// Vertical scrollbar
|
|
if pick.total() > pick.limit() {
|
|
Scrollbar::new(ScrollbarOrientation::VerticalRight).render(
|
|
area,
|
|
buf,
|
|
&mut ScrollbarState::new(pick.total()).position(pick.cursor),
|
|
);
|
|
}
|
|
|
|
// List content
|
|
let inner = area.inner(Margin::new(1, 0));
|
|
let items = pick.window().map(|(i, v)| {
|
|
if i == pick.cursor {
|
|
ListItem::new(format!(" {v}")).style(THEME.pick.active)
|
|
} else {
|
|
ListItem::new(format!(" {v}")).style(THEME.pick.inactive)
|
|
}
|
|
});
|
|
Widget::render(ratatui::widgets::List::new(items), inner, buf);
|
|
}
|
|
}
|