mirror of
https://github.com/bobwen-dev/hunter
synced 2025-04-12 00:55:41 +02:00
previews for directories
This commit is contained in:
parent
ca521059e4
commit
b96895a2f2
@ -1,12 +1,12 @@
|
|||||||
use termion::event::{Key,Event};
|
use termion::event::{Key};
|
||||||
|
|
||||||
|
|
||||||
use crate::widget::Widget;
|
use crate::widget::Widget;
|
||||||
use crate::files::Files;
|
use crate::files::Files;
|
||||||
//use crate::hbox::HBox;
|
//use crate::hbox::HBox;
|
||||||
use crate::listview::ListView;
|
use crate::listview::ListView;
|
||||||
use crate::coordinates::{Coordinates, Size,Position};
|
use crate::coordinates::{Size,Position};
|
||||||
use crate::files::File;
|
use crate::preview::Previewer;
|
||||||
use crate::miller_columns::MillerColumns;
|
use crate::miller_columns::MillerColumns;
|
||||||
|
|
||||||
pub struct FileBrowser {
|
pub struct FileBrowser {
|
||||||
@ -14,9 +14,6 @@ pub struct FileBrowser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl FileBrowser {
|
impl FileBrowser {
|
||||||
pub fn set_left_directory(&mut self) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -40,26 +37,22 @@ impl Widget for FileBrowser {
|
|||||||
"".to_string()
|
"".to_string()
|
||||||
}
|
}
|
||||||
fn refresh(&mut self) {
|
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();
|
self.columns.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_drawlist(&self) -> String {
|
fn get_drawlist(&self) -> String {
|
||||||
self.columns.get_drawlist()
|
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 path = widget.selected_file().path();
|
||||||
let files = Files::new_from_path(&path).unwrap();
|
let files = Files::new_from_path(&path).unwrap();
|
||||||
let view = ListView::new(files);
|
let view = ListView::new(files);
|
||||||
|
let selected_file = view.selected_file();
|
||||||
|
self.columns.set_preview(selected_file);
|
||||||
self.columns.widgets.push(view);
|
self.columns.widgets.push(view);
|
||||||
self.refresh();
|
self.refresh();
|
||||||
}, None => { }
|
}, None => { }
|
||||||
@ -86,7 +81,6 @@ impl Widget for FileBrowser {
|
|||||||
match self.columns.get_main_widget_mut() {
|
match self.columns.get_main_widget_mut() {
|
||||||
Some(widget) => {
|
Some(widget) => {
|
||||||
widget.on_key(key);
|
widget.on_key(key);
|
||||||
self.set_left_directory();
|
|
||||||
self.refresh();
|
self.refresh();
|
||||||
}, None => { self.refresh(); }
|
}, None => { self.refresh(); }
|
||||||
|
|
||||||
|
@ -220,9 +220,6 @@ impl Widget for ListView<Files> {
|
|||||||
fn refresh(&mut self) {
|
fn refresh(&mut self) {
|
||||||
self.buffer = self.render();
|
self.buffer = self.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fn render(&self) -> Vec<String> {
|
fn render(&self) -> Vec<String> {
|
||||||
self.content.iter().map(|file| {
|
self.content.iter().map(|file| {
|
||||||
self.render_line(&file)
|
self.render_line(&file)
|
||||||
@ -251,16 +248,7 @@ impl Widget for ListView<Files> {
|
|||||||
term::reset());
|
term::reset());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output += &self.get_redraw_empty_list(self.buffer.len());
|
||||||
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
|
output
|
||||||
}
|
}
|
||||||
|
@ -7,14 +7,15 @@ use crate::files::Files;
|
|||||||
use crate::listview::ListView;
|
use crate::listview::ListView;
|
||||||
use crate::coordinates::{Coordinates, Size,Position};
|
use crate::coordinates::{Coordinates, Size,Position};
|
||||||
use crate::files::File;
|
use crate::files::File;
|
||||||
|
use crate::preview::Previewer;
|
||||||
|
|
||||||
pub struct MillerColumns<T> {
|
pub struct MillerColumns<T> {
|
||||||
pub widgets: Vec<T>,
|
pub widgets: Vec<T>,
|
||||||
// pub left: Option<T>,
|
// pub left: Option<T>,
|
||||||
// pub main: Option<T>,
|
// pub main: Option<T>,
|
||||||
// pub preview: Option<T>,
|
pub preview: Option<Previewer>,
|
||||||
ratio: (u16,u16,u16),
|
pub ratio: (u16,u16,u16),
|
||||||
coordinates: Coordinates,
|
pub coordinates: Coordinates,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -27,7 +28,8 @@ impl<T> MillerColumns<T> where T: Widget {
|
|||||||
ratio: (u16, u16, u16))
|
ratio: (u16, u16, u16))
|
||||||
-> Self { Self { widgets: widgets,
|
-> Self { Self { widgets: widgets,
|
||||||
coordinates: coordinates,
|
coordinates: coordinates,
|
||||||
ratio: ratio } }
|
ratio: ratio,
|
||||||
|
preview: None } }
|
||||||
|
|
||||||
|
|
||||||
pub fn push_widget(&mut self, widget: T) {
|
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_xsize = xsize * ratio.2 / 100;
|
||||||
let preview_size = Size ( (preview_xsize, ysize) );
|
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,
|
let left_coords = Coordinates { size: left_size,
|
||||||
position: left_pos };
|
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> {
|
pub fn get_main_widget_mut(&mut self) -> Option<&mut T> {
|
||||||
self.widgets.last_mut()
|
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 {
|
impl<T> Widget for MillerColumns<T> where T: Widget {
|
||||||
@ -107,17 +113,6 @@ impl<T> Widget for MillerColumns<T> where T: Widget {
|
|||||||
"".to_string()
|
"".to_string()
|
||||||
}
|
}
|
||||||
fn refresh(&mut self) {
|
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 (left_coords, main_coords, preview_coords) = self.calculate_coordinates();
|
||||||
|
|
||||||
let widget2 = self.get_left_widget_mut().unwrap();
|
let widget2 = self.get_left_widget_mut().unwrap();
|
||||||
@ -131,38 +126,19 @@ impl<T> Widget for MillerColumns<T> where T: Widget {
|
|||||||
widget.set_position(main_coords.position);
|
widget.set_position(main_coords.position);
|
||||||
widget.refresh();
|
widget.refresh();
|
||||||
|
|
||||||
|
match &mut self.preview {
|
||||||
// self.main.as_mut().unwrap().set_size(main_coords.size);
|
Some(preview) => { preview.set_size(preview_coords.size);
|
||||||
// self.main.as_mut().unwrap().set_position(main_coords.position);
|
preview.set_position(preview_coords.position);
|
||||||
|
preview.refresh(); },
|
||||||
// self.preview.as_mut().unwrap().set_size(preview_coords.size);
|
None => {}
|
||||||
// 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()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_drawlist(&self) -> String {
|
fn get_drawlist(&self) -> String {
|
||||||
let left_widget = self.get_left_widget().unwrap().get_drawlist();
|
let left_widget = self.get_left_widget().unwrap().get_drawlist();
|
||||||
let main_widget = self.get_main_widget().unwrap().get_drawlist();
|
let main_widget = self.get_main_widget().unwrap().get_drawlist();
|
||||||
format!("{}{}", main_widget, left_widget)
|
let preview = self.preview.as_ref().unwrap().get_drawlist();
|
||||||
// let left_drawlist = &self.left.as_ref().unwrap().get_drawlist();
|
format!("{}{}{}", main_widget, left_widget, preview)
|
||||||
// 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()
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_key(&mut self, key: Key) {
|
fn on_key(&mut self, key: Key) {
|
||||||
|
@ -68,16 +68,41 @@ pub trait Widget {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
//fn get_window(&self) -> Window<Widget>;
|
fn get_clearlist(&self) -> String {
|
||||||
//fn get_window_mut(&mut self) -> &mut Window<dyn Widget>;
|
let (xpos, ypos) = self.get_position().position();
|
||||||
|
let (xsize, ysize) = self.get_size().size();
|
||||||
|
|
||||||
//fn run(&mut self) {
|
let mut clearcmd = String::from("");
|
||||||
// self.draw();
|
for line in ypos..ysize {
|
||||||
// self.handle_input();
|
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 refresh(&mut self);
|
||||||
fn get_drawlist(&self) -> String;
|
fn get_drawlist(&self) -> String;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user