diff options
| author | lukeflo | 2024-10-09 22:22:10 +0200 |
|---|---|---|
| committer | lukeflo | 2024-10-12 22:41:38 +0200 |
| commit | d52b16993285f6fd98d7241689e1bd950739bb88 (patch) | |
| tree | 4bbceb937aa0bae5073c88b9f24d7ed873ad004f /src | |
| parent | 79b2434d17ce6898672d95ac89eb2b097c31a26f (diff) | |
| download | bibiman-d52b16993285f6fd98d7241689e1bd950739bb88.tar.gz bibiman-d52b16993285f6fd98d7241689e1bd950739bb88.zip | |
simple scrollbar for entry list
Diffstat (limited to 'src')
| -rw-r--r-- | src/frontend/entries.rs | 34 | ||||
| -rw-r--r-- | src/frontend/ui.rs | 19 |
2 files changed, 42 insertions, 11 deletions
diff --git a/src/frontend/entries.rs b/src/frontend/entries.rs index 1f79bf4..b0bb0b7 100644 --- a/src/frontend/entries.rs +++ b/src/frontend/entries.rs @@ -22,12 +22,20 @@ use color_eyre::eyre::{Context, Ok, Result}; use core::panic; use editor_command::EditorBuilder; use itertools::Itertools; -use ratatui::widgets::TableState; +use ratatui::widgets::{ScrollbarState, TableState}; use std::process::{Command, Stdio}; +// Define list containing entries as table +#[derive(Debug)] +pub struct EntryTable { + pub entry_table_items: Vec<EntryTableItem>, + pub entry_table_state: TableState, + pub entry_scroll_state: ScrollbarState, +} + impl FromIterator<Vec<String>> for EntryTable { fn from_iter<T: IntoIterator<Item = Vec<String>>>(iter: T) -> Self { - let entry_table_items = iter + let entry_table_items: Vec<EntryTableItem> = iter .into_iter() .sorted() // 0: authors, 1: title, 2: date, 3: pubtype, 4: keywords, 5: citekey @@ -40,20 +48,15 @@ impl FromIterator<Vec<String>> for EntryTable { }) .collect(); let entry_table_state = TableState::default().with_selected(0); + let entry_scroll_state = ScrollbarState::new(entry_table_items.len()); Self { entry_table_items, entry_table_state, + entry_scroll_state, } } } -// Define list containing entries as table -#[derive(Debug)] -pub struct EntryTable { - pub entry_table_items: Vec<EntryTableItem>, - pub entry_table_state: TableState, -} - // Define contents of each entry table row #[derive(Debug)] pub struct EntryTableItem { @@ -127,21 +130,34 @@ impl App { pub fn select_next_entry(&mut self) { self.scroll_info = 0; self.entry_table.entry_table_state.select_next(); + self.entry_table.entry_scroll_state = self + .entry_table + .entry_scroll_state + .position(self.entry_table.entry_table_state.selected().unwrap()); } pub fn select_previous_entry(&mut self) { self.scroll_info = 0; self.entry_table.entry_table_state.select_previous(); + self.entry_table.entry_scroll_state = self + .entry_table + .entry_scroll_state + .position(self.entry_table.entry_table_state.selected().unwrap()); } pub fn select_first_entry(&mut self) { self.scroll_info = 0; self.entry_table.entry_table_state.select_first(); + self.entry_table.entry_scroll_state = self.entry_table.entry_scroll_state.position(0); } pub fn select_last_entry(&mut self) { self.scroll_info = 0; self.entry_table.entry_table_state.select_last(); + self.entry_table.entry_scroll_state = self + .entry_table + .entry_scroll_state + .position(self.entry_table.entry_table_items.len()); } // Get the citekey of the selected entry diff --git a/src/frontend/ui.rs b/src/frontend/ui.rs index 6a292d7..32a8296 100644 --- a/src/frontend/ui.rs +++ b/src/frontend/ui.rs @@ -22,8 +22,8 @@ use ratatui::{ symbols, text::{Line, Span, Text}, widgets::{ - Block, Cell, HighlightSpacing, List, ListItem, Padding, Paragraph, Row, StatefulWidget, - Table, Widget, Wrap, + Block, Cell, HighlightSpacing, List, ListItem, Padding, Paragraph, Row, Scrollbar, + ScrollbarOrientation, StatefulWidget, Table, Widget, Wrap, }, }; @@ -82,6 +82,7 @@ impl Widget for &mut App { self.render_footer(footer_area, buf); // Render list area where entry gets selected self.render_entrytable(list_area, buf); + self.render_entry_table_scrollbar(list_area, buf); // Render infos related to selected entry // TODO: only placeholder at the moment, has to be impl. self.render_taglist(tag_area, buf); @@ -230,6 +231,20 @@ impl App { ); } + pub fn render_entry_table_scrollbar(&mut self, area: Rect, buf: &mut Buffer) { + StatefulWidget::render( + Scrollbar::default() + .orientation(ScrollbarOrientation::VerticalRight) + .track_symbol(None) + .thumb_style(Style::new().fg(Color::DarkGray)) + .begin_symbol(None) + .end_symbol(None), + area, + buf, + &mut self.entry_table.entry_scroll_state, + ); + } + pub fn render_selected_item(&mut self, area: Rect, buf: &mut Buffer) { // We get the info depending on the item's state. let style_value = Style::new().bold().fg(TEXT_FG_COLOR); |
