1
0
mirror of https://github.com/bobwen-dev/hunter synced 2025-04-12 00:55:41 +02:00

reduce flicker due to ticker

This commit is contained in:
rabite 2020-05-23 13:57:17 +02:00
parent 3f66d7f7da
commit 446b6731e2
3 changed files with 50 additions and 8 deletions

View File

@ -60,7 +60,7 @@ pub fn start_ticking(sender: Sender<Events>) {
use std::time::Duration; use std::time::Duration;
IOTICK_CLIENTS.fetch_add(1, Ordering::Relaxed); 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 || { std::thread::spawn(move || {
IOTICK.store(0, Ordering::Relaxed); IOTICK.store(0, Ordering::Relaxed);
@ -76,7 +76,7 @@ pub fn start_ticking(sender: Sender<Events>) {
.unwrap(); .unwrap();
// All jobs done? // All jobs done?
if IOTICK_CLIENTS.load(Ordering::Acquire) == 0 { if IOTICK_CLIENTS.load(Ordering::Relaxed) == 0 {
IOTICK.store(0, Ordering::Relaxed); IOTICK.store(0, Ordering::Relaxed);
return; return;
} }
@ -1647,3 +1647,32 @@ impl File {
self.path.short_string() 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();
}
}
}

View File

@ -305,6 +305,9 @@ impl FileListBuilder {
let source = self.source; let source = self.source;
let selected_file = self.selected_file.take(); let selected_file = self.selected_file.take();
// Run ticker for those nice loading animations (...)
crate::files::start_ticking(core.get_sender());
// Already sorted // Already sorted
let nosort = match source { let nosort = match source {
FileSource::Files(_) => true, FileSource::Files(_) => true,
@ -345,6 +348,8 @@ impl FileListBuilder {
view.content.set_clean(); view.content.set_clean();
view.core.set_clean(); view.core.set_clean();
crate::files::stop_ticking();
dbg!(now.elapsed().as_millis()); dbg!(now.elapsed().as_millis());
Ok(view) Ok(view)

View File

@ -4,7 +4,7 @@ use termion::event::Key;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::path::PathBuf; use std::path::PathBuf;
use crate::files::{File, Files, Kind}; use crate::files::{File, Files, Kind, Ticker};
use crate::fscache::FsCache; use crate::fscache::FsCache;
use crate::listview::{ListView, FileSource}; use crate::listview::{ListView, FileSource};
use crate::textview::TextView; use crate::textview::TextView;
@ -74,14 +74,12 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> {
let mut widget = Async::new(move |stale| let mut widget = Async::new(move |stale|
closure(stale).map_err(|e| e.into())); closure(stale).map_err(|e| e.into()));
widget.on_ready(move |_, stale| { widget.on_ready(move |_, stale| {
crate::files::stop_ticking();
if !stale.is_stale()? { if !stale.is_stale()? {
sender.lock().map(|s| s.send(crate::widget::Events::WidgetReady)).ok(); sender.lock().map(|s| s.send(crate::widget::Events::WidgetReady)).ok();
} }
Ok(()) Ok(())
}).log(); }).log();
crate::files::start_ticking(core.get_sender());
widget.run().log(); widget.run().log();
AsyncWidget { AsyncWidget {
@ -104,7 +102,6 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> {
}); });
widget.on_ready(move |_, stale| { widget.on_ready(move |_, stale| {
crate::files::stop_ticking();
if !stale.is_stale()? { if !stale.is_stale()? {
sender.lock() sender.lock()
.map(|s| s.send(crate::widget::Events::WidgetReady)) .map(|s| s.send(crate::widget::Events::WidgetReady))
@ -113,7 +110,6 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> {
Ok(()) Ok(())
}).log(); }).log();
crate::files::start_ticking(self.core.get_sender());
widget.run().log(); widget.run().log();
self.widget = widget; self.widget = widget;
@ -414,6 +410,8 @@ impl Previewer {
return Ok(PreviewWidget::MediaView(mediaview)); return Ok(PreviewWidget::MediaView(mediaview));
} }
"image" if has_media => { "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(), let imgview = ImgView::new_from_file(core.clone(),
&file.path())?; &file.path())?;
return Ok(PreviewWidget::ImgView(imgview)); return Ok(PreviewWidget::ImgView(imgview));
@ -499,7 +497,11 @@ impl Previewer {
stale: &Stale, stale: &Stale,
animator: &Stale) animator: &Stale)
-> HResult<PreviewWidget> { -> 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 lines = core.coordinates.ysize() as usize;
let mut textview let mut textview
= TextView::new_from_file_limit_lines(&core, = TextView::new_from_file_limit_lines(&core,
&file, &file,
@ -511,6 +513,8 @@ impl Previewer {
if stale.is_stale()? { return Previewer::preview_failed(&file) } if stale.is_stale()? { return Previewer::preview_failed(&file) }
// Prevent flicker during slide up
ticker.stop_ticking();
textview.animate_slide_up(Some(animator))?; textview.animate_slide_up(Some(animator))?;
Ok(PreviewWidget::TextView(textview)) Ok(PreviewWidget::TextView(textview))
} }
@ -565,6 +569,9 @@ impl Previewer {
stale: &Stale, stale: &Stale,
animator: &Stale) animator: &Stale)
-> HResult<PreviewWidget> { -> 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" { let previewer = if core.config().graphics.as_str() != "unicode" {
find_previewer(&file, true)? find_previewer(&file, true)?
} else { } else {
@ -581,6 +588,8 @@ impl Previewer {
textview.set_lines(lines)?; textview.set_lines(lines)?;
textview.set_coordinates(&core.coordinates).log(); textview.set_coordinates(&core.coordinates).log();
textview.refresh().log(); textview.refresh().log();
// Prevent flicker during slide up
ticker.stop_ticking();
textview.animate_slide_up(Some(animator)).log(); textview.animate_slide_up(Some(animator)).log();
Ok(PreviewWidget::TextView(textview)) Ok(PreviewWidget::TextView(textview))
@ -590,7 +599,6 @@ impl Previewer {
let gfile = lines.first()?; let gfile = lines.first()?;
let imgview = ImgView::new_from_file(core.clone(), let imgview = ImgView::new_from_file(core.clone(),
&PathBuf::from(&gfile))?; &PathBuf::from(&gfile))?;
Ok(PreviewWidget::ImgView(imgview)) Ok(PreviewWidget::ImgView(imgview))
} }
} }