fix lag in mediaview by moving availability check to config

This commit is contained in:
rabite 2020-01-23 04:24:35 +01:00
parent bf166ce7ff
commit fa73d2cb8c
4 changed files with 46 additions and 28 deletions

View File

@ -91,6 +91,7 @@ pub struct Config {
pub media_autoplay: bool, pub media_autoplay: bool,
pub media_mute: bool, pub media_mute: bool,
pub media_previewer: String, pub media_previewer: String,
pub media_previewer_exists: bool,
pub ratios: Vec::<usize>, pub ratios: Vec::<usize>,
pub graphics: String, pub graphics: String,
pub keybinds: KeyBinds, pub keybinds: KeyBinds,
@ -115,6 +116,7 @@ impl Config {
media_autoplay: false, media_autoplay: false,
media_mute: false, media_mute: false,
media_previewer: "hunter-media".to_string(), media_previewer: "hunter-media".to_string(),
media_previewer_exists: false,
ratios: vec![20,30,49], ratios: vec![20,30,49],
graphics: detect_g_mode(), graphics: detect_g_mode(),
keybinds: KeyBinds::default(), keybinds: KeyBinds::default(),
@ -157,20 +159,36 @@ impl Config {
Ok(("media_mute", "on")) => config.media_mute = true, Ok(("media_mute", "on")) => config.media_mute = true,
Ok(("media_mute", "off")) => config.media_mute = false, Ok(("media_mute", "off")) => config.media_mute = false,
Ok(("media_previewer", cmd)) => { Ok(("media_previewer", cmd)) => {
use crate::minibuffer::find_bins;
let cmd = cmd.to_string(); let cmd = cmd.to_string();
config.media_previewer = cmd; config.media_previewer = cmd;
let previewer = std::path::Path::new(&config.media_previewer);
let exists = match previewer.is_absolute() {
true => previewer.exists(),
false => find_bins(&config.media_previewer).is_ok()
};
config.media_previewer_exists = exists;
}, },
Ok(("ratios", ratios)) => { Ok(("ratios", ratios)) => {
let ratios_str = ratios.to_string(); let ratios_str = ratios.to_string();
if ratios_str.chars().all(|x| x.is_digit(10) || x.is_whitespace() if ratios_str.chars().all(|x| x.is_digit(10) || x.is_whitespace()
|| x == ':' || x == ',' ) { || x == ':' || x == ',' ) {
let ratios: Vec<usize> = ratios_str.split([',', ':'].as_ref()) let ratios: Vec<usize> = ratios_str.split([',', ':'].as_ref())
.map(|r| r.trim().parse::<usize>().unwrap()).collect(); .map(|r| r.trim()
let ratios_sum: usize = ratios.iter().sum(); .parse().unwrap())
if ratios.len() == 3 && ratios_sum > 0 && ratios.iter() .collect();
.filter(|&r| *r > u16::max_value() as usize).next() == None { let ratios_sum: usize = ratios.iter().sum();
config.ratios = ratios; if ratios.len() == 3 && ratios_sum > 0 &&
} ratios
.iter()
.filter(|&r| *r > u16::max_value() as usize)
.next() == None {
config.ratios = ratios;
}
} }
} }
#[cfg(feature = "sixel")] #[cfg(feature = "sixel")]
@ -212,6 +230,10 @@ impl Config {
pub fn show_hidden(&self) -> bool { pub fn show_hidden(&self) -> bool {
self.show_hidden self.show_hidden
} }
pub fn media_available(&self) -> bool {
self.media_previewer_exists
}
} }
fn detect_g_mode() -> String { fn detect_g_mode() -> String {

View File

@ -661,9 +661,20 @@ impl FileBrowser {
self.preview_widget_mut()?.set_stale().log(); self.preview_widget_mut()?.set_stale().log();
return Ok(()); return Ok(());
} }
let file = self.selected_file()?.clone();
let file = self.selected_file()?;
// Don't even call previewer on empty files to save CPU cycles
match (file.is_dir(), file.calculate_size()) {
(false, Ok((size, unit))) => if size == 0 && unit.as_str() == "" {
self.preview_widget_mut()?.set_stale().log();
return Ok(());
},
_ => {}
}
let preview = self.preview_widget_mut()?; let preview = self.preview_widget_mut()?;
preview.set_file(&file).log(); preview.set_file(file).log();
Ok(()) Ok(())
} }

View File

@ -77,22 +77,6 @@ impl MediaView {
pub fn new_from_file(core: WidgetCore, pub fn new_from_file(core: WidgetCore,
file: &Path, file: &Path,
media_type: MediaType) -> HResult<MediaView> { media_type: MediaType) -> HResult<MediaView> {
// Check if previewer is present, or bail out to show message
let media_previewer = core.config().media_previewer;
if crate::minibuffer::find_bins(&media_previewer).is_err() {
let msg = format!("Couldn't find previewer: {}{}{}!",
crate::term::color_red(),
media_previewer,
crate::term::normal_color());
core.show_status(&msg).log();
return Err(MediaError::NoPreviewer(msg))?;
}
let imgview = ImgView { let imgview = ImgView {
core: core.clone(), core: core.clone(),
buffer: vec![], buffer: vec![],

View File

@ -355,6 +355,7 @@ impl Previewer {
let core = self.core.clone(); let core = self.core.clone();
let cache = self.cache.clone(); let cache = self.cache.clone();
let animator = self.animator.clone(); let animator = self.animator.clone();
let has_media = self.core.config().media_available();
self.widget.set_stale().ok(); self.widget.set_stale().ok();
@ -390,19 +391,19 @@ impl Previewer {
let is_gif = mime.subtype() == "gif"; let is_gif = mime.subtype() == "gif";
match mime_type { match mime_type {
_ if mime_type == "video" || is_gif => { _ if mime_type == "video" || is_gif && has_media => {
let media_type = crate::mediaview::MediaType::Video; let media_type = crate::mediaview::MediaType::Video;
let mediaview = MediaView::new_from_file(core.clone(), let mediaview = MediaView::new_from_file(core.clone(),
&file.path, &file.path,
media_type)?; media_type)?;
return Ok(PreviewWidget::MediaView(mediaview)); return Ok(PreviewWidget::MediaView(mediaview));
} }
"image" => { "image" if has_media => {
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));
} }
"audio" => { "audio" if has_media => {
let media_type = crate::mediaview::MediaType::Audio; let media_type = crate::mediaview::MediaType::Audio;
let mediaview = MediaView::new_from_file(core.clone(), let mediaview = MediaView::new_from_file(core.clone(),
&file.path, &file.path,