mod.rs (1330B)
1 pub mod event; 2 3 use tui::widgets::ListState; 4 5 #[derive(Clone)] 6 pub struct StatefulList<T> { 7 pub state: ListState, 8 pub items: Vec<T>, 9 } 10 11 impl<T> StatefulList<T> { 12 pub fn new() -> StatefulList<T> { 13 StatefulList { 14 state: ListState::default(), 15 items: Vec::new(), 16 } 17 } 18 19 pub fn next(&mut self) { 20 if self.items.len() == 0 { 21 return; 22 } 23 let i = match self.state.selected() { 24 Some(i) => { 25 if i >= self.items.len() - 1 { 26 0 27 } else { 28 i + 1 29 } 30 } 31 None => 0, 32 }; 33 self.state.select(Some(i)); 34 } 35 36 pub fn previous(&mut self) { 37 if self.items.len() == 0 { 38 return; 39 } 40 let i = match self.state.selected() { 41 Some(i) => { 42 if i == 0 { 43 self.items.len() - 1 44 } else { 45 i - 1 46 } 47 } 48 None => 0, 49 }; 50 self.state.select(Some(i)); 51 } 52 53 pub fn unselect(&mut self) { 54 self.state.select(None); 55 } 56 57 pub fn select_top(&mut self) { 58 if self.items.is_empty() { 59 return; 60 } 61 self.state.select(Some(0)); 62 } 63 }