summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Oram <dev@mitmaro.ca>2020-10-28 09:38:58 -0230
committerTim Oram <dev@mitmaro.ca>2020-10-29 20:47:15 -0230
commitecaa141d6bab8081ed7fd59fbd05399d22aa5236 (patch)
treee69c23e905babcadcfb4c546a5e2036027717ff4
parentb600ea10a9c5b914830187d609e0adcd85973b1d (diff)
Move cursor movement to List module
Move the movement of the cursor from the GitInteractive struct into the list module. The GitInteractive struct only needs to track the selected commit, but it should not handle the movement of the cursor from the List module.
-rw-r--r--src/git_interactive.rs16
-rw-r--r--src/list/mod.rs33
2 files changed, 30 insertions, 19 deletions
diff --git a/src/git_interactive.rs b/src/git_interactive.rs
index a25052e..54b2acb 100644
--- a/src/git_interactive.rs
+++ b/src/git_interactive.rs
@@ -1,7 +1,6 @@
use crate::list::action::Action;
use crate::list::line::Line;
use anyhow::{anyhow, Result};
-use std::cmp;
use std::fs::{read_to_string, File};
use std::io::Write;
use std::path::Path;
@@ -72,15 +71,8 @@ impl GitInteractive {
self.lines.clear();
}
- pub(crate) fn move_cursor_up(&mut self, amount: usize) {
- self.selected_line_index = match amount {
- a if a >= self.selected_line_index => 1,
- _ => self.selected_line_index - amount,
- };
- }
-
- pub(crate) fn move_cursor_down(&mut self, amount: usize) {
- self.selected_line_index = cmp::min(self.selected_line_index + amount, self.lines.len());
+ pub(crate) fn set_selected_line_index(&mut self, selected_line_index: usize) {
+ self.selected_line_index = selected_line_index;
}
pub(crate) fn start_visual_mode(&mut self) {
@@ -113,7 +105,7 @@ impl GitInteractive {
if let Some(visual_index_start) = self.visual_index_start {
self.visual_index_start = Some(visual_index_start - 1);
}
- self.move_cursor_up(1);
+ self.selected_line_index -= 1;
}
pub(crate) fn swap_range_down(&mut self) {
@@ -139,7 +131,7 @@ impl GitInteractive {
self.visual_index_start = Some(visual_index_start + 1);
}
- self.move_cursor_down(1);
+ self.selected_line_index += 1;
}
pub(crate) fn edit_selected_line(&mut self, content: &str) {
diff --git a/src/list/mod.rs b/src/list/mod.rs
index 837aa18..b812b14 100644
--- a/src/list/mod.rs
+++ b/src/list/mod.rs
@@ -16,6 +16,7 @@ use crate::process::state::State;
use crate::view::view_data::ViewData;
use crate::view::view_line::ViewLine;
use crate::view::View;
+use std::cmp;
#[derive(Debug, PartialEq)]
enum ListState {
@@ -74,11 +75,11 @@ impl<'l> ProcessModule for List<'l> {
Input::MoveCursorLeft => self.view_data.scroll_left(),
Input::MoveCursorRight => self.view_data.scroll_right(),
Input::MoveCursorDown => {
- git_interactive.move_cursor_down(1);
+ Self::move_cursor_down(git_interactive, 1);
},
- Input::MoveCursorUp => git_interactive.move_cursor_up(1),
- Input::MoveCursorPageDown => git_interactive.move_cursor_down(view_height / 2),
- Input::MoveCursorPageUp => git_interactive.move_cursor_up(view_height / 2),
+ Input::MoveCursorUp => Self::move_cursor_up(git_interactive, 1),
+ Input::MoveCursorPageDown => Self::move_cursor_down(git_interactive, view_height / 2),
+ Input::MoveCursorPageUp => Self::move_cursor_up(git_interactive, view_height / 2),
_ => {
result = match self.state {
ListState::Normal => self.handle_normal_mode_input(input, result, git_interactive),
@@ -114,10 +115,28 @@ impl<'l> List<'l> {
}
}
+ pub(crate) fn move_cursor_up(git_interactive: &mut GitInteractive, amount: usize) {
+ let current_selected_line_index = git_interactive.get_selected_line_index();
+ git_interactive.set_selected_line_index(
+ if amount >= current_selected_line_index {
+ 1
+ }
+ else {
+ current_selected_line_index - amount
+ },
+ );
+ }
+
+ pub(crate) fn move_cursor_down(git_interactive: &mut GitInteractive, amount: usize) {
+ let current_selected_line_index = git_interactive.get_selected_line_index();
+ let lines_length = git_interactive.get_lines().len();
+ git_interactive.set_selected_line_index(cmp::min(current_selected_line_index + amount, lines_length));
+ }
+
fn set_selected_line_action(&self, git_interactive: &mut GitInteractive, action: Action, advanced_next: bool) {
git_interactive.set_range_action(action);
if advanced_next && self.config.auto_select_next {
- git_interactive.move_cursor_down(1);
+ Self::move_cursor_down(git_interactive, 1);
}
}
@@ -153,11 +172,11 @@ impl<'l> List<'l> {
let action = git_interactive.get_selected_line().get_action();
if action == &Action::Break {
git_interactive.remove_line(git_interactive.get_selected_line_index());
- git_interactive.move_cursor_up(1);
+ Self::move_cursor_up(git_interactive, 1);
}
else {
git_interactive.add_line(git_interactive.get_selected_line_index() + 1, Line::new_break());
- git_interactive.move_cursor_down(1);
+ Self::move_cursor_down(git_interactive, 1);
}
},
Input::ActionDrop => self.set_selected_line_action(git_interactive, Action::Drop, true),