This commit is contained in:
sxyazi 2023-08-28 13:45:32 +08:00
parent 0feb025dcf
commit ab27c7a069
No known key found for this signature in database
7 changed files with 26 additions and 19 deletions

View file

@ -36,7 +36,7 @@ impl<'a> Folder<'a> {
THEME THEME
.filetypes .filetypes
.iter() .iter()
.find(|x| x.matches(file.path(), mimetype.get(file.path()), file.meta.is_dir())) .find(|x| x.matches(file.path(), mimetype.get(file.path()), file.is_dir()))
.map(|x| x.style.get()) .map(|x| x.style.get())
.unwrap_or_else(Style::new) .unwrap_or_else(Style::new)
} }
@ -60,7 +60,7 @@ impl<'a> Widget for Folder<'a> {
let icon = THEME let icon = THEME
.icons .icons
.iter() .iter()
.find(|x| x.name.match_path(f.path(), Some(f.meta.is_dir()))) .find(|x| x.name.match_path(f.path(), Some(f.is_dir())))
.map(|x| x.display.as_ref()) .map(|x| x.display.as_ref())
.unwrap_or(""); .unwrap_or("");

View file

@ -71,7 +71,7 @@ impl Widget for Right<'_> {
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
if let Some(h) = &manager.hovered { if let Some(h) = &manager.hovered {
use std::os::unix::prelude::PermissionsExt; use std::os::unix::prelude::PermissionsExt;
spans.extend(self.permissions(&shared::file_mode(h.meta.permissions().mode()))) spans.extend(self.permissions(&shared::file_mode(h.meta().permissions().mode())))
} }
// Position // Position

View file

@ -6,7 +6,7 @@ use tokio::fs;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct File { pub struct File {
pub(super) path: PathBuf, pub(super) path: PathBuf,
pub meta: Metadata, pub(super) meta: Metadata,
pub length: Option<u64>, pub length: Option<u64>,
pub link_to: Option<PathBuf>, pub link_to: Option<PathBuf>,
pub is_link: bool, pub is_link: bool,
@ -36,6 +36,7 @@ impl File {
} }
impl File { impl File {
// --- Path
#[inline] #[inline]
pub fn path(&self) -> &PathBuf { &self.path } pub fn path(&self) -> &PathBuf { &self.path }
@ -44,4 +45,14 @@ impl File {
#[inline] #[inline]
pub fn name(&self) -> Option<Cow<str>> { self.path.file_name().map(|s| s.to_string_lossy()) } pub fn name(&self) -> Option<Cow<str>> { self.path.file_name().map(|s| s.to_string_lossy()) }
// --- Meta
#[inline]
pub fn meta(&self) -> &Metadata { &self.meta }
#[inline]
pub fn is_file(&self) -> bool { self.meta.is_file() }
#[inline]
pub fn is_dir(&self) -> bool { self.meta.is_dir() }
} }

View file

@ -54,9 +54,9 @@ impl FilesSorter {
fn sort_naturally(&self, items: &mut Vec<File>) { fn sort_naturally(&self, items: &mut Vec<File>) {
let mut indices = Vec::with_capacity(items.len()); let mut indices = Vec::with_capacity(items.len());
let mut entities = Vec::with_capacity(items.len()); let mut entities = Vec::with_capacity(items.len());
for (i, file) in items.into_iter().enumerate() { for (i, file) in items.iter().enumerate() {
indices.push(i); indices.push(i);
entities.push((file.path.to_string_lossy(), &*file)); entities.push((file.path.to_string_lossy(), file));
} }
indices.sort_unstable_by(|&a, &b| { indices.sort_unstable_by(|&a, &b| {
@ -85,6 +85,6 @@ impl FilesSorter {
#[inline] #[inline]
fn promote(&self, a: &File, b: &File) -> Ordering { fn promote(&self, a: &File, b: &File) -> Ordering {
if self.dir_first { b.meta.is_dir().cmp(&a.meta.is_dir()) } else { Ordering::Equal } if self.dir_first { b.is_dir().cmp(&a.is_dir()) } else { Ordering::Equal }
} }
} }

View file

@ -41,7 +41,7 @@ impl Manager {
for tab in self.tabs.iter() { for tab in self.tabs.iter() {
to_watch.insert(&tab.current.cwd); to_watch.insert(&tab.current.cwd);
if let Some(ref h) = tab.current.hovered { if let Some(ref h) = tab.current.hovered {
if h.meta.is_dir() { if h.is_dir() {
to_watch.insert(h.path()); to_watch.insert(h.path());
} }
} }
@ -61,7 +61,7 @@ impl Manager {
self.active_mut().preview_reset_image(); self.active_mut().preview_reset_image();
} }
let mime = if hovered.meta.is_dir() { let mime = if hovered.is_dir() {
MIME_DIR.to_owned() MIME_DIR.to_owned()
} else if let Some(m) = self.mimetype.get(hovered.path()).cloned() { } else if let Some(m) = self.mimetype.get(hovered.path()).cloned() {
m m
@ -123,11 +123,7 @@ impl Manager {
.map(|f| { .map(|f| {
( (
f.path().as_os_str().to_owned(), f.path().as_os_str().to_owned(),
if f.meta.is_dir() { if f.is_dir() { Some(MIME_DIR.to_owned()) } else { self.mimetype.get(f.path()).cloned() },
Some(MIME_DIR.to_owned())
} else {
self.mimetype.get(f.path()).cloned()
},
) )
}) })
.collect(); .collect();
@ -401,7 +397,7 @@ impl Manager {
return b; return b;
}; };
if hovered.meta.is_dir() { if hovered.is_dir() {
self.watcher.trigger_dirs(&[hovered.path()]); self.watcher.trigger_dirs(&[hovered.path()]);
} }
b b

View file

@ -78,7 +78,7 @@ impl Tab {
}; };
let mut hovered = None; let mut hovered = None;
if !file.meta.is_dir() { if !file.is_dir() {
hovered = Some(file); hovered = Some(file);
target = target.parent().unwrap().to_path_buf(); target = target.parent().unwrap().to_path_buf();
} }
@ -127,7 +127,7 @@ impl Tab {
let Some(hovered) = self.current.hovered.clone() else { let Some(hovered) = self.current.hovered.clone() else {
return false; return false;
}; };
if !hovered.meta.is_dir() { if !hovered.is_dir() {
return false; return false;
} }

View file

@ -217,7 +217,7 @@ impl Tasks {
} }
let targets: Vec<_> = let targets: Vec<_> =
targets.iter().filter(|f| f.meta.is_dir() && f.length.is_none()).map(|f| f.path()).collect(); targets.iter().filter(|f| f.is_dir() && f.length.is_none()).map(|f| f.path()).collect();
if !targets.is_empty() { if !targets.is_empty() {
self.scheduler.precache_size(targets); self.scheduler.precache_size(targets);
@ -230,7 +230,7 @@ impl Tasks {
pub fn precache_mime(&self, targets: &[File], mimetype: &HashMap<PathBuf, String>) -> bool { pub fn precache_mime(&self, targets: &[File], mimetype: &HashMap<PathBuf, String>) -> bool {
let targets: Vec<_> = targets let targets: Vec<_> = targets
.iter() .iter()
.filter(|f| f.meta.is_file() && !mimetype.contains_key(f.path())) .filter(|f| f.is_file() && !mimetype.contains_key(f.path()))
.map(|f| f.path().clone()) .map(|f| f.path().clone())
.collect(); .collect();