terminal_ui/data/
stateful_list.rs

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