1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
use crate::widget::{Widget, WidgetCore};
use crate::fail::HResult;
use std::path::{Path, PathBuf};
impl std::cmp::PartialEq for ImgView {
fn eq(&self, other: &Self) -> bool {
self.core == other.core &&
self.buffer == other.buffer
}
}
pub struct ImgView {
pub core: WidgetCore,
pub buffer: Vec<String>,
pub file: PathBuf
}
impl ImgView {
pub fn new_from_file(core: WidgetCore, file: &Path) -> HResult<ImgView> {
let (xsize, ysize) = core.coordinates.size_u();
let output = std::process::Command::new("preview-gen")
.arg(format!("{}", (xsize)))
.arg(format!("{}", (ysize+1)))
.arg("image")
.arg(format!("true"))
.arg(format!("true"))
.arg(file.to_string_lossy().to_string())
.output()?
.stdout;
let output = std::str::from_utf8(&output)?;
let output = output.lines()
.map(|l| l.to_string())
.collect();
Ok(ImgView {
core: core,
buffer: output,
file: file.to_path_buf()
})
}
pub fn set_image_data(&mut self, img_data: Vec<String>) {
self.buffer = img_data;
}
pub fn lines(&self) -> usize {
self.buffer.len()
}
}
impl Widget for ImgView {
fn get_core(&self) -> HResult<&WidgetCore> {
Ok(&self.core)
}
fn get_core_mut(&mut self) -> HResult<&mut WidgetCore> {
Ok(&mut self.core)
}
fn refresh(&mut self) -> HResult<()> {
Ok(())
}
fn get_drawlist(&self) -> HResult<String> {
let (xpos, ypos) = self.core.coordinates.position_u();
let mut draw = self.buffer
.iter()
.enumerate()
.fold(String::new(), |mut draw, (pos, line)| {
draw += &format!("{}", crate::term::goto_xy_u(xpos+1,
ypos + pos));
draw += line;
draw
});
draw += &format!("{}", termion::style::Reset);
Ok(draw)
}
}
|