summaryrefslogtreecommitdiffstats
path: root/src/preview.rs
diff options
context:
space:
mode:
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)
}
}
}