terminal_ui/data/
stateful_table.rs1use tui::widgets::TableState;
2
3use super::Stateful;
4
5pub struct StatefulTable<T> {
6 pub state: TableState,
7 pub items: Vec<T>,
8}
9
10impl<T> StatefulTable<T> {
11 pub fn with_items(items: Vec<T>) -> StatefulTable<T> {
12 StatefulTable {
13 state: TableState::default(),
14 items,
15 }
16 }
17}
18
19impl<T> Stateful<T> for StatefulTable<T> {
20 fn next(&mut self) -> usize {
21 if !self.items.is_empty() {
22 let i = match self.state.selected() {
23 Some(i) => {
24 if i >= self.items.len() - 1 {
25 0
26 } else {
27 i + 1
28 }
29 }
30 None => 0,
31 };
32 self.state.select(Some(i));
33 }
34 self.state.selected().unwrap_or_default()
35 }
36
37 fn previous(&mut self) -> usize {
38 if !self.items.is_empty() {
39 let i = match self.state.selected() {
40 Some(i) => {
41 if i == 0 {
42 self.items.len() - 1
43 } else {
44 i - 1
45 }
46 }
47 None => 0,
48 };
49 self.state.select(Some(i));
50 }
51 self.state.selected().unwrap_or_default()
52 }
53
54 fn unselect(&mut self) {
55 self.state.select(None);
56 }
57}