diff options
-rw-r--r-- | src/git_interactive.rs | 23 | ||||
-rw-r--r-- | src/list/mod.rs | 42 |
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); }, |