mirror of https://github.com/bobwen-dev/hunter
show tab direcories
This commit is contained in:
parent
184f4916d3
commit
a1230fed0d
|
@ -11,7 +11,7 @@ use crate::miller_columns::MillerColumns;
|
||||||
use crate::widget::Widget;
|
use crate::widget::Widget;
|
||||||
use crate::tabview::{TabView, Tabbable};
|
use crate::tabview::{TabView, Tabbable};
|
||||||
use crate::preview::WillBeWidget;
|
use crate::preview::WillBeWidget;
|
||||||
use crate::fail::{HError, HResult};
|
use crate::fail::HResult;
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub struct FileBrowser {
|
pub struct FileBrowser {
|
||||||
|
@ -34,6 +34,15 @@ impl Tabbable for TabView<FileBrowser> {
|
||||||
self.next_tab_();
|
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 {
|
fn active_tab(& self) -> & dyn Widget {
|
||||||
self.active_tab_()
|
self.active_tab_()
|
||||||
}
|
}
|
||||||
|
@ -59,7 +68,7 @@ impl FileBrowser {
|
||||||
miller.set_coordinates(&coords);
|
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_path: std::path::PathBuf = cwd.ancestors().take(1).map(|path| std::path::PathBuf::from(path)).collect();
|
||||||
let main_widget = WillBeWidget::new(Box::new(move |_| {
|
let main_widget = WillBeWidget::new(Box::new(move |_| {
|
||||||
|
@ -69,28 +78,13 @@ impl FileBrowser {
|
||||||
Ok(list)
|
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);
|
miller.push_widget(main_widget);
|
||||||
|
|
||||||
|
|
||||||
let cwd = File::new_from_path(&cwd).unwrap();
|
let cwd = File::new_from_path(&cwd).unwrap();
|
||||||
|
|
||||||
let mut file_browser = FileBrowser { columns: miller,
|
Ok(FileBrowser { columns: miller,
|
||||||
cwd: cwd };
|
cwd: cwd })
|
||||||
|
|
||||||
|
|
||||||
Ok(file_browser)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enter_dir(&mut self) -> HResult<()> {
|
pub fn enter_dir(&mut self) -> HResult<()> {
|
||||||
|
@ -100,6 +94,7 @@ impl FileBrowser {
|
||||||
match file.read_dir() {
|
match file.read_dir() {
|
||||||
Ok(files) => {
|
Ok(files) => {
|
||||||
std::env::set_current_dir(&file.path).unwrap();
|
std::env::set_current_dir(&file.path).unwrap();
|
||||||
|
self.cwd = file.clone();
|
||||||
let view = WillBeWidget::new(Box::new(move |_| {
|
let view = WillBeWidget::new(Box::new(move |_| {
|
||||||
let files = files.clone();
|
let files = files.clone();
|
||||||
let mut list = ListView::new(files);
|
let mut list = ListView::new(files);
|
||||||
|
@ -129,14 +124,9 @@ impl FileBrowser {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn go_back(&mut self) -> HResult<()> {
|
pub fn go_back(&mut self) -> HResult<()> {
|
||||||
let path = self.selected_file()?.grand_parent()?;
|
|
||||||
std::env::set_current_dir(path)?;
|
|
||||||
self.columns.pop_widget();
|
self.columns.pop_widget();
|
||||||
|
|
||||||
// Make sure there's a directory on the left unless it's /
|
self.refresh();
|
||||||
self.fix_left()?;
|
|
||||||
|
|
||||||
self.columns.refresh();
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +148,7 @@ impl FileBrowser {
|
||||||
let file = self.selected_file()?.clone();
|
let file = self.selected_file()?.clone();
|
||||||
if let Some(grand_parent) = file.grand_parent() {
|
if let Some(grand_parent) = file.grand_parent() {
|
||||||
let (coords, _, _) = self.columns.calculate_coordinates();
|
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
|
let mut view
|
||||||
= ListView::new(Files::new_from_path(&grand_parent)?);
|
= ListView::new(Files::new_from_path(&grand_parent)?);
|
||||||
view.set_coordinates(&coords);
|
view.set_coordinates(&coords);
|
||||||
|
@ -176,6 +166,13 @@ impl FileBrowser {
|
||||||
Ok(cwd)
|
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> {
|
pub fn selected_file(&self) -> HResult<File> {
|
||||||
let widget = self.main_widget()?;
|
let widget = self.main_widget()?;
|
||||||
let file = widget.lock()?.as_ref()?.selected_file().clone();
|
let file = widget.lock()?.as_ref()?.selected_file().clone();
|
||||||
|
@ -210,11 +207,6 @@ impl FileBrowser {
|
||||||
Ok(())
|
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<()> {
|
pub fn turbo_cd(&mut self) -> HResult<()> {
|
||||||
let dir = self.minibuffer("cd: ");
|
let dir = self.minibuffer("cd: ");
|
||||||
|
|
||||||
|
@ -299,8 +291,10 @@ impl Widget for FileBrowser {
|
||||||
crate::term::goto_xy(count_xpos, count_ypos), file_count)
|
crate::term::goto_xy(count_xpos, count_ypos), file_count)
|
||||||
}
|
}
|
||||||
fn refresh(&mut self) {
|
fn refresh(&mut self) {
|
||||||
self.update_preview();
|
self.update_preview().ok();
|
||||||
self.fix_selection();
|
self.fix_left().ok();
|
||||||
|
self.fix_selection().ok();
|
||||||
|
self.set_cwd().ok();
|
||||||
self.columns.refresh();
|
self.columns.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,12 +308,12 @@ impl Widget for FileBrowser {
|
||||||
|
|
||||||
fn on_key(&mut self, key: Key) {
|
fn on_key(&mut self, key: Key) {
|
||||||
match key {
|
match key {
|
||||||
Key::Char('/') => { self.turbo_cd(); },
|
Key::Char('/') => { self.turbo_cd().ok(); },
|
||||||
Key::Char('Q') => { self.quit_with_dir(); },
|
Key::Char('Q') => { self.quit_with_dir().ok(); },
|
||||||
Key::Right | Key::Char('f') => { self.enter_dir(); },
|
Key::Right | Key::Char('f') => { self.enter_dir().ok(); },
|
||||||
Key::Left | Key::Char('b') => { self.go_back(); },
|
Key::Left | Key::Char('b') => { self.go_back().ok(); },
|
||||||
_ => self.columns.get_main_widget_mut().unwrap().on_key(key),
|
_ => self.columns.get_main_widget_mut().unwrap().on_key(key),
|
||||||
}
|
}
|
||||||
self.update_preview();
|
self.update_preview().ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ pub trait Tabbable {
|
||||||
fn close_tab(&mut self);
|
fn close_tab(&mut self);
|
||||||
fn next_tab(&mut self);
|
fn next_tab(&mut self);
|
||||||
fn on_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(&self) -> &dyn Widget;
|
||||||
fn active_tab_mut(&mut self) -> &mut dyn Widget;
|
fn active_tab_mut(&mut self) -> &mut dyn Widget;
|
||||||
fn on_key(&mut self, key: Key) {
|
fn on_key(&mut self, key: Key) {
|
||||||
|
@ -23,7 +24,7 @@ pub trait Tabbable {
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub struct TabView<T> where T: Widget, TabView<T>: Tabbable {
|
pub struct TabView<T> where T: Widget, TabView<T>: Tabbable {
|
||||||
widgets: Vec<T>,
|
pub widgets: Vec<T>,
|
||||||
pub active: usize,
|
pub active: usize,
|
||||||
coordinates: Coordinates
|
coordinates: Coordinates
|
||||||
}
|
}
|
||||||
|
@ -77,17 +78,21 @@ impl<T> Widget for TabView<T> where T: Widget, TabView<T>: Tabbable {
|
||||||
fn render_header(&self) -> String {
|
fn render_header(&self) -> String {
|
||||||
let xsize = self.get_coordinates().xsize();
|
let xsize = self.get_coordinates().xsize();
|
||||||
let header = self.active_tab_().render_header();
|
let header = self.active_tab_().render_header();
|
||||||
|
let mut tab_names = self.get_tab_names();
|
||||||
let mut nums_length = 0;
|
let mut nums_length = 0;
|
||||||
let tabnums = (0..self.widgets.len()).map(|num| {
|
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 {
|
if num == self.active {
|
||||||
format!(" {}{}{}{}",
|
format!(" {}{}:{}{}{}",
|
||||||
crate::term::invert(),
|
crate::term::invert(),
|
||||||
num,
|
num,
|
||||||
|
tab_names[num].as_ref().unwrap(),
|
||||||
crate::term::reset(),
|
crate::term::reset(),
|
||||||
crate::term::header_color())
|
crate::term::header_color())
|
||||||
} else {
|
} else {
|
||||||
format!(" {}", num)
|
format!(" {}:{}", num, tab_names[num].as_ref().unwrap())
|
||||||
}
|
}
|
||||||
}).collect::<String>();
|
}).collect::<String>();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue