diff options
author | Cyandev <unixzii@gmail.com> | 2024-03-09 13:16:33 +0800 |
---|---|---|
committer | Cyandev <unixzii@gmail.com> | 2024-03-09 13:16:33 +0800 |
commit | 120a08aefeed9581f5d9110861b15ee0cbcd5831 (patch) | |
tree | f2d5e0f39712f78c51aa6fc042df3be6ebf50f18 | |
parent | b79fde47d07a712101ab97127fc3b23acd105b13 (diff) |
Add scrollbar for main list
-rw-r--r-- | src/interactive/widgets/entries.rs | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/interactive/widgets/entries.rs b/src/interactive/widgets/entries.rs index c4794f4..e3b6cea 100644 --- a/src/interactive/widgets/entries.rs +++ b/src/interactive/widgets/entries.rs @@ -11,10 +11,10 @@ use std::collections::HashSet; use std::time::SystemTime; use tui::{ buffer::Buffer, - layout::Rect, + layout::{Margin, Rect}, style::{Color, Modifier, Style}, text::Span, - widgets::{Block, Borders}, + widgets::{Block, Borders, Scrollbar, ScrollbarOrientation, ScrollbarState, StatefulWidget}, }; use tui_react::util::rect::line_bound; use tui_react::{ @@ -132,8 +132,25 @@ impl Entries { columns_with_separators(columns, percentage_style, false) }); + let line_count = lines.len(); list.render(props, lines, area, buf); + let scrollbar = Scrollbar::default() + .orientation(ScrollbarOrientation::VerticalRight) + .begin_symbol(None) + .end_symbol(None); + let scroll_offset = selected + .and_then(|selected_idx| { + entries + .iter() + .find_position(|bundle| bundle.index == selected_idx) + .map(|(pos, _)| pos) + }) + .unwrap_or(list.offset); + let mut scrollbar_state = ScrollbarState::new(line_count).position(scroll_offset); + + scrollbar.render(area.inner(&Margin::new(0, 1)), buf, &mut scrollbar_state); + if *is_focussed { let bound = draw_top_right_help(area, &title, buf); draw_bottom_right_help(bound, buf); |