#[derive(Clone, Copy, Default, PartialEq, Eq, strum::IntoStaticStr)]
pub enum LogSize {
#[default]
#[strum(serialize = " Log l expand ")]
Normal,
#[strum(serialize = " Log l shrink ")]
Expanded,
}
#[derive(Clone, Copy, Default)]
pub struct LogView {
pub size: LogSize,
pub scroll: usize,
}
impl LogView {
pub(super) const fn toggle_size(&mut self) {
self.size = match self.size {
LogSize::Normal => LogSize::Expanded,
LogSize::Expanded => LogSize::Normal,
};
}
pub(super) fn scroll_back(&mut self, lines: usize, len: usize) {
self.scroll = self
.clamped(len)
.saturating_add(lines)
.min(Self::oldest(len));
}
pub(super) fn scroll_forward(&mut self, lines: usize, len: usize) {
self.scroll = self.clamped(len).saturating_sub(lines);
}
pub(super) const fn scroll_to_oldest(&mut self, len: usize) {
self.scroll = Self::oldest(len);
}
pub(super) const fn follow(&mut self) {
self.scroll = 0;
}
fn clamped(self, len: usize) -> usize {
self.scroll.min(Self::oldest(len))
}
const fn oldest(len: usize) -> usize {
len.saturating_sub(1)
}
}