use tui::widgets::ListState;
#[derive(Clone)]
pub struct StatefulList<T> {
state: ListState,
items: Vec<T>,
}
impl<T> StatefulList<T> {
pub fn with_items(items: Vec<T>) -> StatefulList<T> {
StatefulList {
state: ListState::default(),
items,
}
}
pub fn state(&mut self) -> &mut ListState {
&mut self.state
}
pub fn items(&self) -> &Vec<T> {
&self.items
}
pub fn items_mut(&mut self) -> &mut Vec<T> {
&mut self.items
}
pub fn with_first_selected(mut self) -> Self {
if !self.items.is_empty() {
self.state.select(Some(0));
}
self
}
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));
}
}