#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Panel {
List,
Description,
Script,
}
#[derive(Debug, Clone)]
pub struct UiState {
active_panel: Panel,
list_scroll_offset: usize,
description_scroll_offset: usize,
description_max_scroll: usize,
script_scroll_offset: usize,
script_max_scroll: usize,
show_help: bool,
help_scroll_offset: usize,
help_max_scroll: usize,
}
impl Default for UiState {
fn default() -> Self {
Self {
active_panel: Panel::List,
list_scroll_offset: 0,
description_scroll_offset: 0,
description_max_scroll: 0,
script_scroll_offset: 0,
script_max_scroll: 0,
show_help: false,
help_scroll_offset: 0,
help_max_scroll: 0,
}
}
}
impl UiState {
pub fn new() -> Self {
Self::default()
}
pub fn active_panel(&self) -> Panel {
self.active_panel
}
pub fn list_scroll_offset(&self) -> usize {
self.list_scroll_offset
}
pub fn description_scroll_offset(&self) -> usize {
self.description_scroll_offset
}
pub fn description_max_scroll(&self) -> usize {
self.description_max_scroll
}
pub fn script_scroll_offset(&self) -> usize {
self.script_scroll_offset
}
pub fn script_max_scroll(&self) -> usize {
self.script_max_scroll
}
pub fn show_help(&self) -> bool {
self.show_help
}
pub fn help_scroll_offset(&self) -> usize {
self.help_scroll_offset
}
pub fn help_max_scroll(&self) -> usize {
self.help_max_scroll
}
pub fn set_list_scroll_offset(
&mut self,
offset: usize,
) {
self.list_scroll_offset = offset;
}
pub fn set_description_scroll_offset(
&mut self,
offset: usize,
) {
self.description_scroll_offset = offset;
}
pub fn set_script_scroll_offset(
&mut self,
offset: usize,
) {
self.script_scroll_offset = offset;
}
pub fn set_help_scroll_offset(
&mut self,
offset: usize,
) {
self.help_scroll_offset = offset;
}
pub fn cycle_panel(&mut self) {
self.active_panel = match self.active_panel {
Panel::List => Panel::Description,
Panel::Description => Panel::Script,
Panel::Script => Panel::List,
};
}
pub fn cycle_panel_backward(&mut self) {
self.active_panel = match self.active_panel {
Panel::List => Panel::Script,
Panel::Script => Panel::Description,
Panel::Description => Panel::List,
};
}
pub fn toggle_help(&mut self) {
self.show_help = !self.show_help;
if self.show_help {
self.help_scroll_offset = 0;
}
}
pub fn reset_detail_scroll(&mut self) {
self.description_scroll_offset = 0;
self.script_scroll_offset = 0;
}
pub fn update_description_max_scroll(
&mut self,
total_lines: usize,
visible_lines: usize,
) {
self.description_max_scroll =
if total_lines > visible_lines { total_lines.saturating_sub(visible_lines) } else { 0 };
}
pub fn update_script_max_scroll(
&mut self,
total_lines: usize,
visible_lines: usize,
) {
self.script_max_scroll = if total_lines > visible_lines { total_lines.saturating_sub(visible_lines) } else { 0 };
}
pub fn update_help_max_scroll(
&mut self,
total_lines: usize,
visible_lines: usize,
) {
self.help_max_scroll = if total_lines > visible_lines { total_lines.saturating_sub(visible_lines) } else { 0 };
}
}
#[cfg(test)]
#[path = "ui_state_tests.rs"]
mod ui_state_tests;