From 518b9a7e42698f4433ec89ad5ede8e4c61cba668 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Sat, 24 Jan 2015 21:38:13 -0800 Subject: [PATCH] Console editor appears to be back up to snuff again! --- src/editor/mod.rs | 2 +- src/line_formatter.rs | 6 +++--- src/term_ui.rs | 42 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/editor/mod.rs b/src/editor/mod.rs index d4e2e63..0b4712f 100644 --- a/src/editor/mod.rs +++ b/src/editor/mod.rs @@ -7,7 +7,7 @@ use std::path::Path; use std::cmp::min; use files::{load_file_to_buffer, save_buffer_to_file}; use string_utils::grapheme_count; -use self::cursor::{Cursor, CursorSet}; +use self::cursor::CursorSet; mod cursor; diff --git a/src/line_formatter.rs b/src/line_formatter.rs index 6cf50dd..53021c8 100644 --- a/src/line_formatter.rs +++ b/src/line_formatter.rs @@ -34,16 +34,16 @@ pub struct ConsoleLineFormatterVisIter<'a> { impl<'a> Iterator for ConsoleLineFormatterVisIter<'a> { - type Item = (&'a str, usize, usize); + type Item = (&'a str, (usize, usize), usize); - fn next(&mut self) -> Option<(&'a str, usize, usize)> { + fn next(&mut self) -> Option<(&'a str, (usize, usize), usize)> { if let Some(g) = self.grapheme_iter.next() { let pos = self.pos; let width = grapheme_vis_width_at_vis_pos(g, self.pos.1, self.f.tab_width as usize); self.pos = (self.pos.0, self.pos.1 + width); - return Some((g, pos.0, pos.1)); + return Some((g, (pos.0, pos.1), width)); } else { return None; diff --git a/src/term_ui.rs b/src/term_ui.rs index c0cb534..46944c9 100644 --- a/src/term_ui.rs +++ b/src/term_ui.rs @@ -345,13 +345,14 @@ impl TermUI { let screen_col = c1.1 as isize; let mut line_iter = editor.buffer.line_iter_at_index(starting_line); + for line in line_iter { let mut g_iter = editor.buffer.formatter.vis_grapheme_iter(line); let mut last_y = 0; // Loop through the graphemes of the line and print them to // the screen. - for (g, pos_y, pos_x) in g_iter { + for (g, (pos_y, pos_x), width) in g_iter { last_y = pos_y; // Calculate the cell coordinates at which to draw the grapheme @@ -374,7 +375,19 @@ impl TermUI { } // Actually print the character - if is_line_ending(g) || g == "\t" { + if is_line_ending(g) { + if at_cursor { + self.rb.print(px as usize, py as usize, rustbox::RB_NORMAL, Color::Black, Color::White, " "); + } + } + else if g == "\t" { + for i in range(0, width) { + let tpx = px as usize + i; + if tpx <= c2.1 { + self.rb.print(tpx as usize, py as usize, rustbox::RB_NORMAL, Color::White, Color::Black, " "); + } + } + if at_cursor { self.rb.print(px as usize, py as usize, rustbox::RB_NORMAL, Color::Black, Color::White, " "); } @@ -395,7 +408,30 @@ impl TermUI { screen_line += last_y as isize + 1; } - // TODO: handle printing the cursor when it's at the end of the buffer. + + + // If we get here, it means we reached the end of the text buffer + // without going off the bottom of the screen. So draw the cursor + // at the end if needed. + + // Check if the character is within a cursor + let mut at_cursor = false; + for c in editor.cursors.iter() { + if grapheme_index >= c.range.0 && grapheme_index <= c.range.1 { + at_cursor = true; + } + } + + if at_cursor { + // Calculate the cell coordinates at which to draw the cursor + let (pos_y, pos_x) = editor.buffer.index_to_v2d(grapheme_index); + let px = pos_x as isize + c1.1 as isize - editor.view_pos.1 as isize; + let py = pos_y as isize + c1.0 as isize - editor.view_pos.0 as isize; + + if (px >= c1.1 as isize) && (py >= c1.0 as isize) && (px <= c2.1 as isize) && (py <= c2.0 as isize) { + self.rb.print(px as usize, py as usize, rustbox::RB_NORMAL, Color::Black, Color::White, " "); + } + } }