summaryrefslogtreecommitdiffstats
path: root/src/preview.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-05-21 20:50:54 +0200
committerrabite <rabite@posteo.de>2019-05-21 20:52:04 +0200
commite8d9c6ad1f82d6b0bbf3cf9449ce53dd525cb77a (patch)
treee9615c4cf832f1a17a640a229c5dd79710ad601e /src/preview.rs
parent6f8a6366039282cfce272a4a430590de83f48045 (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.rs162
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)
}
}
}