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:
parent
3f66d7f7da
commit
446b6731e2
33
src/files.rs
33
src/files.rs
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user