diff options
Diffstat (limited to 'src/file_browser.rs')
-rw-r--r-- | src/file_browser.rs | 88 |
1 files changed, 50 insertions, 38 deletions
diff --git a/src/file_browser.rs b/src/file_browser.rs index a7f4b19..cb5e40f 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -1,7 +1,7 @@ use termion::event::Key; use std::io::Write; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, RwLock}; use std::path::PathBuf; use std::ffi::OsString; use std::collections::HashSet; @@ -23,6 +23,7 @@ use crate::term::ScreenExt; use crate::foldview::LogView; use crate::coordinates::Coordinates; use crate::dirty::Dirtyable; +use crate::stats::{FsStat, FsExt}; #[derive(PartialEq)] pub enum FileBrowserWidgets { @@ -78,6 +79,7 @@ pub struct FileBrowser { bookmarks: Arc<Mutex<BMPopup>>, log_view: Arc<Mutex<LogView>>, fs_cache: FsCache, + fs_stat: Arc<RwLock<FsStat>> } impl Tabbable for TabView<FileBrowser> { @@ -95,6 +97,7 @@ impl Tabbable for TabView<FileBrowser> { tab.proc_view = proc_view; tab.bookmarks = bookmarks; tab.log_view = log_view; + tab.fs_stat = cur_tab.fs_stat.clone(); self.push_widget(tab)?; self.active = self.widgets.len() - 1; @@ -187,10 +190,14 @@ impl Tabbable for TabView<FileBrowser> { }); self.active_tab_mut_().fs_cache.watch_only(open_dirs).log(); + self.active_tab_mut_().fs_stat.write()?.refresh().log(); Ok(()) } fn on_config_loaded(&mut self) -> HResult<()> { + // hack: wait a bit for widget readyness... + std::thread::sleep_ms(100); + let show_hidden = self.config().show_hidden(); for tab in self.widgets.iter_mut() { tab.left_widget_mut().map(|w| { @@ -198,7 +205,14 @@ impl Tabbable for TabView<FileBrowser> { w.content.dirty_meta.set_dirty(); w.refresh().log(); }).ok(); - tab.main_widget_mut().map(|w| w.content.show_hidden = show_hidden).ok(); + + tab.main_widget_mut().map(|w| { + w.content.show_hidden = show_hidden; + w.content.dirty_meta.set_dirty(); + w.content.sort(); + w.refresh().log(); + }).ok(); + tab.preview_widget_mut().map(|w| w.config_loaded()).ok(); } Ok(()) @@ -256,6 +270,8 @@ impl FileBrowser { list.select_file(&file); } + list.content.meta_all(); + list.content.dirty_meta.set_dirty(); list.refresh().log(); if startup { @@ -320,6 +336,7 @@ impl FileBrowser { let proc_view = ProcView::new(&core); let bookmarks = BMPopup::new(&core); let log_view = LogView::new(&core, vec![]); + let fs_stat = FsStat::new().unwrap(); @@ -331,6 +348,7 @@ impl FileBrowser { bookmarks: Arc::new(Mutex::new(bookmarks)), log_view: Arc::new(Mutex::new(log_view)), fs_cache: fs_cache, + fs_stat: Arc::new(RwLock::new(fs_stat)) }) } @@ -636,31 +654,6 @@ impl FileBrowser { HError::no_files() } - // pub fn take_preview_files(&mut self) -> HResult<Files> { - // let widget = self.columns.remove_widget(2); - // if let Filxx - // } - - // pub fn take_files_from_widget(&self, - // widget: FileBrowserWidgets) -> HResult<Files> { - // match widget { - // FileBrowserWidgets::FileList(file_list) => { - // match file_list.take_widget() { - // Ok(widget) => { - // let files = widget.content; - // Ok(files) - // } - // _ => HError::no_files() - // } - // } - // FileBrowserWidgets::Previewer(previewer) => { - // let files = previewer.take_files()?; - // Ok(files) - // } - // _ => HError::no_files() - // } - // } - pub fn get_files(&self) -> HResult<&Files> { Ok(&self.main_widget()?.content) } @@ -676,12 +669,12 @@ impl FileBrowser { self.main_widget_mut()?.content.meta_updated = false; - if self.cwd.parent().is_some() { - let left_selection = self.left_widget()?.clone_selected_file(); - let left_files = self.get_left_files()?; - self.fs_cache.put_files(left_files, Some(left_selection)).log(); - self.left_widget_mut()?.content.meta_updated = false; - } + // if self.cwd.parent().is_some() { + // let left_selection = self.left_widget()?.clone_selected_file(); + // let left_files = self.get_left_files()?; + // self.fs_cache.put_files(left_files, Some(left_selection)).log(); + // self.left_widget_mut()?.content.meta_updated = false; + // } Ok(()) } @@ -929,6 +922,18 @@ impl FileBrowser { let count_xpos = xsize - file_count.len() as u16; let count_ypos = ypos + self.get_coordinates()?.ysize(); + let fs = self.fs_stat.read()?.find_fs(&file.path)?.clone(); + + let dev = fs.get_dev(); + let free_space = fs.get_free(); + let total_space = fs.get_total(); + let space = format!("{}: {} / {}", + dev, + free_space, + total_space); + + let space_xpos = count_xpos - space.len() as u16 - 5; // - 3; + let status = format!("{} {}:{} {}{} {}{}", permissions, user, @@ -940,10 +945,13 @@ impl FileBrowser { ); let status = crate::term::sized_string_u(&status, (xsize-1) as usize); - let status = format!("{}{}{}{}", + let status = format!("{}{}{}{}{}{} | {}", status, crate::term::header_color(), - crate::term::goto_xy(count_xpos, count_ypos), + crate::term::goto_xy(space_xpos, count_ypos), + crate::term::color_orange(), + space, + crate::term::header_color(), file_count); Ok(status) @@ -972,9 +980,13 @@ impl Widget for FileBrowser { let file = self.selected_file()?; let name = &file.name; - let color = if file.is_dir() || file.color.is_none() { - crate::term::highlight_color() } else { - crate::term::from_lscolor(file.color.as_ref().unwrap()) }; + let color = if file.is_dir() { + crate::term::highlight_color() } + else if file.color.is_none() { + crate::term::normal_color() + } else { + crate::term::from_lscolor(file.color.as_ref().unwrap()) + }; let path = self.cwd.short_string(); |