summaryrefslogtreecommitdiffstats
path: root/src/files.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/files.rs')
-rw-r--r--src/files.rs54
1 files changed, 40 insertions, 14 deletions
diff --git a/src/files.rs b/src/files.rs
index c7d250a..78741c1 100644
--- a/src/files.rs
+++ b/src/files.rs
@@ -8,6 +8,7 @@ use std::sync::{Arc, Mutex, RwLock};
use std::sync::mpsc::Sender;
use std::hash::{Hash, Hasher};
use std::str::FromStr;
+use std::sync::atomic::{AtomicU32, Ordering};
use lscolors::LsColors;
use tree_magic;
@@ -157,8 +158,6 @@ impl RefreshPackage {
for event in events.into_iter() {
match event {
Create(mut file) => {
- let dirty_meta = files.dirty_meta.clone();
- file.dirty_meta = Some(dirty_meta);
file.meta_sync().log();
new_files.push(file);
}
@@ -251,7 +250,6 @@ pub struct Files {
pub filter: Option<String>,
pub filter_selected: bool,
pub dirty: DirtyBit,
- pub dirty_meta: AsyncDirtyBit,
}
impl Index<usize> for Files {
@@ -294,7 +292,6 @@ impl Default for Files {
filter: None,
filter_selected: false,
dirty: DirtyBit::new(),
- dirty_meta: AsyncDirtyBit::new(),
}
}
}
@@ -325,8 +322,6 @@ impl Files {
let mut files = Files::default();
files.directory = File::new_from_path(&path, None)?;
files.len = len;
- files.dirty_meta = dirty_meta;
-
Ok(files)
}
@@ -371,7 +366,6 @@ impl Files {
filter: None,
filter_selected: false,
dirty: dirty,
- dirty_meta: dirty_meta,
};
Ok(files)
@@ -418,6 +412,7 @@ impl Files {
(!filter_selected || f.selected))
.filter(move |(_,f)| !(!show_hidden && f.hidden))
}
+
pub fn iter_files(&self) -> impl Iterator<Item=&File> {
let filter = self.filter.clone();
let filter_selected = self.filter_selected;
@@ -761,13 +756,14 @@ impl std::default::Default for File {
}
+
#[derive(Clone)]
pub struct File {
pub name: String,
pub path: PathBuf,
pub hidden: bool,
pub kind: Kind,
- pub dirsize: Option<usize>,
+ pub dirsize: Option<Arc<AtomicU32>>,
pub target: Option<PathBuf>,
pub color: Option<lscolors::Color>,
pub meta: Option<Metadata>,
@@ -882,14 +878,27 @@ impl File {
self.meta = Some(meta);
self.process_meta().log();
- if self.is_dir() {
- let dirsize = std::fs::read_dir(&self.path)?.count();
- self.dirsize = Some(dirsize);
- }
+ // if self.is_dir() {
+ // let dirsize = std::fs::read_dir(&self.path)?.count();
+ // self.dirsize = Some(dirsize);
+ // }
Ok(())
}
+ pub fn run_dirsize(&mut self) {
+ let dirsize = Arc::new(AtomicU32::new(0));
+ self.dirsize = Some(dirsize.clone());
+ let path = self.path.clone();
+ rayon::spawn(move || {
+ std::fs::read_dir(&path)
+ .map(|dirs| {
+ let size = dirs.count();
+ dirsize.store(size as u32, Ordering::Release);
+ });
+ });
+ }
+
pub fn meta(&self) -> Option<&Metadata> {
self.meta.as_ref()
}
@@ -921,8 +930,13 @@ impl File {
}
pub fn calculate_size(&self) -> HResult<(u32, &str)> {
- if let Some(ref dirsize) = self.dirsize {
- return Ok((*dirsize as u32, ""))
+ if self.is_dir() {
+ let size = match self.dirsize {
+ Some(ref size) => (size.load(Ordering::Acquire), ""),
+ None => (0, ""),
+ };
+
+ return Ok(size);
}
@@ -966,6 +980,18 @@ impl File {
tree_magic::match_filepath("text/plain", &self.path)
}
+ pub fn is_filtered(&self, filter: &str, filter_selected: bool) -> bool {
+ self.kind == Kind::Placeholder ||
+ !(// filter.is_some() &&
+ !self.name.contains(filter// .as_ref().unwrap()
+ )) &&
+ (!filter_selected || self.selected)
+ }
+
+ pub fn is_hidden(&self) -> bool {
+ self.hidden
+ }
+
pub fn parent(&self) -> Option<PathBuf> {
Some(self.path.parent()?.to_path_buf())