use ratatui::widgets::ListState;
pub struct StatefulList<T> {
pub state: ListState,
pub items: Vec<T>,
}
impl<T> StatefulList<T> {
pub fn with_items(items: Vec<T>) -> StatefulList<T> {
StatefulList {
state: ListState::default(),
items,
}
}
pub fn next_nth(&mut self, n: usize) {
let i = match self.state.selected() {
Some(i) => {
if i >= self.items.len() - n {
0
} else {
i + n
}
}
None => n,
};
self.state.select(Some(i));
}
pub fn previous_nth(&mut self, n: usize) {
let i = match self.state.selected() {
Some(i) => {
if i <= n - 1 {
self.items.len() - 1
} else {
i - n
}
}
None => 0,
};
self.state.select(Some(i));
}
pub fn next(&mut self) {
self.next_nth(1)
}
pub fn previous(&mut self) {
self.previous_nth(1)
}
pub fn unselect(&mut self) {
self.state.select(None);
}
}