use std::cmp::Ordering;
use crate::{handle_selection_multiline_caret_movement,
handle_selection_multiline_caret_movement_hit_top_or_bottom_of_document,
handle_selection_single_line_caret_movement, CaretScrAdj, EditorBuffer};
#[derive(Clone, Copy, Debug)]
pub enum SelectMode {
Enabled,
Disabled,
}
impl SelectMode {
#[must_use]
pub fn get_caret_scr_adj(&self, buffer: &EditorBuffer) -> Option<CaretScrAdj> {
match self {
SelectMode::Enabled => Some(buffer.get_caret_scr_adj()),
SelectMode::Disabled => None,
}
}
pub fn handle_selection_single_line_caret_movement(
&self,
editor_buffer: &mut EditorBuffer,
maybe_prev_caret: Option<CaretScrAdj>,
maybe_curr_caret: Option<CaretScrAdj>,
) -> Option<()> {
match self {
SelectMode::Disabled => editor_buffer.clear_selection(),
SelectMode::Enabled => {
let prev = maybe_prev_caret?;
let curr = maybe_curr_caret?;
if prev.row_index != curr.row_index {
return None;
}
handle_selection_single_line_caret_movement(
editor_buffer,
prev, curr,
);
}
}
None
}
pub fn update_selection_based_on_caret_movement_in_multiple_lines(
&self,
buffer: &mut EditorBuffer,
maybe_prev_caret: Option<CaretScrAdj>,
maybe_curr_caret: Option<CaretScrAdj>,
) -> Option<()> {
match self {
SelectMode::Disabled => buffer.clear_selection(),
SelectMode::Enabled => {
let prev = maybe_prev_caret?;
let curr = maybe_curr_caret?;
match prev.row_index.cmp(&curr.row_index) {
Ordering::Equal => handle_selection_multiline_caret_movement_hit_top_or_bottom_of_document(
buffer,
prev,
curr,
),
_ => handle_selection_multiline_caret_movement(
buffer,
prev,
curr,
),
}
}
}
None
}
}
#[derive(Clone, PartialEq, Copy, Debug)]
pub enum DeleteSelectionWith {
Backspace,
Delete,
AnyKey,
}