use tui::widgets::ListState; pub struct StatefulList { pub state: ListState, pub items: Vec, } impl StatefulList { pub fn with_items(items: Vec) -> StatefulList { StatefulList { state: ListState::default(), items, } } pub fn begin(&mut self) { self.state.select(Some(0)) } pub fn end(&mut self) { self.state.select(Some(self.items.len() - 1)) } pub fn next(&mut self) { let i = match self.state.selected() { Some(i) => { if i == self.items.len() - 1 { 0 } else { i + 1 } } None => 0, }; self.state.select(Some(i)); } pub fn previous(&mut self) { let i = match self.state.selected() { Some(i) => { if i == 0 { self.items.len() - 1 } else { i - 1 } } None => 0, }; self.state.select(Some(i)); } pub fn unselect(&mut self) { self.state.select(None); } pub fn push(&mut self, item: T) { self.items.push(item); } pub fn iter(&self) -> impl Iterator { self.items.iter() } }