summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-03-30 22:18:50 +0100
committerrabite <rabite@posteo.de>2019-03-30 22:28:10 +0100
commited6abefc3c4876bc1ea7dade58909fc161706b60 (patch)
tree5a09868e1dc8872a63b57c623505c1d95d0f02bb
parent4658b2fcf00b00aed642d1af24c7f763d3613cba (diff)
some bugs fixed
-rw-r--r--src/file_browser.rs75
-rw-r--r--src/files.rs22
-rw-r--r--src/fscache.rs16
-rw-r--r--src/preview.rs7
-rw-r--r--src/term.rs28
-rw-r--r--src/widget.rs16
6 files changed, 99 insertions, 65 deletions
diff --git a/src/file_browser.rs b/src/file_browser.rs
index 469b2d8..941901c 100644
--- a/src/file_browser.rs
+++ b/src/file_browser.rs
@@ -174,6 +174,7 @@ impl Tabbable for TabView<FileBrowser> {
impl FileBrowser {
pub fn new(core: &WidgetCore, cache: Option<FsCache>) -> HResult<FileBrowser> {
+ let startup = cache.is_none();
let fs_cache = cache.unwrap_or_else(|| FsCache::new(core.get_sender()));
let cwd = std::env::current_dir().unwrap();
@@ -210,7 +211,13 @@ impl FileBrowser {
if let Some(file) = selection {
list.select_file(&file);
}
- list.animate_slide_up().log();
+
+ list.refresh().log();
+
+ if startup {
+ list.animate_slide_up().log();
+ }
+
list.content.meta_all();
Ok(list)
}));
@@ -230,7 +237,13 @@ impl FileBrowser {
if let Some(file) = selection {
list.select_file(&file);
}
- list.animate_slide_up().log();
+
+ list.refresh().log();
+
+ if startup {
+ list.animate_slide_up().log();
+ }
+
Ok(list)
}));
let left_widget = FileBrowserWidgets::FileList(left_widget);
@@ -341,6 +354,7 @@ impl FileBrowser {
let mut list = ListView::new(&core, files);
list.content.meta_set_fresh().log();
+ list.content.meta_all();
if let Some(file) = selected_file {
list.select_file(&file);
@@ -351,9 +365,9 @@ impl FileBrowser {
if let Ok(grand_parent) = self.cwd()?.parent_as_file() {
self.left_widget_goto(&grand_parent).log();
} else {
- self.left_async_widget_mut()?.clear().log();
- Ok(self.screen()?.flush()?).log();
- self.left_async_widget_mut()?.set_stale().log();
+ self.left_async_widget_mut()?.change_to(Box::new(move |_,_| {
+ HError::stale()?
+ })).log();
}
Ok(())
@@ -455,34 +469,26 @@ impl FileBrowser {
Ok(())
}
- pub fn get_files(&self) -> HResult<Files> {
- Ok(self.main_widget()?.content.clone())
+ pub fn get_files(&self) -> HResult<&Files> {
+ Ok(&self.main_widget()?.content)
}
- pub fn get_left_files(&self) -> HResult<Files> {
- Ok(self.left_widget()?.content.clone())
+ pub fn get_left_files(&self) -> HResult<&Files> {
+ Ok(&self.left_widget()?.content)
}
- pub fn cache_files(&self) -> HResult<()> {
- if !self.fs_cache.is_cached(&self.cwd)? {
- let files = self.get_files()?;
- let selected_file = self.selected_file().ok();
- self.fs_cache.put_files(files, selected_file).log();
- } else {
- let files = &self.main_widget()?.content;
- let selected_file = self.selected_file().ok();
- self.fs_cache.save_settings(&files, selected_file).log();
- }
+ pub fn cache_files(&mut self) -> HResult<()> {
+ let files = self.get_files()?;
+ let selected_file = self.selected_file().ok();
+ self.fs_cache.put_files(files, selected_file).log();
+ self.main_widget_mut()?.content.meta_updated = false;
+
+
+ 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.fs_cache.is_cached(&self.left_widget()?.content.directory)? {
- 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();
- } else {
- let files = &self.left_widget()?.content;
- let selected_file = self.left_widget()?.clone_selected_file();
- self.fs_cache.save_settings(&files, Some(selected_file)).log();
- }
Ok(())
}
@@ -729,17 +735,23 @@ impl FileBrowser {
let count_xpos = xsize - file_count.len() as u16;
let count_ypos = ypos + self.get_coordinates()?.ysize();
- let status = format!("{} {}:{} {}{} {}{}{} {}{}",
+ let status = format!("{} {}:{} {}{} {}{}",
permissions,
user,
group,
crate::term::header_color(),
mtime,
crate::term::color_yellow(),
- target,
+ target
+ );
+ let status = crate::term::sized_string_u(&status, (xsize-1) as usize);
+
+ let status = format!("{}{}{}{}",
+ status,
crate::term::header_color(),
crate::term::goto_xy(count_xpos, count_ypos),
file_count);
+
Ok(status)
}
}
@@ -783,8 +795,9 @@ impl Widget for FileBrowser {
Ok(sized_path)
}
fn render_footer(&self) -> HResult<String> {
+ let xsize = term::xsize_u();
match self.get_core()?.status_bar_content.lock()?.as_mut().take() {
- Some(status) => Ok(status.clone()),
+ Some(status) => Ok(term::sized_string_u(&status, xsize)),
_ => { self.get_footer() },
}
}
diff --git a/src/files.rs b/src/files.rs
index 7af7551..aa0fa72 100644
--- a/src/files.rs
+++ b/src/files.rs
@@ -79,6 +79,7 @@ pub struct Files {
pub directory: File,
pub files: Vec<File>,
pub meta_upto: Option<usize>,
+ pub meta_updated: bool,
pub sort: SortBy,
pub dirs_first: bool,
pub reverse: bool,
@@ -133,6 +134,7 @@ impl Files {
directory: File::new_from_path(&path, None)?,
files: files,
meta_upto: None,
+ meta_updated: false,
sort: SortBy::Name,
dirs_first: true,
reverse: false,
@@ -189,6 +191,7 @@ impl Files {
directory: File::new_from_path(&path, None)?,
files: files,
meta_upto: None,
+ meta_updated: false,
sort: SortBy::Name,
dirs_first: true,
reverse: false,
@@ -358,6 +361,7 @@ impl Files {
}
}
self.set_dirty();
+ self.meta_updated = true;
Ok(())
}
@@ -386,10 +390,10 @@ impl Files {
for file in self.files.iter_mut().take(meta_files) {
if !file.meta_processed {
- file.take_meta(&meta_pool).ok();
+ file.take_meta(&meta_pool, &mut self.meta_updated).ok();
}
- if file.is_dir() && file.meta_processed {
- file.take_dirsize(&meta_pool).ok();
+ if file.is_dir() {
+ file.take_dirsize(&meta_pool, &mut self.meta_updated).ok();
}
}
@@ -618,12 +622,14 @@ impl File {
self.meta.get()
}
- fn take_dirsize(&mut self, pool: &ThreadPool) -> HResult<()> {
+ fn take_dirsize(&mut self,
+ pool: &ThreadPool,
+ meta_updated: &mut bool) -> HResult<()> {
let dirsize = self.dirsize.as_mut()?;
if let Ok(_) = dirsize.value { return Ok(()) }
match dirsize.take_async() {
- Ok(_) => {},
+ Ok(_) => { *meta_updated = true; },
Err(HError::AsyncNotReadyError) => { dirsize.run_pooled(&*pool).ok(); },
Err(HError::AsyncAlreadyTakenError) => {},
Err(HError::NoneError) => {},
@@ -632,11 +638,13 @@ impl File {
Ok(())
}
- pub fn take_meta(&mut self, pool: &ThreadPool) -> HResult<()> {
+ pub fn take_meta(&mut self,
+ pool: &ThreadPool,
+ meta_updated: &mut bool) -> HResult<()> {
if self.meta_processed { return Ok(()) }
match self.meta.take_async() {
- Ok(_) => {},
+ Ok(_) => { *meta_updated = true; },
Err(HError::AsyncNotReadyError) => { self.meta.run_pooled(&*pool).ok(); },
Err(HError::AsyncAlreadyTakenError) => {},
Err(HError::NoneError) => {},
diff --git a/src/fscache.rs b/src/fscache.rs
index c650dff..8e33d44 100644
--- a/src/fscache.rs
+++ b/src/fscache.rs
@@ -8,7 +8,6 @@ use std::path::PathBuf;
use crate::preview::{Async, Stale};
use crate::files::{Files, File, SortBy};
-use crate::dirty::*;
use crate::widget::Events;
use crate::fail::{HResult, HError, ErrorLog};
@@ -115,7 +114,6 @@ impl FsCache {
} else {
self.add_watch(&dir).log();
let dir = dir.clone();
- let cache = self.files.clone();
let files = Async::new(Box::new(move |_| {
let files = Files::new_from_path_cancellable(&dir.path, stale)?;
Ok(files)
@@ -125,7 +123,7 @@ impl FsCache {
}
pub fn get_files_sync(&self, dir: &File) -> HResult<Files> {
- let mut files = self.get_files(&dir, Stale::new())?.1;
+ let files = self.get_files(&dir, Stale::new())?.1;
files.wait()
}
@@ -140,7 +138,7 @@ impl FsCache {
Ok(())
}
- pub fn put_files(&self, files: Files, selection: Option<File>) -> HResult<()> {
+ pub fn put_files(&self, files: &Files, selection: Option<File>) -> HResult<()> {
let dir = files.directory.clone();
let tab_settings = FsCache::extract_tab_settings(&files, selection);
@@ -149,8 +147,14 @@ impl FsCache {
let mut file_cache = self.files.write()?;
- if !file_cache.contains_key(&files.directory) {
- file_cache.insert(dir, files);
+ if file_cache.contains_key(&files.directory) {
+ if files.meta_updated {
+ let mut files = files.clone();
+ files.meta_updated = false;
+ file_cache.insert(dir, files);
+ }
+ } else {
+ file_cache.insert(dir, files.clone());
}
Ok(())
diff --git a/src/preview.rs b/src/preview.rs
index b740215..2d503c8 100644
--- a/src/preview.rs
+++ b/src/preview.rs
@@ -551,7 +551,7 @@ impl Previewer {
if is_stale(&stale)? { return Previewer::preview_failed(&file) }
- let output = process.wait_with_output()?;
+ let output = dbg!(process.wait_with_output())?;
if is_stale(&stale)? { return Previewer::preview_failed(&file) }
{
@@ -559,10 +559,9 @@ impl Previewer {
*pid_ = None;
}
- let status = output.status.code()
- .ok_or(HError::preview_failed(file)?);
+ let status = output.status.code()?;
- if status == Ok(0) || status == Ok(5) && !is_stale(&stale)? {
+ if !is_stale(&stale)? {
let output = std::str::from_utf8(&output.stdout)
.unwrap()
.to_string();
diff --git a/src/term.rs b/src/term.rs
index 81c1feb..7c63066 100644
--- a/src/term.rs
+++ b/src/term.rs
@@ -15,7 +15,8 @@ pub type TermMode = AlternateScreen<MouseTerminal<RawTerminal<BufWriter<Stdout>>
#[derive(Clone)]
pub struct Screen {
screen: Arc<Mutex<Option<TermMode>>>,
- size: Arc<RwLock<Option<(usize, usize)>>>
+ size: Arc<RwLock<Option<(usize, usize)>>>,
+ terminal: String
}
impl Screen {
@@ -23,11 +24,13 @@ impl Screen {
let screen = BufWriter::new(std::io::stdout()).into_raw_mode()?;
let mut screen = MouseTerminal::from(screen);
let mut screen = AlternateScreen::from(screen);
+ let terminal = std::env::var("TERM").unwrap_or("xterm".into());
screen.cursor_hide()?;
Ok(Screen {
screen: Arc::new(Mutex::new(Some(screen))),
- size: Arc::new(RwLock::new(None))
+ size: Arc::new(RwLock::new(None)),
+ terminal: terminal
})
}
@@ -58,6 +61,16 @@ impl Screen {
pub fn take_size(&self) -> HResult<(usize, usize)> {
Ok(self.size.write()?.take()?)
}
+
+ pub fn set_title(&mut self, title: &str) -> HResult<()> {
+ if !self.terminal.starts_with("rxvt") {
+ write!(self, "\x1b]2;hunter: {}", title)?;
+ }
+ if self.terminal.starts_with("tmux") {
+ write!(self, "\x1bkhunter: {}\x1b\\", title)?;
+ }
+ Ok(())
+ }
}
impl Write for Screen {
@@ -112,11 +125,6 @@ pub trait ScreenExt: Write {
let (_, ysize) = termion::terminal_size()?;
Ok((ysize - 1) as usize)
}
- fn set_title(&mut self, title: &str) -> HResult<()> {
- write!(self, "\x1b]2;hunter: {}", title)?;
- write!(self, "\x1bkhunter: {}\x1b\\", title)?;
- Ok(())
- }
fn to_main_screen(&mut self) -> HResult<()> {
write!(self, "{}", termion::screen::ToMainScreen)?;
self.flush()?;
@@ -132,6 +140,11 @@ pub fn xsize() -> u16 {
xsize
}
+pub fn xsize_u() -> usize {
+ let (xsize, _) = termion::terminal_size().unwrap();
+ xsize as usize - 1
+}
+
pub fn ysize() -> u16 {
let (_, ysize) = termion::terminal_size().unwrap();
ysize
@@ -195,6 +208,7 @@ pub fn sized_string_u(string: &str, xsize: usize) -> String {
padded
}
+
// Do these as constants
diff --git a/src/widget.rs b/src/widget.rs
index a58b0c7..4f400c6 100644
--- a/src/widget.rs
+++ b/src/widget.rs
@@ -164,7 +164,7 @@ pub trait Widget {
}
fn bad(&mut self, event: Event) -> HResult<()> {
- self.show_status(&format!("Stop the nasty stuff!! {:?} does nothing!", event))
+ self.show_status(&format!("Stop it!! {:?} does nothing!", event))
}
fn get_header_drawlist(&mut self) -> HResult<String> {
@@ -356,33 +356,29 @@ pub trait Widget {
}
fn draw_status(&self) -> HResult<()> {
- let xsize = term::xsize() as u16;
+ let xsize = term::xsize_u();
let status = match self.get_core()?.status_bar_content.lock()?.as_ref() {
Some(status) => status.to_string(),
None => "".to_string(),
};
+ let sized_status = term::sized_string_u(&status, xsize);
self.write_to_screen(
&format!(
- "{}{}{:xsize$}{}{}",
+ "{}{}{}",
term::move_bottom(),
term::status_bg(),
- " ",
- term::move_bottom(),
- status,
- xsize = xsize as usize
+ sized_status
)).log();
Ok(())
}
fn show_status(&self, status: &str) -> HResult<()> {
- let xsize = self.get_core()?.coordinates.xsize_u();
- let sized_status = term::sized_string_u(status, xsize);
HError::log::<()>(status.to_string()).log();
{
let mut status_content = self.get_core()?.status_bar_content.lock()?;
- *status_content = Some(sized_status);
+ *status_content = Some(status.to_string());
}
self.draw_status()?;
Ok(())