diff options
author | rabite <rabite@posteo.de> | 2019-05-21 20:50:54 +0200 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-05-21 20:52:04 +0200 |
commit | e8d9c6ad1f82d6b0bbf3cf9449ce53dd525cb77a (patch) | |
tree | e9615c4cf832f1a17a640a229c5dd79710ad601e /src/preview.rs | |
parent | 6f8a6366039282cfce272a4a430590de83f48045 (diff) |
merge in media-preview stuff
Squashed commit of the following:
commit 4087cee2f2a72bc2d3e44832809cbe99d25a3309
Author: rabite <rabite@posteo.de>
Date: Tue May 21 20:40:27 2019 +0200
rename to preview-gen
commit 275fd420a01c24393ae9cc07287204fde309130a
Author: rabite <rabite@posteo.de>
Date: Tue May 21 20:30:50 2019 +0200
update Cargo.toml and README
commit bf4c3fec0f8e0ff4628153297ac64fe165b4e443
Author: rabite <rabite@posteo.de>
Date: Tue May 21 20:30:33 2019 +0200
add config options for media
commit 3bf681cd078177d634507c51d04a45bdae184f1b
Author: rabite <rabite@posteo.de>
Date: Tue May 21 13:46:00 2019 +0200
always use unicode icons for play/pause/mute
commit ed2a0b31d1911e4d42086699ca1db636c327bacf
Author: rabite <rabite@posteo.de>
Date: Tue May 21 13:04:11 2019 +0200
rename to mediaview and some fixups
commit bda3f8f83bec07c3f52d06cf5f8eaad7fdbd85a0
Author: rabite <rabite@posteo.de>
Date: Tue May 21 11:44:52 2019 +0200
fix warnings
commit 9c917903cfa958b225f268ed4fb9f55f27162be0
Author: rabite <rabite@posteo.de>
Date: Tue May 21 01:10:58 2019 +0200
play audio through viedo widget
commit 9fe208b213710fae889f7701bdb3bf96d599c9a8
Author: rabite <rabite@posteo.de>
Date: Tue May 21 00:15:12 2019 +0200
fixed play when autoplay is off
commit d4036d52864d0a4e08f7da2cf6f7419ef070c1a9
Author: rabite <rabite@posteo.de>
Date: Mon May 20 13:15:44 2019 +0200
add icons for play/pause/mute
commit 29f0d203cfd7501b50d80501de146da9d89388bb
Author: rabite <rabite@posteo.de>
Date: Mon May 20 12:26:53 2019 +0200
add basic gif support
commit 8d28e4c23a91b0ef83739554c3a2f6671a9ff6f5
Author: rabite <rabite@posteo.de>
Date: Mon May 20 11:43:57 2019 +0200
fixed play after pause
commit 142017df78de77bcfffd8f3dd9612a06927e183b
Author: rabite <rabite@posteo.de>
Date: Sun May 19 14:22:16 2019 +0200
change to stale on drop
commit c0026c7f56f6a841df18e41bd1c9b33543e26cfb
Author: rabite <rabite@posteo.de>
Date: Sat May 18 23:46:27 2019 +0200
handle errors in gstreamer closure
commit ef37f872c54b9d21ed5505c2edb480c793afaef9
Author: rabite <rabite@posteo.de>
Date: Sat May 18 23:40:24 2019 +0200
add image-only mode to preview-gen
commit 15752464563463c6ecf892c1d8a14651bf32e1e5
Author: rabite <rabite@posteo.de>
Date: Sat May 18 23:28:33 2019 +0200
add copyright note
commit 4c9f08fc4de5d3bffefd42284b60aa81cfbae9f7
Author: rabite <rabite@posteo.de>
Date: Sat May 18 23:27:30 2019 +0200
make image/video previews optional
commit 9c2c2db2b20ecd4c30acbb1c77ad18c71f528c4c
Author: rabite <rabite@posteo.de>
Date: Sat May 18 22:13:25 2019 +0200
remove blank space under video
commit f7056d70fbe9147b3b95d7c10950653eadbb4f48
Author: rabite <rabite@posteo.de>
Date: Sat May 18 22:06:49 2019 +0200
remove dbg
commit cce820657ff1258cdb78d455dd3cf04564450cea
Author: rabite <rabite@posteo.de>
Date: Sat May 18 21:50:25 2019 +0200
added error handling to preview-gen
commit 80bbe15bacb99d1f4f97504a5d10ecf59544993f
Author: rabite <rabite@posteo.de>
Date: Sat May 18 21:04:31 2019 +0200
add time and visual seek bars to videoview
commit 4349945cc5549334f246be64bc7c8e2db43f9150
Author: rabite <rabite@posteo.de>
Date: Thu May 16 22:39:19 2019 +0200
fix sneaky process
commit 373128b7096d4de29924617e549a613a3aeea5b2
Author: rabite <rabite@posteo.de>
Date: Thu May 16 22:07:27 2019 +0200
fix out of controll processes
commit e061e065e913ab3923ffac1079a9f0a2be0df532
Author: rabite <rabite@posteo.de>
Date: Thu May 16 20:51:56 2019 +0200
add media_preview
commit f68c754895a9718d1a962980de9fbf02e5cb48cd
Author: rabite <rabite@posteo.de>
Date: Thu May 16 19:37:04 2019 +0200
beta image/video previews
commit 9a5460e553dd26ebccffaf819c64a8dc6ba74818
Author: rabite <rabite@posteo.de>
Date: Tue May 14 20:36:25 2019 +0200
external img preview
commit 3c4edfcb7611b36f6e537c73743e0b6bd269037b
Author: rabite <rabite@posteo.de>
Date: Tue May 14 20:35:12 2019 +0200
video preview
Diffstat (limited to 'src/preview.rs')
-rw-r--r-- | src/preview.rs | 162 |
1 files changed, 121 insertions, 41 deletions
diff --git a/src/preview.rs b/src/preview.rs index 08e10c3..7ac4ac0 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -1,6 +1,7 @@ -use std::sync::{Arc, Mutex}; - use async_value::{Async, Stale}; +use termion::event::Key; + +use std::sync::{Arc, Mutex}; use crate::files::{File, Files, Kind}; use crate::fscache::FsCache; @@ -11,6 +12,11 @@ use crate::coordinates::Coordinates; use crate::fail::{HResult, HError, ErrorLog}; use crate::dirty::Dirtyable; +#[cfg(feature = "img")] +use crate::imgview::ImgView; +#[cfg(feature = "video")] +use crate::mediaview::MediaView; + pub type AsyncWidgetFn<W> = FnOnce(&Stale, WidgetCore) -> HResult<W> + Send + Sync; @@ -55,8 +61,10 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> { let sender = Arc::new(Mutex::new(core.get_sender())); let mut widget = Async::new(move |stale| closure(stale).map_err(|e| e.into())); - widget.on_ready(move |_, _| { - sender.lock().map(|s| s.send(crate::widget::Events::WidgetReady)).ok(); + widget.on_ready(move |_, stale| { + if !stale.is_stale()? { + sender.lock().map(|s| s.send(crate::widget::Events::WidgetReady)).ok(); + } Ok(()) }).log(); widget.run().log(); @@ -80,7 +88,7 @@ impl<W: Widget + Send + 'static> AsyncWidget<W> { Ok(closure(stale, core.clone())?) }); - widget.on_ready(move |_, _| { + widget.on_ready(move |mut w, stale| { sender.lock().map(|s| s.send(crate::widget::Events::WidgetReady)).ok(); Ok(()) }).log(); @@ -187,7 +195,11 @@ impl PartialEq for Previewer { #[derive(PartialEq)] enum PreviewWidget { FileList(ListView<Files>), - TextView(TextView) + TextView(TextView), + #[cfg(feature = "img")] + ImgView(ImgView), + #[cfg(feature = "video")] + MediaView(MediaView) } @@ -311,39 +323,73 @@ impl Previewer { self.animator.set_stale().ok(); } - self.become_preview(Ok(AsyncWidget::new(&self.core, - move |stale: &Stale| { - kill_proc().unwrap(); - - if file.kind == Kind::Directory { - let preview = Previewer::preview_dir(&file, - cache, - &core, - &stale, - &animator); - return Ok(preview?); - } - - if file.is_text() { - return Ok(Previewer::preview_text(&file, - &core, - &stale, - &animator)?); - } + self.become_preview(Ok(AsyncWidget::new( + &self.core, + move |stale: &Stale| + { + kill_proc().unwrap(); + + if file.kind == Kind::Directory { + let preview = Previewer::preview_dir(&file, + cache, + &core, + &stale, + &animator); + return Ok(preview?); + } - let preview = Previewer::preview_external(&file, + if file.is_text() { + return Ok(Previewer::preview_text(&file, &core, &stale, - &animator); - if preview.is_ok() { return Ok(preview?); } - else { - let mut blank = TextView::new_blank(&core); - blank.set_coordinates(&coordinates).log(); - blank.refresh().log(); - blank.animate_slide_up(Some(&animator)).log(); - return Ok(PreviewWidget::TextView(blank)) - } - }))) + &animator)?); + } + + if let Some(mime) = file.get_mime() { + let mime_type = mime.type_().as_str(); + let is_gif = mime.subtype() == "gif"; + + match mime_type { + #[cfg(feature = "video")] + _ if mime_type == "video" || is_gif => { + let media_type = crate::mediaview::MediaType::Video; + let mediaview = MediaView::new_from_file(core.clone(), + &file.path, + media_type); + return Ok(PreviewWidget::MediaView(mediaview)); + } + #[cfg(feature = "img")] + "image" => { + let imgview = ImgView::new_from_file(core.clone(), + &file.path())?; + return Ok(PreviewWidget::ImgView(imgview)); + } + #[cfg(feature = "video")] + "audio" => { + let media_type = crate::mediaview::MediaType::Audio; + let mediaview = MediaView::new_from_file(core.clone(), + &file.path, + media_type); + return Ok(PreviewWidget::MediaView(mediaview)); + } + _ => {} + } + } + + + let preview = Previewer::preview_external(&file, + &core, + &stale, + &animator); + if preview.is_ok() { return Ok(preview?); } + else { + let mut blank = TextView::new_blank(&core); + blank.set_coordinates(&coordinates).log(); + blank.refresh().log(); + blank.animate_slide_up(Some(&animator)).log(); + return Ok(PreviewWidget::TextView(blank)) + } + }))) } pub fn reload(&mut self) { @@ -454,7 +500,6 @@ impl Previewer { } HError::preview_failed(file) } - } @@ -487,37 +532,72 @@ impl Widget for Previewer { fn get_drawlist(&self) -> HResult<String> { self.widget.get_drawlist() } + + fn on_key(&mut self, key: Key) -> HResult<()> { + self.widget.on_key(key) + } } impl Widget for PreviewWidget { fn get_core(&self) -> HResult<&WidgetCore> { match self { PreviewWidget::FileList(widget) => widget.get_core(), - PreviewWidget::TextView(widget) => widget.get_core() + PreviewWidget::TextView(widget) => widget.get_core(), + #[cfg(feature = "img")] + PreviewWidget::ImgView(widget) => widget.get_core(), + #[cfg(feature = "video")] + PreviewWidget::MediaView(widget) => widget.get_core() } } fn get_core_mut(&mut self) -> HResult<&mut WidgetCore> { match self { PreviewWidget::FileList(widget) => widget.get_core_mut(), - PreviewWidget::TextView(widget) => widget.get_core_mut() + PreviewWidget::TextView(widget) => widget.get_core_mut(), + #[cfg(feature = "img")] + PreviewWidget::ImgView(widget) => widget.get_core_mut(), + #[cfg(feature = "video")] + PreviewWidget::MediaView(widget) => widget.get_core_mut() } } fn set_coordinates(&mut self, coordinates: &Coordinates) -> HResult<()> { match self { PreviewWidget::FileList(widget) => widget.set_coordinates(coordinates), PreviewWidget::TextView(widget) => widget.set_coordinates(coordinates), + #[cfg(feature = "img")] + PreviewWidget::ImgView(widget) => widget.set_coordinates(coordinates), + #[cfg(feature = "video")] + PreviewWidget::MediaView(widget) => widget.set_coordinates(coordinates), } } fn refresh(&mut self) -> HResult<()> { match self { PreviewWidget::FileList(widget) => widget.refresh(), - PreviewWidget::TextView(widget) => widget.refresh() + PreviewWidget::TextView(widget) => widget.refresh(), + #[cfg(feature = "img")] + PreviewWidget::ImgView(widget) => widget.refresh(), + #[cfg(feature = "video")] + PreviewWidget::MediaView(widget) => widget.refresh() } } fn get_drawlist(&self) -> HResult<String> { match self { PreviewWidget::FileList(widget) => widget.get_drawlist(), - PreviewWidget::TextView(widget) => widget.get_drawlist() + PreviewWidget::TextView(widget) => widget.get_drawlist(), + #[cfg(feature = "img")] + PreviewWidget::ImgView(widget) => widget.get_drawlist(), + #[cfg(feature = "video")] + PreviewWidget::MediaView(widget) => widget.get_drawlist() + } + } + + fn on_key(&mut self, key: Key) -> HResult<()> { + match self { + PreviewWidget::FileList(widget) => widget.on_key(key), + PreviewWidget::TextView(widget) => widget.on_key(key), + #[cfg(feature = "img")] + PreviewWidget::ImgView(widget) => widget.on_key(key), + #[cfg(feature = "video")] + PreviewWidget::MediaView(widget) => widget.on_key(key) } } } |