#[derive(Debug, Default, Clone)]
pub struct NavigationState {
selected_index: usize,
}
impl NavigationState {
pub fn new() -> Self {
Self::default()
}
pub fn selected_index(&self) -> usize {
self.selected_index
}
pub fn move_up(&mut self) {
if self.selected_index > 0 {
self.selected_index -= 1;
}
}
pub fn move_down(
&mut self,
visible_count: usize,
) {
if visible_count > 0 && self.selected_index < visible_count - 1 {
self.selected_index += 1;
}
}
pub fn move_top(&mut self) {
self.selected_index = 0;
}
pub fn move_bottom(
&mut self,
visible_count: usize,
) {
if visible_count > 0 {
self.selected_index = visible_count - 1;
}
}
pub fn scroll_up(
&mut self,
amount: usize,
) {
self.selected_index = self.selected_index.saturating_sub(amount);
}
pub fn scroll_down(
&mut self,
amount: usize,
visible_count: usize,
) {
if visible_count > 0 {
self.selected_index = (self.selected_index + amount).min(visible_count - 1);
}
}
pub fn clamp(
&mut self,
visible_count: usize,
) {
if visible_count == 0 {
self.selected_index = 0;
} else if self.selected_index >= visible_count {
self.selected_index = visible_count - 1;
}
}
}
#[cfg(test)]
#[path = "navigation_tests.rs"]
mod navigation_tests;