summaryrefslogtreecommitdiffstats
path: root/src/file_browser.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-01-30 15:26:24 +0100
committerrabite <rabite@posteo.de>2019-01-30 15:26:24 +0100
commit60468a4c660288b663506a404c922b2506fc6542 (patch)
tree24ed29962e3ca98e5430095f8a050c16978fd3fa /src/file_browser.rs
parentb96895a2f28e1e9fead9228617cdc02fdd1f3c31 (diff)
previewing text files
Diffstat (limited to 'src/file_browser.rs')
-rw-r--r--src/file_browser.rs116
1 files changed, 71 insertions, 45 deletions
diff --git a/src/file_browser.rs b/src/file_browser.rs
index 1d2edeb..6c2ff93 100644
--- a/src/file_browser.rs
+++ b/src/file_browser.rs
@@ -5,7 +5,7 @@ use crate::widget::Widget;
use crate::files::Files;
//use crate::hbox::HBox;
use crate::listview::ListView;
-use crate::coordinates::{Size,Position};
+use crate::coordinates::{Size,Position,Coordinates};
use crate::preview::Previewer;
use crate::miller_columns::MillerColumns;
@@ -14,6 +14,59 @@ pub struct FileBrowser {
}
impl FileBrowser {
+ pub fn new() -> FileBrowser {
+ let cwd = std::env::current_dir().unwrap();
+ let mut miller = MillerColumns::new();
+
+ let mut lists: Vec<_> = cwd.ancestors().map(|path| {
+ ListView::new(Files::new_from_path(path).unwrap())
+ }).collect();
+ lists.reverse();
+
+ for widget in lists {
+ miller.push_widget(widget);
+ }
+
+ FileBrowser { columns: miller }
+ }
+
+ pub fn enter_dir(&mut self) {
+ let fileview = self.columns.get_main_widget();
+
+ let path = fileview.selected_file().path();
+ match Files::new_from_path(&path) {
+ Ok(files) => {
+ let view = ListView::new(files);
+ self.columns.push_widget(view);
+ self.update_preview();
+ },
+ Err(err) => {
+ self.show_status(&format!("Can't open this path: {}", err));
+ }
+ };
+ }
+
+ pub fn go_back(&mut self) {
+ if self.columns.get_left_widget().is_none() { return }
+ self.columns.pop_widget();
+
+ // Make sure there's a directory on the left unless it's /
+ if self.columns.get_left_widget().is_none() {
+ let file = self.columns.get_main_widget().selected_file().clone();
+ if let Some(grand_parent) = file.grand_parent() {
+ let left_view
+ = ListView::new(Files::new_from_path(grand_parent).unwrap());
+ self.columns.prepend_widget(left_view);
+ }
+ }
+
+ }
+
+ pub fn update_preview(&mut self) {
+ let file = self.columns.get_main_widget().selected_file().clone();
+ let preview = &mut self.columns.preview;
+ preview.set_file(&file);
+ }
}
@@ -33,61 +86,34 @@ impl Widget for FileBrowser {
fn set_position(&mut self, position: Position) {
self.columns.set_position(position);
}
+ fn get_coordinates(&self) -> &Coordinates {
+ &self.columns.coordinates
+ }
+ fn set_coordinates(&mut self, coordinates: &Coordinates) {
+ self.columns.coordinates = coordinates.clone();
+ }
fn render_header(&self) -> String {
"".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()
+ if self.columns.get_left_widget().is_none() {
+ self.columns.get_clearlist() + &self.columns.get_drawlist()
+ } else {
+ self.columns.get_drawlist()
+ }
}
-
+
fn on_key(&mut self, key: Key) {
match key {
- Key::Right => {
- match self.columns.get_main_widget() {
- Some(widget) => {
- 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 => { }
- }
- },
- Key::Left => {
- if self.columns.get_left_widget().is_some() {
- self.columns.widgets.pop();
- }
- }
-
- _ => {
- match self.columns.get_main_widget_mut() {
- Some(widget) => {
- widget.on_key(key);
- self.refresh();
- }, None => { self.refresh(); }
-
- }
- //_ => { self.bad(Event::Key(key)); }
- }
+ Key::Right => self.enter_dir(),
+ Key::Left => self.go_back(),
+ _ => self.columns.get_main_widget_mut().on_key(key)
}
+ self.update_preview();
}
}
-