1use tui::widgets::ListState;
2
3#[derive(Copy, Clone, Hash, PartialEq, Eq, Debug)]
5pub enum StatusItemType {
6 New,
8 Modified,
10 Deleted,
12 Normal,
14}
15
16#[derive(Clone)]
19pub struct FolderStatefulList {
20 pub entry: walkdir::DirEntry,
21 pub state: StatusItemType,
22}
23
24pub struct StatefulList<T> {
26 pub state: ListState,
27 pub items: Vec<T>,
28}
29
30impl<T> StatefulList<T> {
31 pub fn with_items(items: Vec<T>) -> StatefulList<T> {
32 StatefulList {
33 state: ListState::default(),
34 items,
35 }
36 }
37
38 pub fn next(&mut self, dist: usize) {
39 let mut page_size = dist;
40 if page_size > self.items.len() {
41 page_size = self.items.len();
42 }
43 let i = match self.state.selected() {
44 Some(i) => {
45 if i >= self.items.len() - page_size {
46 0
47 } else {
48 i + page_size
49 }
50 }
51 None => 0,
52 };
53 self.state.select(Some(i));
54 }
55
56 pub fn previous(&mut self, dist: usize) {
57 let mut page_size = dist;
58 if page_size > self.items.len() {
59 page_size = self.items.len();
60 }
61 let i = match self.state.selected() {
62 Some(i) => {
63 if i <= page_size {
64 self.items.len() - page_size
65 } else {
66 i - page_size
67 }
68 }
69 None => 0,
70 };
71 self.state.select(Some(i));
72 }
73
74 pub fn unselect(&mut self) {
75 self.state.select(None);
76 }
77
78 pub fn cur(&self) -> &T {
79 let i = match self.state.selected() {
80 Some(i) => i,
81 None => 0,
82 };
83 &self.items[i]
84 }
85}