Compare commits

...

2 commits

Author SHA1 Message Date
a5ce49576b clean up selection rendering 2023-03-14 13:41:46 +01:00
df0b6b6ff0 cleanup 2023-03-14 13:15:48 +01:00
3 changed files with 35 additions and 37 deletions

View file

@ -2,7 +2,6 @@ use crossterm::{
cursor::{self, MoveTo}, cursor::{self, MoveTo},
event::{self, Event, KeyCode, KeyEvent, KeyModifiers}, event::{self, Event, KeyCode, KeyEvent, KeyModifiers},
queue, queue,
style::{Color, Colors, ResetColor, SetColors},
terminal::{self, Clear, ClearType}, terminal::{self, Clear, ClearType},
}; };
use std::{ use std::{
@ -15,7 +14,7 @@ use std::{
}; };
use crate::clipboard::Clipboard; use crate::clipboard::Clipboard;
use crate::util::read_line; use crate::util::{color_highlight, color_reset, read_line};
const TAB_SIZE: usize = 4; const TAB_SIZE: usize = 4;
@ -170,36 +169,32 @@ impl Editor {
let end = (self.scroll + max_rows).min(self.lines.len()); let end = (self.scroll + max_rows).min(self.lines.len());
let visible_rows = self.scroll..end; let visible_rows = self.scroll..end;
let cursor = self.char_index(); let selection = self.selection().unwrap_or_default();
let marker = self.marker.unwrap_or(0);
let selection = (marker.min(cursor))..(marker.max(cursor));
for (line_index, line) in self.lines[visible_rows].iter().enumerate() { for (line_index, line) in self.lines[visible_rows].iter().enumerate() {
let text = &self.text[line.clone()]; let text = &self.text[line.clone()];
queue!(stdout(), MoveTo(0, line_index as u16)).unwrap(); queue!(stdout(), MoveTo(0, line_index as u16)).unwrap();
if self.marker.is_none() { let mut in_selection = false;
print!("{}", text.replace('\t', &" ".repeat(TAB_SIZE))); for (i, char) in text.char_indices() {
} else { let char_i = line.start + i;
let mut in_selection = false; if selection.contains(&char_i) {
for (i, char) in text.char_indices() { if !in_selection {
let char_i = line.start + i; color_highlight();
if char_i >= selection.start && char_i <= selection.end && !in_selection {
color_selection();
in_selection = true; 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(); self.status_line();
queue!( queue!(
@ -208,7 +203,8 @@ impl Editor {
self.physical_column() as u16, self.physical_column() as u16,
(self.cursor.line - self.scroll) as u16 (self.cursor.line - self.scroll) as u16
), ),
cursor::Show cursor::Show,
cursor::SetCursorStyle::BlinkingBar
) )
.unwrap(); .unwrap();
stdout().flush().unwrap(); stdout().flush().unwrap();
@ -459,11 +455,3 @@ impl Editor {
} }
} }
} }
fn color_selection() {
queue!(stdout(), SetColors(Colors::new(Color::Black, Color::White))).unwrap();
}
fn color_reset() {
queue!(stdout(), ResetColor).unwrap();
}

View file

@ -2,7 +2,6 @@ use crossterm::{
cursor::{self, MoveTo}, cursor::{self, MoveTo},
event::{self, Event, KeyCode, KeyModifiers}, event::{self, Event, KeyCode, KeyModifiers},
execute, queue, execute, queue,
style::{Color, Colors, ResetColor, SetColors},
terminal::{ terminal::{
self, disable_raw_mode, enable_raw_mode, Clear, ClearType, EnterAlternateScreen, self, disable_raw_mode, enable_raw_mode, Clear, ClearType, EnterAlternateScreen,
LeaveAlternateScreen, LeaveAlternateScreen,
@ -18,6 +17,7 @@ use std::{
mod clipboard; mod clipboard;
mod editor; mod editor;
mod util; mod util;
use crate::util::{color_highlight, color_reset};
use clipboard::Clipboard; use clipboard::Clipboard;
use editor::Editor; use editor::Editor;
@ -97,11 +97,11 @@ impl Navigator {
for (index, editor) in self.editors.iter().enumerate() { for (index, editor) in self.editors.iter().enumerate() {
if index == self.selected { 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(); queue!(stdout(), MoveTo(1, index as u16 + 1)).unwrap();
print!("{}", editor.title()); print!("{}", editor.title());
queue!(stdout(), ResetColor).unwrap(); color_reset();
} }
let offset = self.editors.len() as u16 + 2; let offset = self.editors.len() as u16 + 2;
@ -114,7 +114,7 @@ impl Navigator {
for (index, path) in self.files[visible_rows].iter().enumerate() { for (index, path) in self.files[visible_rows].iter().enumerate() {
if index + self.scroll == self.selected.wrapping_sub(self.editors.len()) { 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(); queue!(stdout(), MoveTo(1, index as u16 + 1 + offset)).unwrap();
if let Some(name) = path.file_name() { if let Some(name) = path.file_name() {
@ -125,7 +125,7 @@ impl Navigator {
if path.is_dir() { if path.is_dir() {
print!("/"); print!("/");
} }
queue!(stdout(), ResetColor).unwrap(); color_reset();
} }
if let Some(text) = &self.message { if let Some(text) = &self.message {

View file

@ -1,7 +1,9 @@
use crossterm::{ use crossterm::{
cursor, cursor,
event::{self, Event, KeyCode}, event::{self, Event, KeyCode},
queue, terminal, queue,
style::{Color, Colors, ResetColor, SetColors},
terminal,
}; };
use std::io::{stdout, Write}; use std::io::{stdout, Write};
@ -37,3 +39,11 @@ pub fn read_line(prompt: &str) -> Option<String> {
} }
Some(response.trim().into()) 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();
}