From 5bd885bd2a029faae3062f72491f71c960bdf90b Mon Sep 17 00:00:00 2001 From: sxyazi Date: Sun, 1 Oct 2023 13:25:25 +0800 Subject: [PATCH] .. [no ci] --- core/src/manager/backstack.rs | 8 ++++---- core/src/manager/mod.rs | 1 + core/src/manager/tab.rs | 28 ++++++++++++++++++++++------ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/core/src/manager/backstack.rs b/core/src/manager/backstack.rs index 358fa678..c65375b9 100644 --- a/core/src/manager/backstack.rs +++ b/core/src/manager/backstack.rs @@ -1,9 +1,9 @@ -pub struct BackStack { +pub struct Backstack { cursor: usize, stack: Vec, } -impl BackStack { +impl Backstack { pub fn new(item: T) -> Self { Self { cursor: 0, stack: vec![item] } } pub fn push(&mut self, item: T) { @@ -27,8 +27,8 @@ impl BackStack { } } - #[inline] #[cfg(test)] + #[inline] pub fn current(&self) -> &T { &self.stack[self.cursor] } pub fn shift_backward(&mut self) -> Option<&T> { @@ -56,7 +56,7 @@ mod tests { #[test] fn test_backstack() { - let mut backstack = BackStack::::new(1); + let mut backstack = Backstack::::new(1); assert_eq!(backstack.current(), &1); backstack.push(2); diff --git a/core/src/manager/mod.rs b/core/src/manager/mod.rs index 6ece3cb8..76e321e5 100644 --- a/core/src/manager/mod.rs +++ b/core/src/manager/mod.rs @@ -8,6 +8,7 @@ mod tab; mod tabs; mod watcher; +pub use backstack::*; pub use finder::*; pub use folder::*; pub use manager::*; diff --git a/core/src/manager/tab.rs b/core/src/manager/tab.rs index d14e0f30..ae88c2d3 100644 --- a/core/src/manager/tab.rs +++ b/core/src/manager/tab.rs @@ -6,7 +6,7 @@ use shared::{Debounce, Defer, InputError, Url}; use tokio::{pin, task::JoinHandle}; use tokio_stream::{wrappers::UnboundedReceiverStream, StreamExt}; -use super::{backstack::BackStack, Finder, Folder, Mode, Preview, PreviewLock}; +use super::{Backstack, Finder, Folder, Mode, Preview, PreviewLock}; use crate::{emit, external::{self, FzfOpt, ZoxideOpt}, files::{File, FilesOp, FilesSorter}, input::InputOpt, Event, Step, BLOCKER}; pub struct Tab { @@ -14,7 +14,7 @@ pub struct Tab { pub(super) current: Folder, pub(super) parent: Option, - pub(super) backstack: BackStack, + pub(super) backstack: Backstack, pub(super) history: BTreeMap, pub(super) preview: Preview, @@ -33,7 +33,7 @@ impl From for Tab { current: Folder::from(url.clone()), parent, - backstack: BackStack::new(url), + backstack: Backstack::new(url), history: Default::default(), preview: Default::default(), @@ -101,6 +101,7 @@ impl Tab { target = target.parent_url().unwrap(); } + // Already in target if self.current.cwd == target { if hovered.map(|h| self.current.hover_force(h)) == Some(true) { emit!(Hover); @@ -108,24 +109,31 @@ impl Tab { return false; } + // Take parent to history if let Some(rep) = self.parent.take() { self.history.insert(rep.cwd.clone(), rep); } + // Current let rep = self.history_new(&target); let rep = mem::replace(&mut self.current, rep); if rep.cwd.is_regular() { self.history.insert(rep.cwd.clone(), rep); - self.backstack.push(target.clone()); } + // Parent if let Some(parent) = target.parent_url() { self.parent = Some(self.history_new(&parent)); } + // Hover the file if let Some(h) = hovered { self.current.hover_force(h); } + + // Backstack + self.backstack.push(target.clone()); + emit!(Refresh); true } @@ -150,18 +158,22 @@ impl Tab { return false; } + // Current let rep = self.history_new(hovered.url()); let rep = mem::replace(&mut self.current, rep); if rep.cwd.is_regular() { self.history.insert(rep.cwd.clone(), rep); - self.backstack.push(self.current.cwd.clone()); } + // Parent if let Some(rep) = self.parent.take() { self.history.insert(rep.cwd.clone(), rep); } self.parent = Some(self.history_new(&hovered.parent().unwrap())); + // Backstack + self.backstack.push(hovered.url_owned()); + emit!(Refresh); true } @@ -179,6 +191,7 @@ impl Tab { return false; }; + // Parent if let Some(rep) = self.parent.take() { self.history.insert(rep.cwd.clone(), rep); } @@ -186,13 +199,16 @@ impl Tab { self.parent = Some(self.history_new(&parent)); } + // Current let rep = self.history_new(¤t); let rep = mem::replace(&mut self.current, rep); if rep.cwd.is_regular() { self.history.insert(rep.cwd.clone(), rep); - self.backstack.push(self.current.cwd.clone()); } + // Backstack + self.backstack.push(current); + emit!(Refresh); true }