previews for directories

This commit is contained in:
rabite 2019-01-29 18:54:13 +01:00
parent ca521059e4
commit b96895a2f2
4 changed files with 70 additions and 87 deletions

View File

@ -1,12 +1,12 @@
use termion::event::{Key,Event};
use termion::event::{Key};
use crate::widget::Widget;
use crate::files::Files;
//use crate::hbox::HBox;
use crate::listview::ListView;
use crate::coordinates::{Coordinates, Size,Position};
use crate::files::File;
use crate::coordinates::{Size,Position};
use crate::preview::Previewer;
use crate::miller_columns::MillerColumns;
pub struct FileBrowser {
@ -14,9 +14,6 @@ pub struct FileBrowser {
}
impl FileBrowser {
pub fn set_left_directory(&mut self) {
}
}
@ -40,26 +37,22 @@ impl Widget for FileBrowser {
"".to_string()
}
fn refresh(&mut self) {
let file
= self.columns.get_main_widget().as_ref().unwrap().selected_file().clone();
let (_, _, preview_coordinates) = self.columns.calculate_coordinates();
match &mut self.columns.preview {
Some(preview) => preview.set_file(&file),
None => {
let preview = Previewer::new(&file, &preview_coordinates);
self.columns.preview = Some(preview);
}
}
self.columns.refresh();
}
fn get_drawlist(&self) -> String {
self.columns.get_drawlist()
// let view_count = self.columns.widgets.len();
// if view_count < 2 {
// // TODO: Special handling
// } else if view_count < 1 {
// // etc.
// }
// self.views
// .iter()
// .skip(view_count - 2)
// .map(|view| {
// eprintln!("{}", view.get_drawlist());
// view.get_drawlist()
// }).collect()
}
@ -71,6 +64,8 @@ impl Widget for FileBrowser {
let path = widget.selected_file().path();
let files = Files::new_from_path(&path).unwrap();
let view = ListView::new(files);
let selected_file = view.selected_file();
self.columns.set_preview(selected_file);
self.columns.widgets.push(view);
self.refresh();
}, None => { }
@ -86,7 +81,6 @@ impl Widget for FileBrowser {
match self.columns.get_main_widget_mut() {
Some(widget) => {
widget.on_key(key);
self.set_left_directory();
self.refresh();
}, None => { self.refresh(); }

View File

@ -220,9 +220,6 @@ impl Widget for ListView<Files> {
fn refresh(&mut self) {
self.buffer = self.render();
}
fn render(&self) -> Vec<String> {
self.content.iter().map(|file| {
self.render_line(&file)
@ -251,16 +248,7 @@ impl Widget for ListView<Files> {
term::reset());
}
if ysize as usize > self.buffer.len() {
let start_y = self.buffer.len() + 1 + ypos as usize;
for i in start_y..(ysize+2) as usize {
output += &format!("{}{:xsize$}",
term::goto_xy(xpos,i as u16),
" ",
xsize = xsize as usize);
}
}
output += &self.get_redraw_empty_list(self.buffer.len());
output
}

View File

@ -7,14 +7,15 @@ use crate::files::Files;
use crate::listview::ListView;
use crate::coordinates::{Coordinates, Size,Position};
use crate::files::File;
use crate::preview::Previewer;
pub struct MillerColumns<T> {
pub widgets: Vec<T>,
// pub left: Option<T>,
// pub main: Option<T>,
// pub preview: Option<T>,
ratio: (u16,u16,u16),
coordinates: Coordinates,
pub preview: Option<Previewer>,
pub ratio: (u16,u16,u16),
pub coordinates: Coordinates,
}
@ -27,7 +28,8 @@ impl<T> MillerColumns<T> where T: Widget {
ratio: (u16, u16, u16))
-> Self { Self { widgets: widgets,
coordinates: coordinates,
ratio: ratio } }
ratio: ratio,
preview: None } }
pub fn push_widget(&mut self, widget: T) {
@ -51,7 +53,7 @@ impl<T> MillerColumns<T> where T: Widget {
let preview_xsize = xsize * ratio.2 / 100;
let preview_size = Size ( (preview_xsize, ysize) );
let preview_pos = Position ( (left_xsize + main_xsize + 2, top) );
let preview_pos = Position ( (left_xsize + main_xsize + 3, top) );
let left_coords = Coordinates { size: left_size,
position: left_pos };
@ -83,8 +85,12 @@ impl<T> MillerColumns<T> where T: Widget {
pub fn get_main_widget_mut(&mut self) -> Option<&mut T> {
self.widgets.last_mut()
}
pub fn set_preview(&mut self, file: &File) {
match &mut self.preview {
Some(preview) => preview.set_file(file),
None => {}
};
}
}
impl<T> Widget for MillerColumns<T> where T: Widget {
@ -107,17 +113,6 @@ impl<T> Widget for MillerColumns<T> where T: Widget {
"".to_string()
}
fn refresh(&mut self) {
let (left_coords, main_coords, preview_coords) = self.calculate_coordinates();
// self.left.as_mut().unwrap().set_size(left_coords.size);
// self.left.as_mut().unwrap().set_position(left_coords.position);
// self.get_main_widget_mut().map(|widget| {
// widget.set_size(main_coords.size);
// widget.set_position(main_coords.position);
// });
let (left_coords, main_coords, preview_coords) = self.calculate_coordinates();
let widget2 = self.get_left_widget_mut().unwrap();
@ -130,39 +125,20 @@ impl<T> Widget for MillerColumns<T> where T: Widget {
widget.set_size(main_coords.size);
widget.set_position(main_coords.position);
widget.refresh();
// self.main.as_mut().unwrap().set_size(main_coords.size);
// self.main.as_mut().unwrap().set_position(main_coords.position);
// self.preview.as_mut().unwrap().set_size(preview_coords.size);
// self.preview.as_mut().unwrap().set_position(preview_coords.position);
// self.left.as_mut().unwrap().refresh();
// self.main.as_mut().unwrap().refresh();
// self.preview.as_mut().unwrap().refresh()
match &mut self.preview {
Some(preview) => { preview.set_size(preview_coords.size);
preview.set_position(preview_coords.position);
preview.refresh(); },
None => {}
};
}
fn get_drawlist(&self) -> String {
let left_widget = self.get_left_widget().unwrap().get_drawlist();
let main_widget = self.get_main_widget().unwrap().get_drawlist();
format!("{}{}", main_widget, left_widget)
// let left_drawlist = &self.left.as_ref().unwrap().get_drawlist();
// let main_drawlist = &self.main.as_ref().unwrap().get_drawlist();
// let preview_drawlist = &self.preview.as_ref().unwrap().get_drawlist();
// format!("{}{}{}", left_drawlist, &main_drawlist, &preview_drawlist)
// let main_widget_drawlist = self.get_main_widget().map(|widget| {
// widget.get_drawlist()
// });
// match main_widget_drawlist {
// Some(drawlist) => { drawlist },
// None => "Can't draw this".to_string()
// }
let preview = self.preview.as_ref().unwrap().get_drawlist();
format!("{}{}{}", main_widget, left_widget, preview)
}
fn on_key(&mut self, key: Key) {

View File

@ -68,16 +68,41 @@ pub trait Widget {
)
}
//fn get_window(&self) -> Window<Widget>;
//fn get_window_mut(&mut self) -> &mut Window<dyn Widget>;
fn get_clearlist(&self) -> String {
let (xpos, ypos) = self.get_position().position();
let (xsize, ysize) = self.get_size().size();
//fn run(&mut self) {
// self.draw();
// self.handle_input();
//}
let mut clearcmd = String::from("");
for line in ypos..ysize {
clearcmd += &format!("{}{:xsize$}",
crate::term::goto_xy(xpos, line),
" ",
xsize=xsize as usize);
}
clearcmd
}
fn get_redraw_empty_list(&self, lines: usize) -> String {
let (xpos, ypos) = self.get_position().position();
let (xsize, ysize) = self.get_size().size();
let mut output = String::new();
if ysize as usize > lines {
let start_y = lines + 1 + ypos as usize;
for i in start_y..(ysize+2) as usize {
output += &format!("{}{:xsize$}",
crate::term::goto_xy(xpos,i as u16),
" ",
xsize = xsize as usize);
}
}
output
}
//fn get_buffer(&self) -> &Vec<String>;
fn refresh(&mut self);
fn get_drawlist(&self) -> String;
}