This commit is contained in:
sxyazi 2023-08-28 15:34:27 +08:00
parent 4b98c65559
commit 9d1c5041fd
No known key found for this signature in database
6 changed files with 70 additions and 32 deletions

View file

@ -117,11 +117,13 @@ impl Executor {
exec.named.contains_key("block"), exec.named.contains_key("block"),
exec.named.contains_key("confirm"), exec.named.contains_key("confirm"),
), ),
"hidden" => cx.manager.current_mut().hidden(match exec.args.get(0).map(|s| s.as_str()) { "hidden" => {
Some("show") => Some(true), cx.manager.active_mut().set_show_hidden(match exec.args.get(0).map(|s| s.as_str()) {
Some("hide") => Some(false), Some("show") => Some(true),
_ => None, Some("hide") => Some(false),
}), _ => None,
})
}
"search" => match exec.args.get(0).map(|s| s.as_str()).unwrap_or("") { "search" => match exec.args.get(0).map(|s| s.as_str()).unwrap_or("") {
"rg" => cx.manager.active_mut().search(true), "rg" => cx.manager.active_mut().search(true),
"fd" => cx.manager.active_mut().search(false), "fd" => cx.manager.active_mut().search(false),

View file

@ -1,7 +1,6 @@
use std::{collections::{BTreeMap, BTreeSet}, mem, ops::Deref, path::{Path, PathBuf}}; use std::{collections::{BTreeMap, BTreeSet}, mem, ops::Deref, path::{Path, PathBuf}};
use anyhow::Result; use anyhow::Result;
use config::MANAGER;
use tokio::fs; use tokio::fs;
use super::{File, FilesSorter}; use super::{File, FilesSorter};
@ -27,7 +26,7 @@ impl Default for Files {
selected: Default::default(), selected: Default::default(),
sorter: Default::default(), sorter: Default::default(),
show_hidden: MANAGER.show_hidden, show_hidden: true,
} }
} }
} }
@ -211,11 +210,7 @@ impl Files {
// --- Show hidden // --- Show hidden
#[inline] #[inline]
pub fn show_hidden(&self) -> bool { self.show_hidden } pub fn set_show_hidden(&mut self, state: bool) -> bool {
#[inline]
pub fn set_show_hidden(&mut self, state: Option<bool>) -> bool {
let state = state.unwrap_or(!self.show_hidden);
if state == self.show_hidden { if state == self.show_hidden {
return false; return false;
} else if state && self.hidden.is_empty() { } else if state && self.hidden.is_empty() {

View file

@ -92,13 +92,6 @@ impl Folder {
old != self.cursor old != self.cursor
} }
pub fn hidden(&mut self, show: Option<bool>) -> bool {
if self.files.set_show_hidden(show) {
emit!(Refresh);
}
false
}
#[inline] #[inline]
pub fn window(&self) -> &[File] { pub fn window(&self) -> &[File] {
let end = (self.offset + MANAGER.layout.folder_height()).min(self.files.len()); let end = (self.offset + MANAGER.layout.folder_height()).min(self.files.len());

View file

@ -30,6 +30,8 @@ impl Manager {
pub fn refresh(&mut self) { pub fn refresh(&mut self) {
env::set_current_dir(self.cwd()).ok(); env::set_current_dir(self.cwd()).ok();
self.active_mut().apply_show_hidden();
if let Some(f) = self.parent() { if let Some(f) = self.parent() {
self.watcher.trigger_dirs(&[self.cwd(), &f.cwd]); self.watcher.trigger_dirs(&[self.cwd(), &f.cwd]);
} else { } else {

View file

@ -14,10 +14,11 @@ pub struct Tab {
pub(super) current: Folder, pub(super) current: Folder,
pub(super) parent: Option<Folder>, pub(super) parent: Option<Folder>,
search: Option<JoinHandle<Result<()>>>,
pub(super) history: BTreeMap<PathBuf, Folder>, pub(super) history: BTreeMap<PathBuf, Folder>,
pub(super) preview: Preview, pub(super) preview: Preview,
search: Option<JoinHandle<Result<()>>>,
pub(super) show_hidden: bool,
} }
impl Tab { impl Tab {
@ -27,10 +28,11 @@ impl Tab {
current: Folder::new(path), current: Folder::new(path),
parent: path.parent().map(Folder::new), parent: path.parent().map(Folder::new),
search: None,
history: Default::default(), history: Default::default(),
preview: Default::default(), preview: Default::default(),
search: None,
show_hidden: true,
} }
} }
@ -230,7 +232,7 @@ impl Tab {
} }
let cwd = self.current.cwd.clone(); let cwd = self.current.cwd.clone();
let hidden = self.current.files.show_hidden(); let hidden = self.show_hidden;
self.search = Some(tokio::spawn(async move { self.search = Some(tokio::spawn(async move {
let subject = emit!(Input(InputOpt::top("Search:"))).await?; let subject = emit!(Input(InputOpt::top("Search:"))).await?;
@ -347,9 +349,16 @@ impl Tab {
} }
impl Tab { impl Tab {
// --- Mode
#[inline] #[inline]
pub fn mode(&self) -> &Mode { &self.mode } pub fn mode(&self) -> &Mode { &self.mode }
#[inline]
pub fn in_selecting(&self) -> bool {
self.mode().is_visual() || self.current.files.has_selected()
}
// --- Current
#[inline] #[inline]
pub fn name(&self) -> &str { pub fn name(&self) -> &str {
self self
@ -373,11 +382,7 @@ impl Tab {
} }
} }
#[inline] // --- History
pub fn in_selecting(&self) -> bool {
self.mode().is_visual() || self.current.files.has_selected()
}
#[inline] #[inline]
pub fn history(&self, path: &Path) -> Option<&Folder> { self.history.get(path) } pub fn history(&self, path: &Path) -> Option<&Folder> { self.history.get(path) }
@ -386,6 +391,7 @@ impl Tab {
self.history.remove(path).unwrap_or_else(|| Folder::new(path)) self.history.remove(path).unwrap_or_else(|| Folder::new(path))
} }
// --- Preview
#[inline] #[inline]
pub fn preview(&self) -> &Preview { &self.preview } pub fn preview(&self) -> &Preview { &self.preview }
@ -394,4 +400,38 @@ impl Tab {
#[inline] #[inline]
pub fn preview_reset_image(&mut self) -> bool { self.preview.reset_image() } pub fn preview_reset_image(&mut self) -> bool { self.preview.reset_image() }
// --- Show hidden
pub fn set_show_hidden(&mut self, state: Option<bool>) -> bool {
let state = state.unwrap_or(!self.show_hidden);
if state == self.show_hidden {
return false;
}
self.show_hidden = state;
self.apply_show_hidden();
true
}
pub fn apply_show_hidden(&mut self) -> bool {
let state = self.show_hidden;
let mut applied = false;
applied |= self.current.files.set_show_hidden(state);
if let Some(parent) = self.parent.as_mut() {
applied |= parent.files.set_show_hidden(state);
}
applied |= match self.current.hovered {
Some(ref hovered) if hovered.is_dir() => self
.history
.get_mut(hovered.path())
.map(|f| f.files.set_show_hidden(state))
.unwrap_or(false),
_ => false,
};
applied
}
} }

View file

@ -1,6 +1,6 @@
use std::path::Path; use std::path::Path;
use config::BOOT; use config::{BOOT, MANAGER};
use super::Tab; use super::Tab;
use crate::emit; use crate::emit;
@ -14,7 +14,10 @@ pub struct Tabs {
impl Tabs { impl Tabs {
pub fn make() -> Self { pub fn make() -> Self {
let mut tabs = Self { idx: usize::MAX, items: vec![Tab::new(&BOOT.cwd)] }; let mut tab = Tab::new(&BOOT.cwd);
tab.set_show_hidden(Some(MANAGER.show_hidden));
let mut tabs = Self { idx: usize::MAX, items: vec![tab] };
tabs.set_idx(0); tabs.set_idx(0);
tabs tabs
} }
@ -24,7 +27,10 @@ impl Tabs {
return false; return false;
} }
self.items.insert(self.idx + 1, Tab::new(path)); let mut tab = Tab::new(path);
tab.set_show_hidden(Some(self.active().show_hidden));
self.items.insert(self.idx + 1, tab);
self.set_idx(self.idx + 1); self.set_idx(self.idx + 1);
true true
} }