use std::ops::RangeInclusive;
pub trait Panel {
fn buffer_id(&self) -> u64;
fn viewport_id(&self) -> u64;
fn visible_range(&self) -> RangeInclusive<u32>;
fn scroll_to(&mut self, line: u32);
fn cursor_position(&self) -> (u32, u32);
fn set_cursor(&mut self, line: u32, col: u32);
fn total_lines(&self) -> u32;
fn is_line_visible(&self, line: u32) -> bool {
self.visible_range().contains(&line)
}
fn is_cursor_visible(&self) -> bool {
let (line, _) = self.cursor_position();
self.is_line_visible(line)
}
fn visible_line_count(&self) -> u32 {
let range = self.visible_range();
range.end() - range.start() + 1
}
fn ensure_cursor_visible(&mut self) {
if !self.is_cursor_visible() {
let (line, _) = self.cursor_position();
self.scroll_to(line);
}
}
}
#[cfg(test)]
#[path = "panel_tests.rs"]
mod tests;