mirror of
https://github.com/bobwen-dev/hunter
synced 2025-04-12 00:55:41 +02:00
buggy super-fast crazy stuff
This commit is contained in:
parent
aa091b69c8
commit
a6c829e143
@ -30,6 +30,8 @@ pub enum HError {
|
|||||||
ChannelRecvError{#[cause] error: std::sync::mpsc::RecvError},
|
ChannelRecvError{#[cause] error: std::sync::mpsc::RecvError},
|
||||||
#[fail(display = "Channel failed")]
|
#[fail(display = "Channel failed")]
|
||||||
ChannelSendError,
|
ChannelSendError,
|
||||||
|
#[fail(display = "Timer ran out while waiting for message on channel!")]
|
||||||
|
ChannelRecvTimeout(#[cause] std::sync::mpsc::RecvTimeoutError),
|
||||||
#[fail(display = "Previewer failed on file: {}", file)]
|
#[fail(display = "Previewer failed on file: {}", file)]
|
||||||
PreviewFailed{file: String},
|
PreviewFailed{file: String},
|
||||||
#[fail(display = "StalePreviewer for file: {}", file)]
|
#[fail(display = "StalePreviewer for file: {}", file)]
|
||||||
@ -292,6 +294,13 @@ impl From<std::sync::mpsc::RecvError> for HError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<std::sync::mpsc::RecvTimeoutError> for HError {
|
||||||
|
fn from(error: std::sync::mpsc::RecvTimeoutError) -> Self {
|
||||||
|
let err = HError::ChannelRecvTimeout(error);
|
||||||
|
err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T> From<std::sync::mpsc::SendError<T>> for HError {
|
impl<T> From<std::sync::mpsc::SendError<T>> for HError {
|
||||||
fn from(_error: std::sync::mpsc::SendError<T>) -> Self {
|
fn from(_error: std::sync::mpsc::SendError<T>) -> Self {
|
||||||
let err = HError::ChannelSendError;
|
let err = HError::ChannelSendError;
|
||||||
|
@ -199,7 +199,6 @@ impl Tabbable for TabView<FileBrowser> {
|
|||||||
w.as_mut()
|
w.as_mut()
|
||||||
.map(|mut w| {
|
.map(|mut w| {
|
||||||
w.content.show_hidden = show_hidden;
|
w.content.show_hidden = show_hidden;
|
||||||
w.content.dirty_meta.set_dirty();
|
|
||||||
w.refresh().log();
|
w.refresh().log();
|
||||||
}).ok();
|
}).ok();
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -211,7 +210,6 @@ impl Tabbable for TabView<FileBrowser> {
|
|||||||
w.as_mut()
|
w.as_mut()
|
||||||
.map(|mut w| {
|
.map(|mut w| {
|
||||||
w.content.show_hidden = show_hidden;
|
w.content.show_hidden = show_hidden;
|
||||||
w.content.dirty_meta.set_dirty();
|
|
||||||
w.refresh().log();
|
w.refresh().log();
|
||||||
}).ok();
|
}).ok();
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -262,7 +260,7 @@ impl FileBrowser {
|
|||||||
let source = FileSource::Path(dir);
|
let source = FileSource::Path(dir);
|
||||||
ListView::builder(core_m, source)
|
ListView::builder(core_m, source)
|
||||||
.meta_all()
|
.meta_all()
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.build()
|
.build()
|
||||||
@ -274,8 +272,8 @@ impl FileBrowser {
|
|||||||
let dir = File::new_from_path(&left_path, None)?;
|
let dir = File::new_from_path(&left_path, None)?;
|
||||||
let source = FileSource::Path(dir);
|
let source = FileSource::Path(dir);
|
||||||
ListView::builder(core_l, source)
|
ListView::builder(core_l, source)
|
||||||
.meta_all()
|
// .meta_all()
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.build()
|
.build()
|
||||||
@ -359,7 +357,7 @@ impl FileBrowser {
|
|||||||
|
|
||||||
ListView::builder(core, source)
|
ListView::builder(core, source)
|
||||||
.meta_all()
|
.meta_all()
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.build()
|
.build()
|
||||||
@ -482,7 +480,7 @@ impl FileBrowser {
|
|||||||
main_async_widget.change_to(move |stale: &Stale, core| {
|
main_async_widget.change_to(move |stale: &Stale, core| {
|
||||||
let view = ListView::builder(core, file_source)
|
let view = ListView::builder(core, file_source)
|
||||||
.meta_all()
|
.meta_all()
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.build()?;
|
.build()?;
|
||||||
@ -499,6 +497,10 @@ impl FileBrowser {
|
|||||||
}).log();
|
}).log();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.preview_widget_mut()
|
||||||
|
.map(|p| p.set_stale())
|
||||||
|
.ok();
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,8 +517,8 @@ impl FileBrowser {
|
|||||||
let left_async_widget = self.left_async_widget_mut()?;
|
let left_async_widget = self.left_async_widget_mut()?;
|
||||||
left_async_widget.change_to(move |stale, core| {
|
left_async_widget.change_to(move |stale, core| {
|
||||||
let view = ListView::builder(core, file_source)
|
let view = ListView::builder(core, file_source)
|
||||||
.meta_all()
|
// .meta_all()
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.build()?;
|
.build()?;
|
||||||
@ -548,7 +550,7 @@ impl FileBrowser {
|
|||||||
ListView::builder(core, file_source)
|
ListView::builder(core, file_source)
|
||||||
.select(main_selection)
|
.select(main_selection)
|
||||||
.meta_all()
|
.meta_all()
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.build()
|
.build()
|
||||||
@ -559,7 +561,7 @@ impl FileBrowser {
|
|||||||
let cache = self.fs_cache.clone();
|
let cache = self.fs_cache.clone();
|
||||||
self.left_async_widget_mut()?.change_to(move |stale, core| {
|
self.left_async_widget_mut()?.change_to(move |stale, core| {
|
||||||
ListView::builder(core, file_source)
|
ListView::builder(core, file_source)
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.build()
|
.build()
|
||||||
@ -698,16 +700,16 @@ impl FileBrowser {
|
|||||||
|
|
||||||
pub fn take_main_files(&mut self) -> HResult<Files> {
|
pub fn take_main_files(&mut self) -> HResult<Files> {
|
||||||
let mut w = self.main_widget_mut()?;
|
let mut w = self.main_widget_mut()?;
|
||||||
w.lines = 0;
|
w.content.len = 0;
|
||||||
w.buffer.clear();
|
//w.buffer.clear();
|
||||||
let files = std::mem::take(&mut w.content);
|
let files = std::mem::take(&mut w.content);
|
||||||
Ok(files)
|
Ok(files)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn take_left_files(&mut self) -> HResult<Files> {
|
pub fn take_left_files(&mut self) -> HResult<Files> {
|
||||||
let mut w = self.left_widget_mut()?;
|
let mut w = self.left_widget_mut()?;
|
||||||
w.lines = 0;
|
w.content.len = 0;
|
||||||
w.buffer.clear();
|
//w.buffer.clear();
|
||||||
let files = std::mem::take(&mut w.content);
|
let files = std::mem::take(&mut w.content);
|
||||||
Ok(files)
|
Ok(files)
|
||||||
}
|
}
|
||||||
|
54
src/files.rs
54
src/files.rs
@ -8,6 +8,7 @@ use std::sync::{Arc, Mutex, RwLock};
|
|||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use std::sync::atomic::{AtomicU32, Ordering};
|
||||||
|
|
||||||
use lscolors::LsColors;
|
use lscolors::LsColors;
|
||||||
use tree_magic;
|
use tree_magic;
|
||||||
@ -157,8 +158,6 @@ impl RefreshPackage {
|
|||||||
for event in events.into_iter() {
|
for event in events.into_iter() {
|
||||||
match event {
|
match event {
|
||||||
Create(mut file) => {
|
Create(mut file) => {
|
||||||
let dirty_meta = files.dirty_meta.clone();
|
|
||||||
file.dirty_meta = Some(dirty_meta);
|
|
||||||
file.meta_sync().log();
|
file.meta_sync().log();
|
||||||
new_files.push(file);
|
new_files.push(file);
|
||||||
}
|
}
|
||||||
@ -251,7 +250,6 @@ pub struct Files {
|
|||||||
pub filter: Option<String>,
|
pub filter: Option<String>,
|
||||||
pub filter_selected: bool,
|
pub filter_selected: bool,
|
||||||
pub dirty: DirtyBit,
|
pub dirty: DirtyBit,
|
||||||
pub dirty_meta: AsyncDirtyBit,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Index<usize> for Files {
|
impl Index<usize> for Files {
|
||||||
@ -294,7 +292,6 @@ impl Default for Files {
|
|||||||
filter: None,
|
filter: None,
|
||||||
filter_selected: false,
|
filter_selected: false,
|
||||||
dirty: DirtyBit::new(),
|
dirty: DirtyBit::new(),
|
||||||
dirty_meta: AsyncDirtyBit::new(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -325,8 +322,6 @@ impl Files {
|
|||||||
let mut files = Files::default();
|
let mut files = Files::default();
|
||||||
files.directory = File::new_from_path(&path, None)?;
|
files.directory = File::new_from_path(&path, None)?;
|
||||||
files.len = len;
|
files.len = len;
|
||||||
files.dirty_meta = dirty_meta;
|
|
||||||
|
|
||||||
|
|
||||||
Ok(files)
|
Ok(files)
|
||||||
}
|
}
|
||||||
@ -371,7 +366,6 @@ impl Files {
|
|||||||
filter: None,
|
filter: None,
|
||||||
filter_selected: false,
|
filter_selected: false,
|
||||||
dirty: dirty,
|
dirty: dirty,
|
||||||
dirty_meta: dirty_meta,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(files)
|
Ok(files)
|
||||||
@ -418,6 +412,7 @@ impl Files {
|
|||||||
(!filter_selected || f.selected))
|
(!filter_selected || f.selected))
|
||||||
.filter(move |(_,f)| !(!show_hidden && f.hidden))
|
.filter(move |(_,f)| !(!show_hidden && f.hidden))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn iter_files(&self) -> impl Iterator<Item=&File> {
|
pub fn iter_files(&self) -> impl Iterator<Item=&File> {
|
||||||
let filter = self.filter.clone();
|
let filter = self.filter.clone();
|
||||||
let filter_selected = self.filter_selected;
|
let filter_selected = self.filter_selected;
|
||||||
@ -761,13 +756,14 @@ impl std::default::Default for File {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct File {
|
pub struct File {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
pub hidden: bool,
|
pub hidden: bool,
|
||||||
pub kind: Kind,
|
pub kind: Kind,
|
||||||
pub dirsize: Option<usize>,
|
pub dirsize: Option<Arc<AtomicU32>>,
|
||||||
pub target: Option<PathBuf>,
|
pub target: Option<PathBuf>,
|
||||||
pub color: Option<lscolors::Color>,
|
pub color: Option<lscolors::Color>,
|
||||||
pub meta: Option<Metadata>,
|
pub meta: Option<Metadata>,
|
||||||
@ -882,14 +878,27 @@ impl File {
|
|||||||
self.meta = Some(meta);
|
self.meta = Some(meta);
|
||||||
self.process_meta().log();
|
self.process_meta().log();
|
||||||
|
|
||||||
if self.is_dir() {
|
// if self.is_dir() {
|
||||||
let dirsize = std::fs::read_dir(&self.path)?.count();
|
// let dirsize = std::fs::read_dir(&self.path)?.count();
|
||||||
self.dirsize = Some(dirsize);
|
// self.dirsize = Some(dirsize);
|
||||||
}
|
// }
|
||||||
|
|
||||||
Ok(())
|
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> {
|
pub fn meta(&self) -> Option<&Metadata> {
|
||||||
self.meta.as_ref()
|
self.meta.as_ref()
|
||||||
}
|
}
|
||||||
@ -921,8 +930,13 @@ impl File {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn calculate_size(&self) -> HResult<(u32, &str)> {
|
pub fn calculate_size(&self) -> HResult<(u32, &str)> {
|
||||||
if let Some(ref dirsize) = self.dirsize {
|
if self.is_dir() {
|
||||||
return Ok((*dirsize as u32, ""))
|
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)
|
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> {
|
pub fn parent(&self) -> Option<PathBuf> {
|
||||||
Some(self.path.parent()?.to_path_buf())
|
Some(self.path.parent()?.to_path_buf())
|
||||||
|
163
src/listview.rs
163
src/listview.rs
@ -147,10 +147,10 @@ where
|
|||||||
{
|
{
|
||||||
pub content: T,
|
pub content: T,
|
||||||
pub current_item: Option<<ListView<T> as Listable>::Item>,
|
pub current_item: Option<<ListView<T> as Listable>::Item>,
|
||||||
pub lines: usize,
|
// pub lines: usize,
|
||||||
selection: usize,
|
selection: usize,
|
||||||
pub offset: usize,
|
pub offset: usize,
|
||||||
pub buffer: Vec<String>,
|
//pub buffer: Vec<String>,
|
||||||
pub core: WidgetCore,
|
pub core: WidgetCore,
|
||||||
seeking: bool,
|
seeking: bool,
|
||||||
searching: Option<String>,
|
searching: Option<String>,
|
||||||
@ -165,10 +165,10 @@ where
|
|||||||
let mut view = ListView::<T> {
|
let mut view = ListView::<T> {
|
||||||
content: content,
|
content: content,
|
||||||
current_item: None,
|
current_item: None,
|
||||||
lines: 0,
|
// lines: 0,
|
||||||
selection: 0,
|
selection: 0,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
buffer: Vec::new(),
|
// buffer: Vec::new(),
|
||||||
core: core.clone(),
|
core: core.clone(),
|
||||||
seeking: false,
|
seeking: false,
|
||||||
searching: None
|
searching: None
|
||||||
@ -190,10 +190,10 @@ where
|
|||||||
self.seeking = false;
|
self.seeking = false;
|
||||||
}
|
}
|
||||||
pub fn move_down(&mut self) {
|
pub fn move_down(&mut self) {
|
||||||
let lines = self.lines;
|
let lines = self.len();
|
||||||
let y_size = self.get_coordinates().unwrap().ysize() as usize;
|
let y_size = self.get_coordinates().unwrap().ysize() as usize;
|
||||||
|
|
||||||
if self.lines == 0 || self.selection == lines - 1 {
|
if lines == 0 || self.selection == lines - 1 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +210,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn move_bottom(&mut self) {
|
pub fn move_bottom(&mut self) {
|
||||||
let lines = self.lines;
|
let lines = self.len();
|
||||||
self.set_selection(lines - 1);
|
self.set_selection(lines - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -354,22 +354,27 @@ impl FileListBuilder {
|
|||||||
.skip(from)
|
.skip(from)
|
||||||
.take(upto)
|
.take(upto)
|
||||||
.par_bridge()
|
.par_bridge()
|
||||||
.for_each(|f| f.meta_sync().log());
|
.for_each(|f| {
|
||||||
view.content.meta_upto = Some(view.content.len);
|
f.meta_sync().log();
|
||||||
|
if f.is_dir() {
|
||||||
if self.prerender {
|
f.run_dirsize();
|
||||||
match self.stale {
|
|
||||||
Some(s) => view.render_buffer_stale(s)?,
|
|
||||||
None => view.render_buffer()?
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
view.content.meta_upto = Some(upto);
|
||||||
|
|
||||||
if view.buffer.len() > 0 {
|
// if self.prerender {
|
||||||
view.lines = view.buffer.len() - 1;
|
// match self.stale {
|
||||||
}
|
// Some(s) => view.render_buffer_stale(s)?,
|
||||||
};
|
// None => view.render_buffer()?
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if view.buffer.len() > 0 {
|
||||||
|
// view.lines = view.buffer.len() - 1;
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
|
||||||
view.content.set_clean();
|
view.content.set_clean();
|
||||||
view.content.dirty_meta.set_clean();
|
// view.content.dirty_meta.set_clean();
|
||||||
view.core.set_clean();
|
view.core.set_clean();
|
||||||
|
|
||||||
Ok(view)
|
Ok(view)
|
||||||
@ -565,9 +570,9 @@ impl ListView<Files>
|
|||||||
file.toggle_selection();
|
file.toggle_selection();
|
||||||
|
|
||||||
if !self.content.filter_selected {
|
if !self.content.filter_selected {
|
||||||
let selection = self.get_selection();
|
//let selection = self.get_selection();
|
||||||
let line = self.render_line(&file);
|
//let line = self.render_line(&file);
|
||||||
self.buffer[selection] = line;
|
//self.buffer[selection] = line;
|
||||||
|
|
||||||
self.move_down();
|
self.move_down();
|
||||||
} else {
|
} else {
|
||||||
@ -607,12 +612,12 @@ impl ListView<Files>
|
|||||||
self.selected_file_mut().toggle_tag()?;
|
self.selected_file_mut().toggle_tag()?;
|
||||||
|
|
||||||
// Create a mutable clone to render changes into buffer
|
// Create a mutable clone to render changes into buffer
|
||||||
let mut file = self.clone_selected_file();
|
// let mut file = self.clone_selected_file();
|
||||||
file.toggle_tag()?;
|
// file.toggle_tag()?;
|
||||||
|
|
||||||
let line = self.render_line(&file);
|
// let line = self.render_line(&file);
|
||||||
let selection = self.get_selection();
|
// let selection = self.get_selection();
|
||||||
self.buffer[selection] = line;
|
// self.buffer[selection] = line;
|
||||||
|
|
||||||
self.move_down();
|
self.move_down();
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -868,60 +873,66 @@ impl ListView<Files>
|
|||||||
|
|
||||||
fn render(&self) -> Vec<String> {
|
fn render(&self) -> Vec<String> {
|
||||||
let render_fn = self.render_line_fn();
|
let render_fn = self.render_line_fn();
|
||||||
|
let ysize = self.get_coordinates().unwrap().ysize_u();
|
||||||
self.content
|
self.content
|
||||||
.iter_files()
|
.iter_files()
|
||||||
|
.skip(self.offset)
|
||||||
|
.take(ysize+1)
|
||||||
|
// .collect::<Vec<_>>()
|
||||||
|
// .into_par_iter()
|
||||||
.map(|file| render_fn(file))
|
.map(|file| render_fn(file))
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_buffer(&mut self) -> HResult<()> {
|
fn render_buffer(&mut self) -> HResult<()> {
|
||||||
let render_fn = self.render_line_fn();
|
// let render_fn = self.render_line_fn();
|
||||||
self.buffer = self.content
|
// self.buffer = self.content
|
||||||
.iter_files()
|
// .iter_files()
|
||||||
.enumerate()
|
// .enumerate()
|
||||||
.map(|(_, file)| {
|
// .map(|(_, file)| {
|
||||||
render_fn(file)
|
// render_fn(file)
|
||||||
})
|
// })
|
||||||
.collect();
|
// .collect();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_buffer_stale(&mut self, stale: Stale) -> HResult<()> {
|
fn render_buffer_stale(&mut self, stale: Stale) -> HResult<()> {
|
||||||
let render_fn = self.render_line_fn();
|
// let render_fn = self.render_line_fn();
|
||||||
let buffer = self.content
|
// let buffer = self.content
|
||||||
.iter_files()
|
// .iter_files()
|
||||||
.stop_stale(stale.clone())
|
// .stop_stale(stale.clone())
|
||||||
.enumerate()
|
// .enumerate()
|
||||||
.map(|(_, file)| {
|
// .map(|(_, file)| {
|
||||||
render_fn(file)
|
// render_fn(file)
|
||||||
})
|
// })
|
||||||
.collect();
|
// .collect();
|
||||||
|
|
||||||
if stale.is_stale()
|
// if stale.is_stale()
|
||||||
.unwrap_or(true) {
|
// .unwrap_or(true) {
|
||||||
return HError::stale();
|
// return HError::stale();
|
||||||
} else {
|
// } else {
|
||||||
self.buffer = buffer;
|
// self.buffer = buffer;
|
||||||
return Ok(())
|
// return Ok(())
|
||||||
}
|
// }
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn refresh_files(&mut self) -> HResult<()> {
|
fn refresh_files(&mut self) -> HResult<()> {
|
||||||
if let Ok(Some(mut refresh)) = self.content.get_refresh() {
|
// if let Ok(Some(mut refresh)) = self.content.get_refresh() {
|
||||||
let file = self.clone_selected_file();
|
// let file = self.clone_selected_file();
|
||||||
|
|
||||||
self.buffer = refresh.new_buffer.take()?;
|
// self.buffer = refresh.new_buffer.take()?;
|
||||||
self.lines = self.buffer.len() - 1;
|
// self.lines = self.buffer.len() - 1;
|
||||||
|
|
||||||
self.select_file(&file);
|
// self.select_file(&file);
|
||||||
}
|
// }
|
||||||
|
|
||||||
if self.content.ready_to_refresh()? {
|
// if self.content.ready_to_refresh()? {
|
||||||
let render_fn = self.render_line_fn();
|
// let render_fn = self.render_line_fn();
|
||||||
self.content.process_fs_events(self.buffer.clone(),
|
// self.content.process_fs_events(self.buffer.clone(),
|
||||||
self.core.get_sender(),
|
// self.core.get_sender(),
|
||||||
render_fn)?;
|
// render_fn)?;
|
||||||
}
|
// }
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -941,18 +952,18 @@ where
|
|||||||
fn refresh(&mut self) -> HResult<()> {
|
fn refresh(&mut self) -> HResult<()> {
|
||||||
self.on_refresh().log();
|
self.on_refresh().log();
|
||||||
|
|
||||||
let buffer_len = self.buffer.len();
|
// let buffer_len = self.buffer.len();
|
||||||
|
|
||||||
self.lines = buffer_len;
|
// self.lines = buffer_len;
|
||||||
|
|
||||||
if self.selection >= self.buffer.len() && self.buffer.len() != 0 {
|
if self.selection >= self.len() && self.len() != 0 {
|
||||||
self.selection = self.buffer.len() - 1;
|
self.selection = self.len() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.core.is_dirty() {
|
// if self.core.is_dirty() {
|
||||||
self.buffer = self.render();
|
// self.buffer = self.render();
|
||||||
self.core.set_clean();
|
// self.core.set_clean();
|
||||||
}
|
// }
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -967,13 +978,11 @@ where
|
|||||||
fn get_drawlist(&self) -> HResult<String> {
|
fn get_drawlist(&self) -> HResult<String> {
|
||||||
let mut output = term::reset();
|
let mut output = term::reset();
|
||||||
let (xpos, ypos) = self.get_coordinates().unwrap().position().position();
|
let (xpos, ypos) = self.get_coordinates().unwrap().position().position();
|
||||||
let ysize = self.get_coordinates().unwrap().ysize() as usize;
|
|
||||||
|
|
||||||
output += &self
|
let render = self.render();
|
||||||
.buffer
|
|
||||||
|
output += &render
|
||||||
.iter()
|
.iter()
|
||||||
.skip(self.offset)
|
|
||||||
.take(ysize)
|
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, item)| {
|
.map(|(i, item)| {
|
||||||
let mut output = term::normal_color();
|
let mut output = term::normal_color();
|
||||||
@ -991,7 +1000,7 @@ where
|
|||||||
})
|
})
|
||||||
.collect::<String>();
|
.collect::<String>();
|
||||||
|
|
||||||
output += &self.get_redraw_empty_list(self.buffer.len())?;
|
output += &self.get_redraw_empty_list(self.len())?;
|
||||||
|
|
||||||
Ok(output)
|
Ok(output)
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ pub struct AsyncWidget<W: Widget + Send + 'static> {
|
|||||||
|
|
||||||
impl<W: Widget + Send + 'static> AsyncWidget<W> {
|
impl<W: Widget + Send + 'static> AsyncWidget<W> {
|
||||||
pub fn new(core: &WidgetCore,
|
pub fn new(core: &WidgetCore,
|
||||||
closure: impl FnOnce(&Stale) -> HResult<W> + Send + Sync + 'static)
|
closure: impl FnOnce(&Stale) -> HResult<W> + Send + 'static)
|
||||||
-> AsyncWidget<W> {
|
-> AsyncWidget<W> {
|
||||||
let sender = Arc::new(Mutex::new(core.get_sender()));
|
let sender = Arc::new(Mutex::new(core.get_sender()));
|
||||||
let mut widget = Async::new(move |stale|
|
let mut widget = Async::new(move |stale|
|
||||||
@ -86,7 +86,7 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> {
|
|||||||
pub fn change_to(&mut self,
|
pub fn change_to(&mut self,
|
||||||
closure: impl FnOnce(&Stale,
|
closure: impl FnOnce(&Stale,
|
||||||
WidgetCore)
|
WidgetCore)
|
||||||
-> HResult<W> + Send + Sync + 'static)
|
-> HResult<W> + Send + 'static)
|
||||||
-> HResult<()> {
|
-> HResult<()> {
|
||||||
self.set_stale().log();
|
self.set_stale().log();
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ impl Previewer {
|
|||||||
let source = crate::listview::FileSource::Files(files);
|
let source = crate::listview::FileSource::Files(files);
|
||||||
|
|
||||||
let list = ListView::builder(core.clone(), source)
|
let list = ListView::builder(core.clone(), source)
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.select(selected_file)
|
.select(selected_file)
|
||||||
@ -457,7 +457,7 @@ impl Previewer {
|
|||||||
let source = FileSource::Path(file.clone());
|
let source = FileSource::Path(file.clone());
|
||||||
|
|
||||||
let mut file_list = ListView::builder(core.clone(), source)
|
let mut file_list = ListView::builder(core.clone(), source)
|
||||||
.prerender()
|
// .prerender()
|
||||||
.with_cache(cache)
|
.with_cache(cache)
|
||||||
.with_stale(stale.clone())
|
.with_stale(stale.clone())
|
||||||
.build()?;
|
.build()?;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user