use std::collections::{HashMap, HashSet};
use std::time::Instant;
use crate::ui::ScreenRowInfo;
use super::selection::Selection;
use super::ViewMode;
#[derive(Debug)]
pub struct ViewState {
pub scroll_offset: usize,
pub viewport_height: usize,
pub view_mode: ViewMode,
pub content_offset: (u16, u16),
pub line_num_width: usize,
pub content_width: usize,
pub panel_width: u16,
pub show_help: bool,
pub selection: Option<Selection>,
pub word_selection_anchor: Option<(usize, usize, usize)>,
pub line_selection_anchor: Option<(usize, usize)>,
pub row_map: Vec<ScreenRowInfo>,
pub collapsed_files: HashSet<String>,
pub manually_toggled: HashSet<String>,
pub reviewed_files: HashMap<String, u64>,
pub reviewed_flash: Option<(String, Instant)>,
pub needs_inline_spans: bool,
pub path_copied_at: Option<Instant>,
pub last_click: Option<(Instant, u16, u16, u8)>,
pub pending_copy: Option<Instant>,
pub status_bar_lines: Vec<String>,
pub status_bar_screen_y: u16,
}
impl Default for ViewState {
fn default() -> Self {
Self {
scroll_offset: 0,
viewport_height: 0,
view_mode: ViewMode::default(),
content_offset: (0, 0),
line_num_width: 0,
content_width: 0,
panel_width: 0,
show_help: false,
selection: None,
word_selection_anchor: None,
line_selection_anchor: None,
row_map: Vec::new(),
collapsed_files: HashSet::new(),
manually_toggled: HashSet::new(),
reviewed_files: HashMap::new(),
reviewed_flash: None,
needs_inline_spans: true,
path_copied_at: None,
last_click: None,
pending_copy: None,
status_bar_lines: Vec::new(),
status_bar_screen_y: 0,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_view_state_default_values() {
let state = ViewState::default();
assert_eq!(state.scroll_offset, 0);
assert_eq!(state.viewport_height, 0);
assert_eq!(state.view_mode, ViewMode::Context);
assert!(!state.show_help);
assert!(state.selection.is_none());
assert!(state.word_selection_anchor.is_none());
assert!(state.line_selection_anchor.is_none());
assert!(state.collapsed_files.is_empty());
assert!(state.manually_toggled.is_empty());
assert!(state.needs_inline_spans, "needs_inline_spans must default to true");
assert!(state.path_copied_at.is_none());
assert!(state.last_click.is_none());
assert!(state.pending_copy.is_none());
assert!(state.status_bar_lines.is_empty());
assert_eq!(state.status_bar_screen_y, 0);
}
}