terminal_ui/data/
stateful_list.rs1use 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}