From 4cd7109b36d200b252c36dd29b23eb5c26a03989 Mon Sep 17 00:00:00 2001 From: Tim Oram Date: Thu, 29 Oct 2020 09:37:29 -0230 Subject: Move visual start index to list module The visual start index is only used in the List module and should not exist in the GitInteractive struct. This change moves the visual start index into the List module and updates any references to it. --- src/git_interactive.rs | 23 +---------------------- src/list/mod.rs | 42 +++++++++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 39 deletions(-) (limited to 'src') 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, selected_line_index: usize, - visual_index_start: Option, 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 { - 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, 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); }, -- cgit v1.2.3