From a091b504fb55a99b6ffe9ac395343ad5333b32cc Mon Sep 17 00:00:00 2001 From: alice pellerin Date: Fri, 10 Apr 2026 20:38:34 -0500 Subject: [PATCH] clean up inspector switching --- src/action.rs | 27 ++++++++++++++++++++------- src/buffer/mod.rs | 23 ++++++++++++++--------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/action.rs b/src/action.rs index b2b1637..e8df411 100644 --- a/src/action.rs +++ b/src/action.rs @@ -1,7 +1,7 @@ use std::{cmp::min, collections::hash_set::Entry, convert::identity, fs::File, io::Write, iter, mem::{replace, swap}}; use ratatui::{style::{Color, Stylize}, text::Span}; use serde::{Deserialize, Serialize}; -use crate::{BYTES_OF_PADDING, BYTES_PER_LINE, LINES_OF_PADDING, app::WindowSize, buffer::{Buffer, Mode, PartialAction, Popup}, cursor::Cursor, edit_action::EditAction}; +use crate::{BYTES_OF_PADDING, BYTES_PER_LINE, LINES_OF_PADDING, app::WindowSize, buffer::{Buffer, InspectionStatus, Mode, PartialAction, Popup}, cursor::Cursor, edit_action::EditAction}; #[derive(Clone, Copy, Serialize, Deserialize)] #[derive(Debug)] @@ -23,6 +23,13 @@ impl Action { Cursor(cursor_action) => cursor_action.clears_popups(), } } + + pub const fn is_inspection(self) -> bool { + use Action::*; + use BufferAction::*; + + matches!(self, Buffer(InspectSelection | InspectSelectionColor)) + } } impl From for &str { @@ -1179,9 +1186,12 @@ impl Buffer { #[allow(clippy::too_many_lines)] fn inspect_selection(&mut self) { - if self.inspecting_selection { return; } + if self.inspection_status == Some(InspectionStatus::Normal) { + self.inspection_status = None; + return; + } - self.inspecting_selection = true; + self.inspection_status = Some(InspectionStatus::Normal); self.popups.extend( iter::once(&self.primary_cursor) @@ -1200,14 +1210,17 @@ impl Buffer { ); if self.popups.is_empty() { - self.inspecting_selection = false; + self.inspection_status = None; } } fn inspect_selection_color(&mut self) { - if self.inspecting_selection { return; } + if self.inspection_status == Some(InspectionStatus::ColorsOnly) { + self.inspection_status = None; + return; + } - self.inspecting_selection = true; + self.inspection_status = Some(InspectionStatus::ColorsOnly); self.popups.extend( iter::once(&self.primary_cursor) @@ -1226,7 +1239,7 @@ impl Buffer { ); if self.popups.is_empty() { - self.inspecting_selection = false; + self.inspection_status = None; } } } diff --git a/src/buffer/mod.rs b/src/buffer/mod.rs index 1509c23..a0577aa 100644 --- a/src/buffer/mod.rs +++ b/src/buffer/mod.rs @@ -26,7 +26,7 @@ pub struct Buffer { pub alert_message: Span<'static>, pub popups: Vec, - pub inspecting_selection: bool, + pub inspection_status: Option, pub edit_history: Vec, // the index *after* the latest edit action @@ -59,6 +59,11 @@ pub struct Popup { lines: Vec> } +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum InspectionStatus { + Normal, ColorsOnly +} + impl Mode { pub const fn label(self) -> &'static str { match self { @@ -190,7 +195,7 @@ impl Buffer { alert_message: "".into(), popups: Vec::new(), - inspecting_selection: false, + inspection_status: None, edit_history: Vec::new(), time_traveling: None, @@ -273,6 +278,8 @@ impl Buffer { config: &Config, window_size: WindowSize ) -> Option { + use Action::*; + let mut result = None; let should_reset_partial = self.partial_action.is_some(); @@ -285,12 +292,10 @@ impl Buffer { self.popups.clear(); } - let was_inspecting_selection = self.inspecting_selection; - match action { - Action::App(app_action) => result = Some(*app_action), - Action::Buffer(buffer_action) => self.execute(*buffer_action, window_size), - Action::Cursor(cursor_action) => { + App(app_action) => result = Some(*app_action), + Buffer(buffer_action) => self.execute(*buffer_action, window_size), + Cursor(cursor_action) => { let max_contents_index = self.max_contents_index(); self.primary_cursor.execute(*cursor_action, max_contents_index); @@ -305,8 +310,8 @@ impl Buffer { }, } - if was_inspecting_selection { - self.inspecting_selection = false; + if !action.is_inspection() { + self.inspection_status = None; } }