diff --git a/src/editor.rs b/src/editor.rs index b135ff1..6e26fe2 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -148,4 +148,52 @@ impl Editor { self.move_view_to_cursor(); } + + pub fn page_up(&mut self) { + 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 { + if self.cursor.0 >= move_amount { + self.cursor.0 -= move_amount; + } + self.view_pos.0 -= move_amount; + } + else { + if self.cursor.0 >= self.view_pos.0 { + self.cursor.0 -= self.view_pos.0; + } + else { + self.cursor = (0, 0); + } + self.view_pos.0 = 0; + } + } + else { + self.cursor = (0, 0); + } + } + + pub fn page_down(&mut self) { + let nlc = self.buffer.newline_count(); + + 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; + let cursor_max_move = nlc - self.cursor.0; + + if max_move >= move_amount { + self.view_pos.0 += move_amount; + } + else { + self.view_pos.0 += max_move; + } + + if cursor_max_move >= move_amount { + self.cursor.0 += move_amount; + } + else { + self.cursor = self.buffer.pos_1d_to_closest_2d(self.buffer.len()+1); + } + } + } } diff --git a/src/term_ui.rs b/src/term_ui.rs index fb3b9d0..ee57680 100644 --- a/src/term_ui.rs +++ b/src/term_ui.rs @@ -12,10 +12,12 @@ const K_ENTER: u16 = 13; const K_TAB: u16 = 9; const K_SPACE: u16 = 32; const K_BACKSPACE: u16 = 127; +const K_PAGEUP: u16 = 65519; +const K_PAGEDOWN: u16 = 65518; +const K_UP: u16 = 65517; const K_DOWN: u16 = 65516; const K_LEFT: u16 = 65515; const K_RIGHT: u16 = 65514; -const K_UP: u16 = 65517; const K_ESC: u16 = 27; const K_CTRL_Q: u16 = 17; const K_CTRL_S: u16 = 19; @@ -64,7 +66,7 @@ impl TermUI { let mut e = self.rb.poll_event(); // Block until we get an event loop { match e { - Ok(rustbox::Event::KeyEvent(_, key, character)) => { + Ok(rustbox::Event::KeyEvent(modifier, key, character)) => { //println!(" {} {} {}", modifier, key, character); match key { K_CTRL_Q | K_ESC => { @@ -76,6 +78,14 @@ impl TermUI { self.editor.save_if_dirty(); }, + K_PAGEUP => { + self.editor.page_up(); + }, + + K_PAGEDOWN => { + self.editor.page_down(); + }, + K_UP => { self.editor.cursor_up(); }, diff --git a/todo.md b/todo.md index 85dc750..405085d 100644 --- a/todo.md +++ b/todo.md @@ -1,4 +1,3 @@ -- Page up / page down - Proper handling of tab characters - Line number display - Editor info display (filename, current line/column, indentation style, etc.)