From 97c122235a8baaa5ea2a7b15e053423d5cfadb39 Mon Sep 17 00:00:00 2001 From: Tim Oram Date: Mon, 26 Oct 2020 10:11:08 -0230 Subject: Make visual index optional combine functions This makes the visual index an optional value in GitInteractive and combines the selected index functions into the range functions. --- src/git_interactive.rs | 78 ++++++++++++++++++++++++-------------------------- src/list/mod.rs | 23 ++++++++------- 2 files changed, 49 insertions(+), 52 deletions(-) diff --git a/src/git_interactive.rs b/src/git_interactive.rs index 65ee1a6..18f546c 100644 --- a/src/git_interactive.rs +++ b/src/git_interactive.rs @@ -25,7 +25,7 @@ pub struct GitInteractive { filepath: PathBuf, lines: Vec, selected_line_index: usize, - visual_index_start: usize, + visual_index_start: Option, comment_char: String, } @@ -35,7 +35,7 @@ impl GitInteractive { filepath: path, lines, selected_line_index: 1, - visual_index_start: 1, + visual_index_start: None, comment_char: String::from(comment_char), }) } @@ -81,61 +81,61 @@ impl GitInteractive { } pub(crate) fn start_visual_mode(&mut self) { - self.visual_index_start = self.selected_line_index; + self.visual_index_start = Some(self.selected_line_index); } - pub(crate) fn swap_visual_range_up(&mut self) { - if self.selected_line_index == 1 || self.visual_index_start == 1 { + pub(crate) fn end_visual_mode(&mut self) { + self.visual_index_start = None; + } + + pub(crate) fn swap_range_up(&mut self) { + let end_index = self.visual_index_start.unwrap_or(self.selected_line_index); + let start_index = self.selected_line_index; + + if end_index == 1 || start_index == 1 { return; } - let range = if self.selected_line_index <= self.visual_index_start { - self.selected_line_index..=self.visual_index_start + let range = if end_index <= start_index { + end_index..=start_index } else { - self.visual_index_start..=self.selected_line_index + start_index..=end_index }; for index in range { self.lines.swap(index - 1, index - 2); } - self.visual_index_start -= 1; - self.move_cursor_up(1); - } - pub(crate) fn swap_selected_up(&mut self) { - if self.selected_line_index == 1 { - return; + if let Some(visual_index_start) = self.visual_index_start { + self.visual_index_start = Some(visual_index_start - 1); } - self.lines - .swap(self.selected_line_index - 1, self.selected_line_index - 2); self.move_cursor_up(1); } - pub(crate) fn swap_visual_range_down(&mut self) { - if self.selected_line_index == self.lines.len() || self.visual_index_start == self.lines.len() { + pub(crate) fn swap_range_down(&mut self) { + let end_index = self.visual_index_start.unwrap_or(self.selected_line_index); + let start_index = self.selected_line_index; + + if end_index == self.lines.len() || start_index == self.lines.len() { return; } - let range = if self.selected_line_index <= self.visual_index_start { - self.selected_line_index..=self.visual_index_start + let range = if end_index <= start_index { + end_index..=start_index } else { - self.visual_index_start..=self.selected_line_index + start_index..=end_index }; for index in range.rev() { self.lines.swap(index - 1, index); } - self.visual_index_start += 1; - self.move_cursor_down(1); - } - pub(crate) fn swap_selected_down(&mut self) { - if self.selected_line_index == self.lines.len() { - return; + if let Some(visual_index_start) = self.visual_index_start { + self.visual_index_start = Some(visual_index_start + 1); } - self.lines.swap(self.selected_line_index - 1, self.selected_line_index); + self.move_cursor_down(1); } @@ -143,12 +143,15 @@ impl GitInteractive { self.lines[self.selected_line_index - 1].edit_content(content); } - pub(crate) fn set_visual_range_action(&mut self, action: Action) { - let range = if self.selected_line_index <= self.visual_index_start { - self.selected_line_index..=self.visual_index_start + 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; + + let range = if start_index <= end_index { + start_index..=end_index } else { - self.visual_index_start..=self.selected_line_index + end_index..=start_index }; for index in range { @@ -159,13 +162,6 @@ impl GitInteractive { } } - pub(crate) fn set_selected_line_action(&mut self, action: Action) { - let selected_action = self.lines[self.selected_line_index - 1].get_action(); - if *selected_action != Action::Exec && *selected_action != Action::Break { - self.lines[self.selected_line_index - 1].set_action(action); - } - } - pub(crate) fn toggle_break(&mut self) { let selected_action = self.lines[self.selected_line_index - 1].get_action(); if *selected_action == Action::Break { @@ -194,8 +190,8 @@ impl GitInteractive { &self.selected_line_index } - pub(crate) const fn get_visual_start_index(&self) -> &usize { - &self.visual_index_start + pub(crate) fn get_visual_start_index(&self) -> usize { + self.visual_index_start.unwrap_or(self.selected_line_index) } pub(crate) const fn get_filepath(&self) -> &PathBuf { diff --git a/src/list/mod.rs b/src/list/mod.rs index 1299dcd..88b78d7 100644 --- a/src/list/mod.rs +++ b/src/list/mod.rs @@ -115,7 +115,7 @@ impl<'l> List<'l> { } fn set_selected_line_action(&self, git_interactive: &mut GitInteractive, action: Action) { - git_interactive.set_selected_line_action(action); + git_interactive.set_range_action(action); if self.config.auto_select_next { git_interactive.move_cursor_down(1); } @@ -160,8 +160,8 @@ impl<'l> List<'l> { result = result.state(State::Edit); } }, - Input::SwapSelectedDown => git_interactive.swap_selected_down(), - Input::SwapSelectedUp => git_interactive.swap_selected_up(), + Input::SwapSelectedDown => git_interactive.swap_range_down(), + Input::SwapSelectedUp => git_interactive.swap_range_up(), Input::ToggleVisualMode => { git_interactive.start_visual_mode(); self.state = ListState::Visual; @@ -196,15 +196,16 @@ impl<'l> List<'l> { Input::ForceRebase => { result = result.exit_status(ExitStatus::Good); }, - Input::ActionDrop => git_interactive.set_visual_range_action(Action::Drop), - Input::ActionEdit => git_interactive.set_visual_range_action(Action::Edit), - Input::ActionFixup => git_interactive.set_visual_range_action(Action::Fixup), - Input::ActionPick => git_interactive.set_visual_range_action(Action::Pick), - Input::ActionReword => git_interactive.set_visual_range_action(Action::Reword), - Input::ActionSquash => git_interactive.set_visual_range_action(Action::Squash), - Input::SwapSelectedDown => git_interactive.swap_visual_range_down(), - Input::SwapSelectedUp => git_interactive.swap_visual_range_up(), + Input::ActionDrop => git_interactive.set_range_action(Action::Drop), + Input::ActionEdit => git_interactive.set_range_action(Action::Edit), + Input::ActionFixup => git_interactive.set_range_action(Action::Fixup), + Input::ActionPick => git_interactive.set_range_action(Action::Pick), + Input::ActionReword => git_interactive.set_range_action(Action::Reword), + Input::ActionSquash => git_interactive.set_range_action(Action::Squash), + Input::SwapSelectedDown => git_interactive.swap_range_down(), + Input::SwapSelectedUp => git_interactive.swap_range_up(), Input::ToggleVisualMode => { + git_interactive.end_visual_mode(); self.state = ListState::Normal; result = result.state(State::List); }, -- cgit v1.2.3