diff_folders/
status.rs

1use tui::widgets::ListState;
2
3///
4#[derive(Copy, Clone, Hash, PartialEq, Eq, Debug)]
5pub enum StatusItemType {
6    ///
7    New,
8    ///
9    Modified,
10    ///
11    Deleted,
12    ///
13    Normal,
14}
15
16///
17
18#[derive(Clone)]
19pub struct FolderStatefulList {
20    pub entry: walkdir::DirEntry,
21    pub state: StatusItemType,
22}
23
24///
25pub 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}