From df0b6b6ff091ae0325750715045dea43a0cedfd3 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Tue, 14 Mar 2023 13:15:48 +0100 Subject: [PATCH 1/2] cleanup --- src/editor.rs | 13 ++----------- src/main.rs | 10 +++++----- src/util.rs | 12 +++++++++++- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/editor.rs b/src/editor.rs index 9276e66..c7440ac 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -2,7 +2,6 @@ use crossterm::{ cursor::{self, MoveTo}, event::{self, Event, KeyCode, KeyEvent, KeyModifiers}, queue, - style::{Color, Colors, ResetColor, SetColors}, terminal::{self, Clear, ClearType}, }; use std::{ @@ -15,7 +14,7 @@ use std::{ }; use crate::clipboard::Clipboard; -use crate::util::read_line; +use crate::util::{color_highlight, color_reset, read_line}; const TAB_SIZE: usize = 4; @@ -186,7 +185,7 @@ impl Editor { for (i, char) in text.char_indices() { let char_i = line.start + i; if char_i >= selection.start && char_i <= selection.end && !in_selection { - color_selection(); + color_highlight(); in_selection = true; } else if char_i > selection.end && in_selection { color_reset(); @@ -459,11 +458,3 @@ impl Editor { } } } - -fn color_selection() { - queue!(stdout(), SetColors(Colors::new(Color::Black, Color::White))).unwrap(); -} - -fn color_reset() { - queue!(stdout(), ResetColor).unwrap(); -} diff --git a/src/main.rs b/src/main.rs index e9fe3b1..313b07e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,6 @@ use crossterm::{ cursor::{self, MoveTo}, event::{self, Event, KeyCode, KeyModifiers}, execute, queue, - style::{Color, Colors, ResetColor, SetColors}, terminal::{ self, disable_raw_mode, enable_raw_mode, Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen, @@ -18,6 +17,7 @@ use std::{ mod clipboard; mod editor; mod util; +use crate::util::{color_highlight, color_reset}; use clipboard::Clipboard; use editor::Editor; @@ -97,11 +97,11 @@ impl Navigator { for (index, editor) in self.editors.iter().enumerate() { if index == self.selected { - queue!(stdout(), SetColors(Colors::new(Color::Black, Color::White))).unwrap(); + color_highlight(); } queue!(stdout(), MoveTo(1, index as u16 + 1)).unwrap(); print!("{}", editor.title()); - queue!(stdout(), ResetColor).unwrap(); + color_reset(); } let offset = self.editors.len() as u16 + 2; @@ -114,7 +114,7 @@ impl Navigator { for (index, path) in self.files[visible_rows].iter().enumerate() { if index + self.scroll == self.selected.wrapping_sub(self.editors.len()) { - queue!(stdout(), SetColors(Colors::new(Color::Black, Color::White))).unwrap(); + color_highlight(); } queue!(stdout(), MoveTo(1, index as u16 + 1 + offset)).unwrap(); if let Some(name) = path.file_name() { @@ -125,7 +125,7 @@ impl Navigator { if path.is_dir() { print!("/"); } - queue!(stdout(), ResetColor).unwrap(); + color_reset(); } if let Some(text) = &self.message { diff --git a/src/util.rs b/src/util.rs index ce3c82a..c5b05a3 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,7 +1,9 @@ use crossterm::{ cursor, event::{self, Event, KeyCode}, - queue, terminal, + queue, + style::{Color, Colors, ResetColor, SetColors}, + terminal, }; use std::io::{stdout, Write}; @@ -37,3 +39,11 @@ pub fn read_line(prompt: &str) -> Option { } Some(response.trim().into()) } + +pub fn color_highlight() { + queue!(stdout(), SetColors(Colors::new(Color::Black, Color::White))).unwrap(); +} + +pub fn color_reset() { + queue!(stdout(), ResetColor).unwrap(); +} From a5ce49576b73bfb1ffb3ae5c4345034967575e9d Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Tue, 14 Mar 2023 13:41:46 +0100 Subject: [PATCH 2/2] clean up selection rendering --- src/editor.rs | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/editor.rs b/src/editor.rs index c7440ac..6cd77f8 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -169,36 +169,32 @@ impl Editor { let end = (self.scroll + max_rows).min(self.lines.len()); let visible_rows = self.scroll..end; - let cursor = self.char_index(); - let marker = self.marker.unwrap_or(0); - let selection = (marker.min(cursor))..(marker.max(cursor)); + let selection = self.selection().unwrap_or_default(); for (line_index, line) in self.lines[visible_rows].iter().enumerate() { let text = &self.text[line.clone()]; queue!(stdout(), MoveTo(0, line_index as u16)).unwrap(); - if self.marker.is_none() { - print!("{}", text.replace('\t', &" ".repeat(TAB_SIZE))); - } else { - let mut in_selection = false; - for (i, char) in text.char_indices() { - let char_i = line.start + i; - if char_i >= selection.start && char_i <= selection.end && !in_selection { + let mut in_selection = false; + for (i, char) in text.char_indices() { + let char_i = line.start + i; + if selection.contains(&char_i) { + if !in_selection { color_highlight(); in_selection = true; - } else if char_i > selection.end && in_selection { - color_reset(); - in_selection = false; - } - if char == '\t' { - print!("{:1$}", " ", TAB_SIZE); - } else { - print!("{char}"); } + } else if in_selection { + color_reset(); + in_selection = false; + } + if char == '\t' { + print!("{:1$}", " ", TAB_SIZE); + } else { + print!("{char}"); } - color_reset(); } + color_reset(); } self.status_line(); queue!( @@ -207,7 +203,8 @@ impl Editor { self.physical_column() as u16, (self.cursor.line - self.scroll) as u16 ), - cursor::Show + cursor::Show, + cursor::SetCursorStyle::BlinkingBar ) .unwrap(); stdout().flush().unwrap();