summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqkzk <qu3nt1n@gmail.com>2023-02-05 16:30:51 +0100
committerqkzk <qu3nt1n@gmail.com>2023-02-05 16:30:51 +0100
commited87ec24fc2c0a3f732edf425d43614ac5fb4609 (patch)
tree6c250e42e001ed6516069195c30b1ee385ab4ecf
parentccbcfaf33494597635a841c8488333ba8e5be4c4 (diff)
tree move up/down 10 lines at a time with pageup pagedownrefactored-colors
-rw-r--r--development.md1
-rw-r--r--src/action_map.rs6
-rw-r--r--src/event_exec.rs34
-rw-r--r--src/preview.rs26
-rw-r--r--src/tab.rs17
5 files changed, 66 insertions, 18 deletions
diff --git a/development.md b/development.md
index 1342210..f1ce896 100644
--- a/development.md
+++ b/development.md
@@ -374,6 +374,7 @@ New view: Tree ! Toggle with 't', fold with 'z'. Navigate normally.
- [x] FIX: when exiting search in tree mode, second line isn't updated
- [x] FIX: when filtering in tree mode, only the level 1 matching elements are displayed
Decided to keep directories when filtering in tree mode. Those are excluded when filtering in normal mode.
+ - [x] Tree: move 10 rows at a time
- [ ] Version 0.1.50 : safety & memory usage
diff --git a/src/action_map.rs b/src/action_map.rs
index 216c8b7..f84d60b 100644
--- a/src/action_map.rs
+++ b/src/action_map.rs
@@ -124,8 +124,8 @@ impl ActionMap {
ActionMap::NewFile => EventExec::event_new_file(current_tab),
ActionMap::NvimFilepicker => EventExec::event_nvim_filepicker(current_tab),
ActionMap::OpenFile => EventExec::event_open_file(status),
- ActionMap::PageDown => EventExec::event_page_down(status),
- ActionMap::PageUp => EventExec::event_page_up(status),
+ ActionMap::PageDown => EventExec::event_page_down(status, colors),
+ ActionMap::PageUp => EventExec::event_page_up(status, colors),
ActionMap::Preview => EventExec::event_preview(status, colors),
ActionMap::Quit => EventExec::event_quit(current_tab),
ActionMap::RefreshView => EventExec::event_refreshview(status, colors),
@@ -148,7 +148,7 @@ impl ActionMap {
ActionMap::TrashEmpty => EventExec::exec_trash_empty(status),
ActionMap::TrashOpen => EventExec::event_trash_open(status),
ActionMap::Tree => EventExec::event_tree(status, colors),
- ActionMap::TreeFold => EventExec::event_tree_fold(status, colors),
+ ActionMap::TreeFold => EventExec::event_tree_fold(current_tab, colors),
ActionMap::TreeFoldAll => EventExec::event_tree_fold_all(status, colors),
ActionMap::TreeUnFoldAll => EventExec::event_tree_unfold_all(status, colors),
ActionMap::OpenConfig => EventExec::event_open_config(status),
diff --git a/src/event_exec.rs b/src/event_exec.rs
index 2fa9e37..bfa13c7 100644
--- a/src/event_exec.rs
+++ b/src/event_exec.rs
@@ -1133,7 +1133,7 @@ impl EventExec {
Mode::Navigate(Navigate::EncryptedDrive) => {
EventExec::event_encrypted_drive_prev(status)
}
- Mode::Tree => EventExec::event_select_prev(status, colors)?,
+ Mode::Tree => EventExec::event_select_prev(status.selected(), colors)?,
Mode::InputCompleted(_) => {
status.selected().completion.prev();
}
@@ -1155,7 +1155,7 @@ impl EventExec {
EventExec::event_encrypted_drive_next(status)
}
Mode::InputCompleted(_) => status.selected().completion.next(),
- Mode::Tree => EventExec::event_select_next(status, colors)?,
+ Mode::Tree => EventExec::event_select_next(status.selected(), colors)?,
_ => (),
};
Ok(())
@@ -1234,18 +1234,20 @@ impl EventExec {
}
/// Move up 10 lines in normal mode and preview.
- pub fn event_page_up(status: &mut Status) -> FmResult<()> {
+ pub fn event_page_up(status: &mut Status, colors: &Colors) -> FmResult<()> {
match status.selected().mode {
Mode::Normal | Mode::Preview => EventExec::page_up(status.selected()),
+ Mode::Tree => EventExec::event_tree_page_up(status.selected(), colors)?,
_ => (),
};
Ok(())
}
/// Move down 10 lines in normal & preview mode.
- pub fn event_page_down(status: &mut Status) -> FmResult<()> {
+ pub fn event_page_down(status: &mut Status, colors: &Colors) -> FmResult<()> {
match status.selected().mode {
Mode::Normal | Mode::Preview => EventExec::page_down(status.selected()),
+ Mode::Tree => EventExec::event_tree_page_down(status.selected(), colors)?,
_ => (),
};
Ok(())
@@ -1481,13 +1483,11 @@ impl EventExec {
/// Fold the current node of the tree.
/// Has no effect on "file" nodes.
- pub fn event_tree_fold(status: &mut Status, colors: &Colors) -> FmResult<()> {
- let tab = status.selected();
-
+ pub fn event_tree_fold(tab: &mut Tab, colors: &Colors) -> FmResult<()> {
let (tree, _, _) = tab.directory.tree.explore_position(false);
tree.node.toggle_fold();
tab.directory.make_preview(colors);
- Self::event_select_next(status, colors)
+ Self::event_select_next(tab, colors)
}
/// Unfold every child node in the tree.
@@ -1526,13 +1526,23 @@ impl EventExec {
}
/// Select the next sibling of the current node.
- pub fn event_select_next(status: &mut Status, colors: &Colors) -> FmResult<()> {
- status.selected().tree_select_next(colors)
+ pub fn event_select_next(tab: &mut Tab, colors: &Colors) -> FmResult<()> {
+ tab.tree_select_next(colors)
}
/// Select the previous sibling of the current node.
- pub fn event_select_prev(status: &mut Status, colors: &Colors) -> FmResult<()> {
- status.selected().tree_select_prev(colors)
+ pub fn event_select_prev(tab: &mut Tab, colors: &Colors) -> FmResult<()> {
+ tab.tree_select_prev(colors)
+ }
+
+ /// Move up 10 lines in the tree
+ pub fn event_tree_page_up(tab: &mut Tab, colors: &Colors) -> FmResult<()> {
+ tab.tree_page_up(colors)
+ }
+
+ /// Move down 10 lines in the tree
+ pub fn event_tree_page_down(tab: &mut Tab, colors: &Colors) -> FmResult<()> {
+ tab.tree_page_down(colors)
}
/// Select the last leaf of the tree and reset the view.
diff --git a/src/preview.rs b/src/preview.rs
index f469361..8300dbb 100644
--- a/src/preview.rs
+++ b/src/preview.rs
@@ -602,7 +602,7 @@ impl Directory {
if self.selected_index + 1 < self.content.len() {
self.selected_index += 1;
}
- self.update_tree_from_index(colors)
+ self.update_tree_position_from_index(colors)
}
/// Select the previous sibling if any.
@@ -611,10 +611,30 @@ impl Directory {
if self.selected_index > 0 {
self.selected_index -= 1;
}
- self.update_tree_from_index(colors)
+ self.update_tree_position_from_index(colors)
}
- pub fn update_tree_from_index(&mut self, colors: &Colors) -> FmResult<()> {
+ /// Move up 10 times.
+ pub fn page_up(&mut self, colors: &Colors) -> FmResult<()> {
+ if self.selected_index > 10 {
+ self.selected_index -= 10;
+ } else {
+ self.selected_index = 1;
+ }
+ self.update_tree_position_from_index(colors)
+ }
+
+ /// Move down 10 times
+ pub fn page_down(&mut self, colors: &Colors) -> FmResult<()> {
+ self.selected_index += 10;
+ if self.selected_index >= self.content.len() {
+ self.selected_index = self.content.len() - 1;
+ }
+ self.update_tree_position_from_index(colors)
+ }
+
+ /// Update the position of the selected element from its index.
+ pub fn update_tree_position_from_index(&mut self, colors: &Colors) -> FmResult<()> {
self.tree.position = self.tree.position_from_index(self.selected_index);
let (_, _, node) = self.tree.select_from_position()?;
self.tree.current_node = node;
diff --git a/src/tab.rs b/src/tab.rs
index bfdaec7..4f4b238 100644
--- a/src/tab.rs
+++ b/src/tab.rs
@@ -283,6 +283,18 @@ impl Tab {
self.directory.select_parent(colors)
}
+ /// Move down 10 times in the tree
+ pub fn tree_page_down(&mut self, colors: &Colors) -> FmResult<()> {
+ self.directory.unselect_children();
+ self.directory.page_down(colors)
+ }
+
+ /// Move up 10 times in the tree
+ pub fn tree_page_up(&mut self, colors: &Colors) -> FmResult<()> {
+ self.directory.unselect_children();
+ self.directory.page_up(colors)
+ }
+
/// Select the next sibling.
pub fn tree_select_next(&mut self, colors: &Colors) -> FmResult<()> {
self.directory.unselect_children();
@@ -353,16 +365,21 @@ impl Tab {
Ok(())
}
+ /// Set a new mode and save the last one
pub fn set_mode(&mut self, new_mode: Mode) {
self.previous_mode = self.mode;
self.mode = new_mode;
}
+ /// Reset the last mode.
+ /// The last mode is set to normal again.
pub fn reset_mode(&mut self) {
self.mode = self.previous_mode;
self.previous_mode = Mode::Normal;
}
+ /// Returns true if the current mode requires 2 windows.
+ /// Only Tree, Normal & Preview doesn't require 2 windows.
pub fn need_second_window(&self) -> bool {
!matches!(self.mode, Mode::Normal | Mode::Tree | Mode::Preview)
}