terminal_ui/data/
stateful_table.rs

1use 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}