pub mod badge;
pub mod columns;
pub mod empty;
pub mod meter;
pub mod overlay;
pub mod panel;
pub mod scrollbar;
pub mod spark;
pub mod table;
pub use columns::{Align, Column, ColumnLayout, Width};
pub use table::{Cell, Row, Spec};
pub fn viewport_offset(selected: usize, offset: usize, height: usize) -> usize {
if height == 0 {
return 0;
}
if selected < offset {
selected
} else if selected >= offset + height {
selected.saturating_sub(height - 1)
} else {
offset
}
}
pub fn clamp_selection(selected: usize, count: usize) -> usize {
if count == 0 {
0
} else {
selected.min(count - 1)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn viewport_keeps_selection_visible() {
assert_eq!(viewport_offset(3, 10, 20), 3);
assert_eq!(viewport_offset(30, 0, 20), 11);
assert_eq!(viewport_offset(5, 2, 20), 2);
}
#[test]
fn viewport_handles_zero_height() {
assert_eq!(viewport_offset(42, 7, 0), 0);
}
#[test]
fn viewport_handles_height_one() {
assert_eq!(viewport_offset(0, 0, 1), 0);
assert_eq!(viewport_offset(5, 0, 1), 5);
}
#[test]
fn clamp_selection_on_empty_and_shrunk_lists() {
assert_eq!(clamp_selection(9, 0), 0);
assert_eq!(clamp_selection(9, 3), 2);
assert_eq!(clamp_selection(1, 3), 1);
}
}