From f222cd6a54e0eca3d5ed69a0df33ed8fc864a5ac Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Tue, 27 Jan 2015 23:58:45 -0800 Subject: [PATCH] Fixed remaining cursor navigation bugs (I think...?). --- src/buffer/mod.rs | 5 +++++ src/editor/mod.rs | 33 ++++++++++++++++----------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/buffer/mod.rs b/src/buffer/mod.rs index b5e56c9..be31b68 100644 --- a/src/buffer/mod.rs +++ b/src/buffer/mod.rs @@ -54,6 +54,11 @@ impl Buffer { } + pub fn dimensions(&self) -> (usize, usize) { + self.text.vis_dim + } + + //------------------------------------------------------------------------ // Editing operations diff --git a/src/editor/mod.rs b/src/editor/mod.rs index 5565d21..92c0759 100644 --- a/src/editor/mod.rs +++ b/src/editor/mod.rs @@ -4,7 +4,7 @@ use buffer::Buffer; use buffer::line_formatter::LineFormatter; use buffer::line_formatter::RoundingBehavior::*; use std::path::Path; -use std::cmp::min; +use std::cmp::{min, max}; use files::{load_file_to_buffer, save_buffer_to_file}; use string_utils::grapheme_count; use self::cursor::CursorSet; @@ -471,10 +471,11 @@ impl Editor { pub fn cursor_up(&mut self, n: usize) { for c in self.cursors.iter_mut() { + let vmove = n * self.buffer.formatter.single_line_height(); let (v, _) = self.buffer.index_to_v2d(c.range.0); - if v >= n { - c.range.0 = self.buffer.v2d_to_index((v - n, c.vis_start), (Floor, Floor)); + if vmove <= v { + c.range.0 = self.buffer.v2d_to_index((v - vmove, c.vis_start), (Floor, Floor)); c.range.1 = c.range.0; } else { @@ -489,10 +490,12 @@ impl Editor { pub fn cursor_down(&mut self, n: usize) { for c in self.cursors.iter_mut() { - let (v, _) = self.buffer.index_to_v2d(c.range.0); + let vmove = n * self.buffer.formatter.single_line_height(); + let (v, _) = self.buffer.index_to_v2d(c.range.0); + let (h, _) = self.buffer.dimensions(); - if v < (self.buffer.line_count() - n) { - c.range.0 = self.buffer.v2d_to_index((v + n, c.vis_start), (Floor, Floor)); + if vmove < (h - v) { + c.range.0 = self.buffer.v2d_to_index((v + vmove, c.vis_start), (Floor, Floor)); c.range.1 = c.range.0; } else { @@ -507,30 +510,28 @@ impl Editor { } pub fn page_up(&mut self) { + let move_amount = self.view_dim.0 - max((self.view_dim.0 / 8), self.buffer.formatter.single_line_height()); + if self.view_pos.0 > 0 { - let move_amount = self.view_dim.0 - (self.view_dim.0 / 8); if self.view_pos.0 >= move_amount { self.view_pos.0 -= move_amount; } else { self.view_pos.0 = 0; } - - self.cursor_up(move_amount); - } - else { - self.cursor_to_beginning_of_buffer(); } + self.cursor_up(move_amount); + // Adjust view self.move_view_to_cursor(); } pub fn page_down(&mut self) { let nlc = self.buffer.line_count() - 1; + let move_amount = self.view_dim.0 - max((self.view_dim.0 / 8), self.buffer.formatter.single_line_height()); if self.view_pos.0 < nlc { - let move_amount = self.view_dim.0 - (self.view_dim.0 / 8); let max_move = nlc - self.view_pos.0; if max_move >= move_amount { @@ -540,12 +541,10 @@ impl Editor { self.view_pos.0 += max_move; } - self.cursor_down(move_amount); - } - else { - self.cursor_to_end_of_buffer(); } + self.cursor_down(move_amount); + // Adjust view self.move_view_to_cursor(); }