aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlukeflo2024-10-09 22:22:10 +0200
committerlukeflo2024-10-12 22:41:38 +0200
commitd52b16993285f6fd98d7241689e1bd950739bb88 (patch)
tree4bbceb937aa0bae5073c88b9f24d7ed873ad004f /src
parent79b2434d17ce6898672d95ac89eb2b097c31a26f (diff)
downloadbibiman-d52b16993285f6fd98d7241689e1bd950739bb88.tar.gz
bibiman-d52b16993285f6fd98d7241689e1bd950739bb88.zip
simple scrollbar for entry list
Diffstat (limited to 'src')
-rw-r--r--src/frontend/entries.rs34
-rw-r--r--src/frontend/ui.rs19
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);