summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/git_interactive.rs23
-rw-r--r--src/list/mod.rs42
2 files changed, 26 insertions, 39 deletions
diff --git a/src/git_interactive.rs b/src/git_interactive.rs
index d440fe0..f0d64c6 100644
--- a/src/git_interactive.rs
+++ b/src/git_interactive.rs
@@ -9,7 +9,6 @@ pub struct GitInteractive {
filepath: String,
lines: Vec<Line>,
selected_line_index: usize,
- visual_index_start: Option<usize>,
comment_char: String,
is_noop: bool,
}
@@ -21,7 +20,6 @@ impl GitInteractive {
lines: vec![],
selected_line_index: 1,
is_noop: false,
- visual_index_start: None,
comment_char: String::from(comment_char),
}
}
@@ -75,18 +73,6 @@ impl GitInteractive {
self.selected_line_index = selected_line_index;
}
- pub(crate) fn set_visual_index(&mut self, visual_index: usize) {
- self.visual_index_start = Some(visual_index);
- }
-
- pub(crate) fn start_visual_mode(&mut self) {
- self.visual_index_start = Some(self.selected_line_index);
- }
-
- pub(crate) fn end_visual_mode(&mut self) {
- self.visual_index_start = None;
- }
-
pub(crate) fn swap_lines(&mut self, a: usize, b: usize) {
self.lines.swap(a, b);
}
@@ -95,10 +81,7 @@ impl GitInteractive {
self.lines[self.selected_line_index - 1].edit_content(content);
}
- pub(crate) fn set_range_action(&mut self, action: Action) {
- let end_index = self.visual_index_start.unwrap_or(self.selected_line_index);
- let start_index = self.selected_line_index;
-
+ pub(crate) fn set_range_action(&mut self, start_index: usize, end_index: usize, action: Action) {
let range = if start_index <= end_index {
start_index..=end_index
}
@@ -134,10 +117,6 @@ impl GitInteractive {
self.selected_line_index
}
- pub(crate) const fn get_visual_start_index(&self) -> Option<usize> {
- self.visual_index_start
- }
-
pub(crate) fn get_filepath(&self) -> &str {
self.filepath.as_str()
}
diff --git a/src/list/mod.rs b/src/list/mod.rs
index feff5cb..d0a6346 100644
--- a/src/list/mod.rs
+++ b/src/list/mod.rs
@@ -29,6 +29,7 @@ pub struct List<'l> {
normal_mode_help_lines: Vec<(String, String)>,
state: ListState,
view_data: ViewData,
+ visual_index_start: Option<usize>,
visual_mode_help_lines: Vec<(String, String)>,
}
@@ -39,8 +40,8 @@ impl<'l> ProcessModule for List<'l> {
self.view_data.clear();
let is_visual_mode = self.state == ListState::Visual;
- let visual_index = git_interactive
- .get_visual_start_index()
+ let visual_index = self
+ .visual_index_start
.unwrap_or_else(|| git_interactive.get_selected_line_index())
- 1;
let selected_index = git_interactive.get_selected_line_index() - 1;
@@ -60,6 +61,9 @@ impl<'l> ProcessModule for List<'l> {
self.view_data.set_view_size(view_width, view_height);
self.view_data.rebuild();
+ if let Some(visual_index) = self.visual_index_start {
+ self.view_data.ensure_line_visible(visual_index - 1);
+ }
self.view_data.ensure_line_visible(selected_index);
&self.view_data
}
@@ -114,6 +118,7 @@ impl<'l> List<'l> {
normal_mode_help_lines: get_list_normal_mode_help_lines(&config.key_bindings),
state: ListState::Normal,
view_data,
+ visual_index_start: None,
visual_mode_help_lines: get_list_visual_mode_help_lines(&config.key_bindings),
}
}
@@ -137,15 +142,18 @@ impl<'l> List<'l> {
}
fn set_selected_line_action(&self, git_interactive: &mut GitInteractive, action: Action, advanced_next: bool) {
- git_interactive.set_range_action(action);
+ let start_index = git_interactive.get_selected_line_index();
+ let end_index = self.visual_index_start.unwrap_or(start_index);
+
+ git_interactive.set_range_action(start_index, end_index, action);
if advanced_next && self.config.auto_select_next {
Self::move_cursor_down(git_interactive, 1);
}
}
- pub(crate) fn swap_range_up(git_interactive: &mut GitInteractive) {
+ pub(crate) fn swap_range_up(&mut self, git_interactive: &mut GitInteractive) {
let start_index = git_interactive.get_selected_line_index();
- let end_index = git_interactive.get_visual_start_index().unwrap_or(start_index);
+ let end_index = self.visual_index_start.unwrap_or(start_index);
if end_index == 1 || start_index == 1 {
return;
@@ -162,15 +170,15 @@ impl<'l> List<'l> {
git_interactive.swap_lines(index - 1, index - 2);
}
- if let Some(visual_index_start) = git_interactive.get_visual_start_index() {
- git_interactive.set_visual_index(visual_index_start - 1);
+ if let Some(visual_index_start) = self.visual_index_start {
+ self.visual_index_start = Some(visual_index_start - 1);
}
Self::move_cursor_up(git_interactive, 1);
}
- pub(crate) fn swap_range_down(git_interactive: &mut GitInteractive) {
+ pub(crate) fn swap_range_down(&mut self, git_interactive: &mut GitInteractive) {
let start_index = git_interactive.get_selected_line_index();
- let end_index = git_interactive.get_visual_start_index().unwrap_or(start_index);
+ let end_index = self.visual_index_start.unwrap_or(start_index);
let lines_length = git_interactive.get_lines().len();
if end_index == lines_length || start_index == lines_length {
@@ -188,8 +196,8 @@ impl<'l> List<'l> {
git_interactive.swap_lines(index - 1, index);
}
- if let Some(visual_index_start) = git_interactive.get_visual_start_index() {
- git_interactive.set_visual_index(visual_index_start + 1);
+ if let Some(visual_index_start) = self.visual_index_start {
+ self.visual_index_start = Some(visual_index_start + 1);
}
Self::move_cursor_down(git_interactive, 1);
@@ -245,10 +253,10 @@ impl<'l> List<'l> {
result = result.state(State::Edit);
}
},
- Input::SwapSelectedDown => Self::swap_range_down(git_interactive),
- Input::SwapSelectedUp => Self::swap_range_up(git_interactive),
+ Input::SwapSelectedDown => self.swap_range_down(git_interactive),
+ Input::SwapSelectedUp => self.swap_range_up(git_interactive),
Input::ToggleVisualMode => {
- git_interactive.start_visual_mode();
+ self.visual_index_start = Some(git_interactive.get_selected_line_index());
self.state = ListState::Visual;
result = result.state(State::List);
},
@@ -287,10 +295,10 @@ impl<'l> List<'l> {
Input::ActionPick => self.set_selected_line_action(git_interactive, Action::Pick, false),
Input::ActionReword => self.set_selected_line_action(git_interactive, Action::Reword, false),
Input::ActionSquash => self.set_selected_line_action(git_interactive, Action::Squash, false),
- Input::SwapSelectedDown => Self::swap_range_down(git_interactive),
- Input::SwapSelectedUp => Self::swap_range_up(git_interactive),
+ Input::SwapSelectedDown => self.swap_range_down(git_interactive),
+ Input::SwapSelectedUp => self.swap_range_up(git_interactive),
Input::ToggleVisualMode => {
- git_interactive.end_visual_mode();
+ self.visual_index_start = None;
self.state = ListState::Normal;
result = result.state(State::List);
},