summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Oram <dev@mitmaro.ca>2020-10-26 10:11:08 -0230
committerTim Oram <dev@mitmaro.ca>2020-10-29 19:50:38 -0230
commit97c122235a8baaa5ea2a7b15e053423d5cfadb39 (patch)
tree753079b4235e9b0bf9bf122d43a09cb581db4824
parent73c881dde4570416a1c717ce1f6c30cd8700d745 (diff)
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.
-rw-r--r--src/git_interactive.rs78
-rw-r--r--src/list/mod.rs23
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<Line>,
selected_line_index: usize,
- visual_index_start: usize,
+ visual_index_start: Option<usize>,
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);
},