summaryrefslogtreecommitdiffstats
path: root/src/preview.rs
blob: bbada42243ae61ab115bcef185f5b8735c2442db (plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use rayon as rayon;

use std::io::{stdout, Write};
use std::sync::atomic::AtomicUsize;
use std::sync::Mutex;

use crate::coordinates::{Coordinates, Position, Size};
use crate::files::{File, Files, Kind};
use crate::listview::ListView;
use crate::textview::TextView;
use crate::widget::Widget;

pub struct Previewer {
    pub file: Option<File>,
    pub buffer: String,
    pub coordinates: Coordinates,
    pub instances: Mutex<usize>
}

impl Previewer {
    pub fn new() -> Previewer {
        Previewer {
            file: None,
            buffer: String::new(),
            coordinates: Coordinates::new(),
            instances: From::from(0)
        }
    }
    pub fn set_file(&mut self, file: &File) {
        //return;
        let mut instance = self.instances.try_lock().unwrap();
        if *instance > 2 { return }
        *instance = *instance + 1;
        let coordinates = self.coordinates.clone();
        let file = file.clone();

        
        
        //self.threads.install(|| {
        std::thread::spawn(move || {
            match &file.kind {
                Kind::Directory => match Files::new_from_path(&file.path) {
                    Ok(files) => {
                        let len = files.len();
                        if len == 0 { return };
                        let mut file_list = ListView::new(files);
                        file_list.set_coordinates(&coordinates);
                        file_list.refresh();
                        write!(std::io::stdout(),
                               "{}{}",
                               &file_list.get_drawlist(),
                               &file_list.get_redraw_empty_list(len)).unwrap();
                        
                    }
                    Err(err) => {
                        crate::window::show_status(&format!("Can't preview because: {}", err));
                    }
                    
                },
                _ => {
                    if file.get_mime() == Some("text".to_string()) {
                        let mut textview = TextView::new_from_file(&file);
                        textview.set_coordinates(&coordinates);
                        textview.refresh();
                        let len = textview.lines.len();
                        let output = textview.get_drawlist()
                            + &textview.get_redraw_empty_list(len - 1);
                        write!(std::io::stdout(), "{}", output).unwrap();
                    }
                    
                }
            }
        });
        *instance = *instance - 1;
    }
}

impl Widget for Previewer {
    fn get_size(&self) -> &Size {
        &self.coordinates.size
    }
    fn set_size(&mut self, size: Size) {
        self.coordinates.size = size;
    }
    fn get_position(&self) -> &Position {
        &self.coordinates.position
    }
    fn set_position(&mut self, pos: Position) {
        self.coordinates.position = pos;
    }
    fn get_coordinates(&self) -> &Coordinates {
        &self.coordinates
    }
    fn set_coordinates(&mut self, coordinates: &Coordinates) {
        if self.coordinates == *coordinates {
            return;
        }
        self.coordinates = coordinates.clone();
        self.refresh();
    }
    fn render_header(&self) -> String {
        "".to_string()
    }
    fn refresh(&mut self) {
        if self.file == None {
            return;
        }

        
    }
    fn get_drawlist(&self) -> String {
        self.buffer.clone()
    }
}