diff options
author | rabite <rabite@posteo.de> | 2020-05-23 13:57:17 +0200 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2020-05-23 13:58:57 +0200 |
commit | 9e41b78907686d31ddb5fec755261afdf204eac6 (patch) | |
tree | 21fe313d646da88e76703162acde432c2c92743b | |
parent | 67fde00a341b3c90afcad2414aaf19f2b0a0cbf1 (diff) |
reduce flicker due to ticker
-rw-r--r-- | src/files.rs | 33 | ||||
-rw-r--r-- | src/listview.rs | 5 | ||||
-rw-r--r-- | src/preview.rs | 20 |
3 files changed, 50 insertions, 8 deletions
diff --git a/src/files.rs b/src/files.rs index de00a28..f78f067 100644 --- a/src/files.rs +++ b/src/files.rs @@ -60,7 +60,7 @@ pub fn start_ticking(sender: Sender<Events>) { use std::time::Duration; IOTICK_CLIENTS.fetch_add(1, Ordering::Relaxed); - if IOTICK_CLIENTS.load(Ordering::Acquire) == 1 { + if IOTICK_CLIENTS.load(Ordering::Relaxed) == 1 { std::thread::spawn(move || { IOTICK.store(0, Ordering::Relaxed); @@ -76,7 +76,7 @@ pub fn start_ticking(sender: Sender<Events>) { .unwrap(); // All jobs done? - if IOTICK_CLIENTS.load(Ordering::Acquire) == 0 { + if IOTICK_CLIENTS.load(Ordering::Relaxed) == 0 { IOTICK.store(0, Ordering::Relaxed); return; } @@ -1647,3 +1647,32 @@ impl File { self.path.short_string() } } + + + +// Small wrapper that simplifies stopping with more complex control flow +pub struct Ticker { + invalidated: bool +} + +impl Ticker { + pub fn start_ticking(sender: Sender<Events>) -> Self { + start_ticking(sender); + Ticker { + invalidated: false + } + } + + pub fn stop_ticking(&mut self) { + stop_ticking(); + self.invalidated = true; + } +} + +impl Drop for Ticker { + fn drop(&mut self) { + if !self.invalidated { + self.stop_ticking(); + } + } +} diff --git a/src/listview.rs b/src/listview.rs index 6bb6b9a..7476fd2 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -301,6 +301,9 @@ impl FileListBuilder { let source = self.source; let selected_file = self.selected_file.take(); + // Run ticker for those nice loading animations (...) + crate::files::start_ticking(core.get_sender()); + // Already sorted let nosort = match source { FileSource::Files(_) => true, @@ -341,6 +344,8 @@ impl FileListBuilder { view.content.set_clean(); view.core.set_clean(); + crate::files::stop_ticking(); + Ok(view) } } diff --git a/src/preview.rs b/src/preview.rs index 95ad8cc..382fdf2 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -4,7 +4,7 @@ use termion::event::Key; use std::sync::{Arc, Mutex}; use std::path::PathBuf; -use crate::files::{File, Files, Kind}; +use crate::files::{File, Files, Kind, Ticker}; use crate::fscache::FsCache; use crate::listview::{ListView, FileSource}; use crate::textview::TextView; @@ -74,14 +74,12 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> { let mut widget = Async::new(move |stale| closure(stale).map_err(|e| e.into())); widget.on_ready(move |_, stale| { - crate::files::stop_ticking(); if !stale.is_stale()? { sender.lock().map(|s| s.send(crate::widget::Events::WidgetReady)).ok(); } Ok(()) }).log(); - crate::files::start_ticking(core.get_sender()); widget.run().log(); AsyncWidget { @@ -104,7 +102,6 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> { }); widget.on_ready(move |_, stale| { - crate::files::stop_ticking(); if !stale.is_stale()? { sender.lock() .map(|s| s.send(crate::widget::Events::WidgetReady)) @@ -113,7 +110,6 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> { Ok(()) }).log(); - crate::files::start_ticking(self.core.get_sender()); widget.run().log(); self.widget = widget; @@ -414,6 +410,8 @@ impl Previewer { return Ok(PreviewWidget::MediaView(mediaview)); } "image" if has_media => { + // Show animation while image is loading, Drop stops it automatically + Ticker::start_ticking(core.get_sender()); let imgview = ImgView::new_from_file(core.clone(), &file.path())?; return Ok(PreviewWidget::ImgView(imgview)); @@ -499,7 +497,11 @@ impl Previewer { stale: &Stale, animator: &Stale) -> HResult<PreviewWidget> { + // Show animation while text is loading + let mut ticker = Ticker::start_ticking(core.get_sender()); + let lines = core.coordinates.ysize() as usize; + let mut textview = TextView::new_from_file_limit_lines(&core, &file, @@ -511,6 +513,8 @@ impl Previewer { if stale.is_stale()? { return Previewer::preview_failed(&file) } + // Prevent flicker during slide up + ticker.stop_ticking(); textview.animate_slide_up(Some(animator))?; Ok(PreviewWidget::TextView(textview)) } @@ -565,6 +569,9 @@ impl Previewer { stale: &Stale, animator: &Stale) -> HResult<PreviewWidget> { + // Show animation while preview is being generated + let mut ticker = Ticker::start_ticking(core.get_sender()); + let previewer = if core.config().graphics.as_str() != "unicode" { find_previewer(&file, true)? } else { @@ -581,6 +588,8 @@ impl Previewer { textview.set_lines(lines)?; textview.set_coordinates(&core.coordinates).log(); textview.refresh().log(); + // Prevent flicker during slide up + ticker.stop_ticking(); textview.animate_slide_up(Some(animator)).log(); Ok(PreviewWidget::TextView(textview)) @@ -590,7 +599,6 @@ impl Previewer { let gfile = lines.first()?; let imgview = ImgView::new_from_file(core.clone(), &PathBuf::from(&gfile))?; - Ok(PreviewWidget::ImgView(imgview)) } } |