.. [no ci]

This commit is contained in:
sxyazi 2023-10-01 13:25:25 +08:00
parent 5c336608db
commit 5bd885bd2a
No known key found for this signature in database
3 changed files with 27 additions and 10 deletions

View file

@ -1,9 +1,9 @@
pub struct BackStack<T: Eq> { pub struct Backstack<T: Eq> {
cursor: usize, cursor: usize,
stack: Vec<T>, stack: Vec<T>,
} }
impl<T: Eq> BackStack<T> { impl<T: Eq> Backstack<T> {
pub fn new(item: T) -> Self { Self { cursor: 0, stack: vec![item] } } pub fn new(item: T) -> Self { Self { cursor: 0, stack: vec![item] } }
pub fn push(&mut self, item: T) { pub fn push(&mut self, item: T) {
@ -27,8 +27,8 @@ impl<T: Eq> BackStack<T> {
} }
} }
#[inline]
#[cfg(test)] #[cfg(test)]
#[inline]
pub fn current(&self) -> &T { &self.stack[self.cursor] } pub fn current(&self) -> &T { &self.stack[self.cursor] }
pub fn shift_backward(&mut self) -> Option<&T> { pub fn shift_backward(&mut self) -> Option<&T> {
@ -56,7 +56,7 @@ mod tests {
#[test] #[test]
fn test_backstack() { fn test_backstack() {
let mut backstack = BackStack::<u32>::new(1); let mut backstack = Backstack::<u32>::new(1);
assert_eq!(backstack.current(), &1); assert_eq!(backstack.current(), &1);
backstack.push(2); backstack.push(2);

View file

@ -8,6 +8,7 @@ mod tab;
mod tabs; mod tabs;
mod watcher; mod watcher;
pub use backstack::*;
pub use finder::*; pub use finder::*;
pub use folder::*; pub use folder::*;
pub use manager::*; pub use manager::*;

View file

@ -6,7 +6,7 @@ use shared::{Debounce, Defer, InputError, Url};
use tokio::{pin, task::JoinHandle}; use tokio::{pin, task::JoinHandle};
use tokio_stream::{wrappers::UnboundedReceiverStream, StreamExt}; 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}; use crate::{emit, external::{self, FzfOpt, ZoxideOpt}, files::{File, FilesOp, FilesSorter}, input::InputOpt, Event, Step, BLOCKER};
pub struct Tab { pub struct Tab {
@ -14,7 +14,7 @@ pub struct Tab {
pub(super) current: Folder, pub(super) current: Folder,
pub(super) parent: Option<Folder>, pub(super) parent: Option<Folder>,
pub(super) backstack: BackStack<Url>, pub(super) backstack: Backstack<Url>,
pub(super) history: BTreeMap<Url, Folder>, pub(super) history: BTreeMap<Url, Folder>,
pub(super) preview: Preview, pub(super) preview: Preview,
@ -33,7 +33,7 @@ impl From<Url> for Tab {
current: Folder::from(url.clone()), current: Folder::from(url.clone()),
parent, parent,
backstack: BackStack::new(url), backstack: Backstack::new(url),
history: Default::default(), history: Default::default(),
preview: Default::default(), preview: Default::default(),
@ -101,6 +101,7 @@ impl Tab {
target = target.parent_url().unwrap(); target = target.parent_url().unwrap();
} }
// Already in target
if self.current.cwd == target { if self.current.cwd == target {
if hovered.map(|h| self.current.hover_force(h)) == Some(true) { if hovered.map(|h| self.current.hover_force(h)) == Some(true) {
emit!(Hover); emit!(Hover);
@ -108,24 +109,31 @@ impl Tab {
return false; return false;
} }
// Take parent to history
if let Some(rep) = self.parent.take() { if let Some(rep) = self.parent.take() {
self.history.insert(rep.cwd.clone(), rep); self.history.insert(rep.cwd.clone(), rep);
} }
// Current
let rep = self.history_new(&target); let rep = self.history_new(&target);
let rep = mem::replace(&mut self.current, rep); let rep = mem::replace(&mut self.current, rep);
if rep.cwd.is_regular() { if rep.cwd.is_regular() {
self.history.insert(rep.cwd.clone(), rep); self.history.insert(rep.cwd.clone(), rep);
self.backstack.push(target.clone());
} }
// Parent
if let Some(parent) = target.parent_url() { if let Some(parent) = target.parent_url() {
self.parent = Some(self.history_new(&parent)); self.parent = Some(self.history_new(&parent));
} }
// Hover the file
if let Some(h) = hovered { if let Some(h) = hovered {
self.current.hover_force(h); self.current.hover_force(h);
} }
// Backstack
self.backstack.push(target.clone());
emit!(Refresh); emit!(Refresh);
true true
} }
@ -150,18 +158,22 @@ impl Tab {
return false; return false;
} }
// Current
let rep = self.history_new(hovered.url()); let rep = self.history_new(hovered.url());
let rep = mem::replace(&mut self.current, rep); let rep = mem::replace(&mut self.current, rep);
if rep.cwd.is_regular() { if rep.cwd.is_regular() {
self.history.insert(rep.cwd.clone(), rep); self.history.insert(rep.cwd.clone(), rep);
self.backstack.push(self.current.cwd.clone());
} }
// Parent
if let Some(rep) = self.parent.take() { if let Some(rep) = self.parent.take() {
self.history.insert(rep.cwd.clone(), rep); self.history.insert(rep.cwd.clone(), rep);
} }
self.parent = Some(self.history_new(&hovered.parent().unwrap())); self.parent = Some(self.history_new(&hovered.parent().unwrap()));
// Backstack
self.backstack.push(hovered.url_owned());
emit!(Refresh); emit!(Refresh);
true true
} }
@ -179,6 +191,7 @@ impl Tab {
return false; return false;
}; };
// Parent
if let Some(rep) = self.parent.take() { if let Some(rep) = self.parent.take() {
self.history.insert(rep.cwd.clone(), rep); self.history.insert(rep.cwd.clone(), rep);
} }
@ -186,13 +199,16 @@ impl Tab {
self.parent = Some(self.history_new(&parent)); self.parent = Some(self.history_new(&parent));
} }
// Current
let rep = self.history_new(&current); let rep = self.history_new(&current);
let rep = mem::replace(&mut self.current, rep); let rep = mem::replace(&mut self.current, rep);
if rep.cwd.is_regular() { if rep.cwd.is_regular() {
self.history.insert(rep.cwd.clone(), rep); self.history.insert(rep.cwd.clone(), rep);
self.backstack.push(self.current.cwd.clone());
} }
// Backstack
self.backstack.push(current);
emit!(Refresh); emit!(Refresh);
true true
} }