summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/file_browser.rs70
-rw-r--r--src/tabview.rs13
2 files changed, 41 insertions, 42 deletions
diff --git a/src/file_browser.rs b/src/file_browser.rs
index 53fa898..d82e13f 100644
--- a/src/file_browser.rs
+++ b/src/file_browser.rs
@@ -11,7 +11,7 @@ use crate::miller_columns::MillerColumns;
use crate::widget::Widget;
use crate::tabview::{TabView, Tabbable};
use crate::preview::WillBeWidget;
-use crate::fail::{HError, HResult};
+use crate::fail::HResult;
#[derive(PartialEq)]
pub struct FileBrowser {
@@ -34,6 +34,15 @@ impl Tabbable for TabView<FileBrowser> {
self.next_tab_();
}
+ fn get_tab_names(&self) -> Vec<Option<String>> {
+ self.widgets.iter().map(|filebrowser| {
+ let path = filebrowser.cwd.path();
+ let last_dir = path.components().last().unwrap();
+ let dir_name = last_dir.as_os_str().to_string_lossy().to_string();
+ Some(dir_name)
+ }).collect()
+ }
+
fn active_tab(& self) -> & dyn Widget {
self.active_tab_()
}
@@ -59,7 +68,7 @@ impl FileBrowser {
miller.set_coordinates(&coords);
- let (left_coords, main_coords, _) = miller.calculate_coordinates();
+ let (_, main_coords, _) = miller.calculate_coordinates();
let main_path: std::path::PathBuf = cwd.ancestors().take(1).map(|path| std::path::PathBuf::from(path)).collect();
let main_widget = WillBeWidget::new(Box::new(move |_| {
@@ -69,28 +78,13 @@ impl FileBrowser {
Ok(list)
}));
- let left_path: std::path::PathBuf = cwd.ancestors().skip(1).take(1).map(|path| std::path::PathBuf::from(path)).collect();
- let left_widget = WillBeWidget::new(Box::new(move |_| {
- let mut list = ListView::new(Files::new_from_path(&left_path).unwrap());
- list.set_coordinates(&left_coords);
- list.animate_slide_up();
- Ok(list)
- }));
-
-
-
-
- miller.push_widget(left_widget);
miller.push_widget(main_widget);
let cwd = File::new_from_path(&cwd).unwrap();
- let mut file_browser = FileBrowser { columns: miller,
- cwd: cwd };
-
-
- Ok(file_browser)
+ Ok(FileBrowser { columns: miller,
+ cwd: cwd })
}
pub fn enter_dir(&mut self) -> HResult<()> {
@@ -100,6 +94,7 @@ impl FileBrowser {
match file.read_dir() {
Ok(files) => {
std::env::set_current_dir(&file.path).unwrap();
+ self.cwd = file.clone();
let view = WillBeWidget::new(Box::new(move |_| {
let files = files.clone();
let mut list = ListView::new(files);
@@ -129,14 +124,9 @@ impl FileBrowser {
}
pub fn go_back(&mut self) -> HResult<()> {
- let path = self.selected_file()?.grand_parent()?;
- std::env::set_current_dir(path)?;
self.columns.pop_widget();
- // Make sure there's a directory on the left unless it's /
- self.fix_left()?;
-
- self.columns.refresh();
+ self.refresh();
Ok(())
}
@@ -158,7 +148,7 @@ impl FileBrowser {
let file = self.selected_file()?.clone();
if let Some(grand_parent) = file.grand_parent() {
let (coords, _, _) = self.columns.calculate_coordinates();
- let mut left_view = WillBeWidget::new(Box::new(move |_| {
+ let left_view = WillBeWidget::new(Box::new(move |_| {
let mut view
= ListView::new(Files::new_from_path(&grand_parent)?);
view.set_coordinates(&coords);
@@ -176,6 +166,13 @@ impl FileBrowser {
Ok(cwd)
}
+ pub fn set_cwd(&mut self) -> HResult<()> {
+ let cwd = self.cwd()?;
+ std::env::set_current_dir(&cwd.path)?;
+ self.cwd = cwd;
+ Ok(())
+ }
+
pub fn selected_file(&self) -> HResult<File> {
let widget = self.main_widget()?;
let file = widget.lock()?.as_ref()?.selected_file().clone();
@@ -210,11 +207,6 @@ impl FileBrowser {
Ok(())
}
- pub fn animate_columns(&mut self) {
- self.columns.get_left_widget_mut().map(|w| w.animate_slide_up());
- self.columns.get_main_widget_mut().unwrap().animate_slide_up();
- }
-
pub fn turbo_cd(&mut self) -> HResult<()> {
let dir = self.minibuffer("cd: ");
@@ -299,8 +291,10 @@ impl Widget for FileBrowser {
crate::term::goto_xy(count_xpos, count_ypos), file_count)
}
fn refresh(&mut self) {
- self.update_preview();
- self.fix_selection();
+ self.update_preview().ok();
+ self.fix_left().ok();
+ self.fix_selection().ok();
+ self.set_cwd().ok();
self.columns.refresh();
}
@@ -314,12 +308,12 @@ impl Widget for FileBrowser {
fn on_key(&mut self, key: Key) {
match key {
- Key::Char('/') => { self.turbo_cd(); },
- Key::Char('Q') => { self.quit_with_dir(); },
- Key::Right | Key::Char('f') => { self.enter_dir(); },
- Key::Left | Key::Char('b') => { self.go_back(); },
+ Key::Char('/') => { self.turbo_cd().ok(); },
+ Key::Char('Q') => { self.quit_with_dir().ok(); },
+ Key::Right | Key::Char('f') => { self.enter_dir().ok(); },
+ Key::Left | Key::Char('b') => { self.go_back().ok(); },
_ => self.columns.get_main_widget_mut().unwrap().on_key(key),
}
- self.update_preview();
+ self.update_preview().ok();
}
}
diff --git a/src/tabview.rs b/src/tabview.rs
index 722932a..675ba66 100644
--- a/src/tabview.rs
+++ b/src/tabview.rs
@@ -8,6 +8,7 @@ pub trait Tabbable {
fn close_tab(&mut self);
fn next_tab(&mut self);
fn on_next_tab(&mut self);
+ fn get_tab_names(&self) -> Vec<Option<String>>;
fn active_tab(&self) -> &dyn Widget;
fn active_tab_mut(&mut self) -> &mut dyn Widget;
fn on_key(&mut self, key: Key) {
@@ -23,7 +24,7 @@ pub trait Tabbable {
#[derive(PartialEq)]
pub struct TabView<T> where T: Widget, TabView<T>: Tabbable {
- widgets: Vec<T>,
+ pub widgets: Vec<T>,
pub active: usize,
coordinates: Coordinates
}
@@ -77,17 +78,21 @@ impl<T> Widget for TabView<T> where T: Widget, TabView<T>: Tabbable {
fn render_header(&self) -> String {
let xsize = self.get_coordinates().xsize();
let header = self.active_tab_().render_header();
+ let mut tab_names = self.get_tab_names();
let mut nums_length = 0;
let tabnums = (0..self.widgets.len()).map(|num| {
- nums_length += format!("{} ", num).len();
+ nums_length += format!("{}:{} ",
+ num,
+ tab_names[num].as_ref().unwrap()).len();
if num == self.active {
- format!(" {}{}{}{}",
+ format!(" {}{}:{}{}{}",
crate::term::invert(),
num,
+ tab_names[num].as_ref().unwrap(),
crate::term::reset(),
crate::term::header_color())
} else {
- format!(" {}", num)
+ format!(" {}:{}", num, tab_names[num].as_ref().unwrap())
}
}).collect::<String>();