From b96895a2f28e1e9fead9228617cdc02fdd1f3c31 Mon Sep 17 00:00:00 2001 From: rabite Date: Tue, 29 Jan 2019 18:54:13 +0100 Subject: [PATCH] previews for directories --- src/file_browser.rs | 38 +++++++++++-------------- src/listview.rs | 14 +-------- src/miller_columns.rs | 66 ++++++++++++++----------------------------- src/widget.rs | 39 ++++++++++++++++++++----- 4 files changed, 70 insertions(+), 87 deletions(-) diff --git a/src/file_browser.rs b/src/file_browser.rs index e021dd9..1d2edeb 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -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(); } diff --git a/src/listview.rs b/src/listview.rs index 76bb240..ca1129c 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -220,9 +220,6 @@ impl Widget for ListView { fn refresh(&mut self) { self.buffer = self.render(); } - - - fn render(&self) -> Vec { self.content.iter().map(|file| { self.render_line(&file) @@ -251,16 +248,7 @@ impl Widget for ListView { 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 } diff --git a/src/miller_columns.rs b/src/miller_columns.rs index fce25ac..2f92828 100644 --- a/src/miller_columns.rs +++ b/src/miller_columns.rs @@ -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 { pub widgets: Vec, // pub left: Option, // pub main: Option, - // pub preview: Option, - ratio: (u16,u16,u16), - coordinates: Coordinates, + pub preview: Option, + pub ratio: (u16,u16,u16), + pub coordinates: Coordinates, } @@ -27,7 +28,8 @@ impl MillerColumns 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 MillerColumns 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 MillerColumns 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 Widget for MillerColumns where T: Widget { @@ -107,17 +113,6 @@ impl Widget for MillerColumns 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 Widget for MillerColumns 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) { diff --git a/src/widget.rs b/src/widget.rs index 7fc319c..db2a4f1 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -68,16 +68,41 @@ pub trait Widget { ) } - //fn get_window(&self) -> Window; - //fn get_window_mut(&mut self) -> &mut Window; + 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; fn refresh(&mut self); fn get_drawlist(&self) -> String; }