use super::types::{CopyModeState, VisualMode};
use crate::selection::{Selection, SelectionMode};
impl CopyModeState {
pub fn toggle_visual_char(&mut self) {
if self.visual_mode == VisualMode::Char {
self.visual_mode = VisualMode::None;
self.selection_anchor = None;
} else {
self.visual_mode = VisualMode::Char;
self.selection_anchor = Some((self.cursor_absolute_line, self.cursor_col));
}
}
pub fn toggle_visual_line(&mut self) {
if self.visual_mode == VisualMode::Line {
self.visual_mode = VisualMode::None;
self.selection_anchor = None;
} else {
self.visual_mode = VisualMode::Line;
self.selection_anchor = Some((self.cursor_absolute_line, self.cursor_col));
}
}
pub fn toggle_visual_block(&mut self) {
if self.visual_mode == VisualMode::Block {
self.visual_mode = VisualMode::None;
self.selection_anchor = None;
} else {
self.visual_mode = VisualMode::Block;
self.selection_anchor = Some((self.cursor_absolute_line, self.cursor_col));
}
}
pub fn compute_selection(&self, scroll_offset: usize) -> Option<Selection> {
if self.visual_mode == VisualMode::None {
return None;
}
let (anchor_line, anchor_col) = self.selection_anchor?;
let viewport_top = self.scrollback_len.saturating_sub(scroll_offset);
let anchor_row = anchor_line.saturating_sub(viewport_top);
let cursor_row = self.cursor_absolute_line.saturating_sub(viewport_top);
let mode = match self.visual_mode {
VisualMode::None => return None,
VisualMode::Char => SelectionMode::Normal,
VisualMode::Line => SelectionMode::Line,
VisualMode::Block => SelectionMode::Rectangular,
};
let start = (anchor_col, anchor_row);
let end = (self.cursor_col, cursor_row);
Some(Selection::new(start, end, mode, scroll_offset))
}
}