diff options
author | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2019-05-30 22:15:35 -0400 |
---|---|---|
committer | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2019-05-30 22:15:35 -0400 |
commit | 70c8251b479e745edeb080058c1b95bf677684e1 (patch) | |
tree | a654e33e23fa6aa17ca8977807753209c312b39e /src | |
parent | 5980d762dba38b003dbe54506cdd58ee85f97c8c (diff) |
move reloading of directory content into reload_dir.rs rather than tab.rs
Diffstat (limited to 'src')
-rw-r--r-- | src/commands/delete_files.rs | 26 | ||||
-rw-r--r-- | src/commands/new_directory.rs | 10 | ||||
-rw-r--r-- | src/commands/reload_dir.rs | 60 | ||||
-rw-r--r-- | src/history.rs | 14 | ||||
-rw-r--r-- | src/run.rs | 12 | ||||
-rw-r--r-- | src/structs/dirlist.rs | 2 | ||||
-rw-r--r-- | src/tab.rs | 44 | ||||
-rw-r--r-- | src/window/page_state.rs | 2 |
8 files changed, 75 insertions, 95 deletions
diff --git a/src/commands/delete_files.rs b/src/commands/delete_files.rs index a742499..fe2472a 100644 --- a/src/commands/delete_files.rs +++ b/src/commands/delete_files.rs @@ -1,7 +1,7 @@ use std::fs; use std::path; -use crate::commands::{JoshutoCommand, JoshutoRunnable}; +use crate::commands::{JoshutoCommand, JoshutoRunnable, ReloadDirList}; use crate::config::keymap; use crate::context::JoshutoContext; use crate::error::JoshutoError; @@ -54,26 +54,10 @@ impl DeleteFiles { if ch == 'y' as i32 { Self::remove_files(paths)?; ui::wprint_msg(&view.bot_win, "Deleted files"); - - curr_tab.reload_contents(&context.config_t.sort_option)?; - - if let Some(s) = curr_tab.curr_list.index { - curr_tab.curr_list.pagestate.update_page_state( - s, - view.mid_win.rows, - curr_tab.curr_list.contents.len(), - context.config_t.scroll_offset, - ); - } - curr_tab.refresh_curr(&view.mid_win); - curr_tab.refresh_parent(&view.left_win, &context.config_t); - curr_tab.refresh_preview(&view.right_win, &context.config_t); + ReloadDirList::reload(context.curr_tab_index, context, view)?; } } } - curr_tab.refresh_file_status(&view.bot_win); - curr_tab.refresh_path_status(&view.top_win, context.config_t.tilde_in_titlebar); - ncurses::doupdate(); Ok(()) } } @@ -92,7 +76,11 @@ impl JoshutoRunnable for DeleteFiles { context: &mut JoshutoContext, view: &JoshutoView, ) -> Result<(), JoshutoError> { - match Self::delete_files(context, view) { + let res = Self::delete_files(context, view); + let curr_tab = &mut context.tabs[context.curr_tab_index]; + curr_tab.refresh(view, &context.config_t); + ncurses::doupdate(); + match res { Ok(_) => Ok(()), Err(e) => Err(JoshutoError::IO(e)), } diff --git a/src/commands/new_directory.rs b/src/commands/new_directory.rs index b388aa7..859aff9 100644 --- a/src/commands/new_directory.rs +++ b/src/commands/new_directory.rs @@ -39,11 +39,15 @@ impl JoshutoRunnable for NewDirectory { Err(e) => return Err(JoshutoError::IO(e)), } } - match ReloadDirList::reload(context, view) { - Ok(_) => {} + let res = ReloadDirList::reload(context.curr_tab_index, context, view); + match res { + Ok(_) => { + let curr_tab = &mut context.tabs[context.curr_tab_index]; + curr_tab.refresh(view, &context.config_t); + ncurses::doupdate(); + } Err(e) => return Err(JoshutoError::IO(e)), } - ncurses::doupdate(); Ok(()) } } diff --git a/src/commands/reload_dir.rs b/src/commands/reload_dir.rs index fc0dd78..bd7c913 100644 --- a/src/commands/reload_dir.rs +++ b/src/commands/reload_dir.rs @@ -1,8 +1,11 @@ use crate::commands::{JoshutoCommand, JoshutoRunnable}; use crate::context::JoshutoContext; use crate::error::JoshutoError; +use crate::structs::JoshutoDirList; use crate::window::JoshutoView; +use std::collections::hash_map::Entry; + #[derive(Clone, Debug)] pub struct ReloadDirList; @@ -14,20 +17,45 @@ impl ReloadDirList { "reload_dir_list" } - pub fn reload(context: &mut JoshutoContext, view: &JoshutoView) -> Result<(), std::io::Error> { - let curr_tab = &mut context.tabs[context.curr_tab_index]; - let dir_len = curr_tab.curr_list.contents.len(); - match curr_tab.curr_list.index { - None => {} - Some(s) => { - curr_tab.curr_list.pagestate.update_page_state( - s, - view.mid_win.rows, - dir_len, - context.config_t.scroll_offset, - ); - curr_tab.reload_contents(&context.config_t.sort_option)?; - curr_tab.refresh(view, &context.config_t); + pub fn reload( + index: usize, + context: &mut JoshutoContext, + view: &JoshutoView, + ) -> Result<(), std::io::Error> { + let curr_tab = &mut context.tabs[index]; + let sort_option = &context.config_t.sort_option; + curr_tab.curr_list.update_contents(sort_option)?; + if let Some(s) = curr_tab.curr_list.index { + let dir_len = curr_tab.curr_list.contents.len(); + curr_tab.curr_list.pagestate.update_page_state( + s, + view.mid_win.rows, + dir_len, + context.config_t.scroll_offset, + ); + curr_tab.curr_list.outdated = false; + } + + if let Some(parent) = curr_tab.curr_list.path.parent() { + match curr_tab.history.entry(parent.to_path_buf().clone()) { + Entry::Occupied(mut entry) => { + let dirlist = entry.get_mut(); + dirlist.update_contents(sort_option)?; + if let Some(s) = dirlist.index { + let dir_len = dirlist.contents.len(); + dirlist.pagestate.update_page_state( + s, + view.mid_win.rows, + dir_len, + context.config_t.scroll_offset, + ); + dirlist.outdated = false; + } + } + Entry::Vacant(entry) => { + let s = JoshutoDirList::new(parent.to_path_buf().clone(), sort_option)?; + entry.insert(s); + } } } Ok(()) @@ -48,8 +76,10 @@ impl JoshutoRunnable for ReloadDirList { context: &mut JoshutoContext, view: &JoshutoView, ) -> Result<(), JoshutoError> { - match Self::reload(context, view) { + match Self::reload(context.curr_tab_index, context, view) { Ok(_) => { + let curr_tab = &mut context.tabs[context.curr_tab_index]; + curr_tab.refresh(view, &context.config_t); ncurses::doupdate(); Ok(()) } diff --git a/src/history.rs b/src/history.rs index 0f604c3..cccb396 100644 --- a/src/history.rs +++ b/src/history.rs @@ -56,18 +56,18 @@ impl DirectoryHistory for JoshutoHistory { sort_option: &sort::SortOption, ) -> Result<JoshutoDirList, std::io::Error> { match self.remove(&path.to_path_buf()) { - Some(mut dir_entry) => { - if dir_entry.need_update() { - dir_entry.update_contents(&sort_option)? + Some(mut dirlist) => { + if dirlist.need_update() { + dirlist.update_contents(&sort_option)? } else { - let metadata = std::fs::symlink_metadata(&dir_entry.path)?; + let metadata = std::fs::symlink_metadata(&dirlist.path)?; let modified = metadata.modified()?; - if modified > dir_entry.metadata.modified { - dir_entry.update_contents(&sort_option)? + if modified > dirlist.metadata.modified { + dirlist.update_contents(&sort_option)? } } - Ok(dir_entry) + Ok(dirlist) } None => { let path_clone = path.to_path_buf(); @@ -1,7 +1,7 @@ use std::process; use std::time; -use crate::commands::{CommandKeybind, FileOperationThread, JoshutoCommand}; +use crate::commands::{CommandKeybind, FileOperationThread, JoshutoCommand, ReloadDirList}; use crate::config::{self, JoshutoConfig, JoshutoKeymap}; use crate::context::JoshutoContext; use crate::error::JoshutoError; @@ -63,16 +63,16 @@ fn join_thread( } Ok(_) => { if tab_src < context.tabs.len() { - let dirty_tab = &mut context.tabs[tab_src]; - dirty_tab.reload_contents(&context.config_t.sort_option)?; + ReloadDirList::reload(tab_src, context, view)?; if tab_src == context.curr_tab_index { + let dirty_tab = &mut context.tabs[tab_src]; dirty_tab.refresh(view, &context.config_t); } } if tab_dest != tab_src && tab_dest < context.tabs.len() { - let dirty_tab = &mut context.tabs[tab_dest]; - dirty_tab.reload_contents(&context.config_t.sort_option)?; - if tab_dest == context.curr_tab_index { + ReloadDirList::reload(tab_dest, context, view)?; + if tab_src == context.curr_tab_index { + let dirty_tab = &mut context.tabs[tab_dest]; dirty_tab.refresh(view, &context.config_t); } } diff --git a/src/structs/dirlist.rs b/src/structs/dirlist.rs index 277fe9d..6676b4c 100644 --- a/src/structs/dirlist.rs +++ b/src/structs/dirlist.rs @@ -9,10 +9,10 @@ use crate::window::JoshutoPageState; pub struct JoshutoDirList { pub index: Option<usize>, pub path: path::PathBuf, + pub outdated: bool, pub metadata: JoshutoMetadata, pub contents: Vec<JoshutoDirEntry>, pub pagestate: JoshutoPageState, - outdated: bool, } impl JoshutoDirList { @@ -1,4 +1,3 @@ -use std::collections::{hash_map::Entry, HashMap}; use std::path::PathBuf; use crate::config; @@ -21,7 +20,7 @@ pub struct JoshutoTab { impl JoshutoTab { pub fn new(curr_path: PathBuf, sort_option: &sort::SortOption) -> Result<Self, std::io::Error> { - let mut history = HashMap::new(); + let mut history = JoshutoHistory::new(); history.populate_to_root(&curr_path, sort_option); let curr_list = history.pop_or_create(&curr_path, sort_option)?; @@ -34,47 +33,6 @@ impl JoshutoTab { Ok(tab) } - pub fn reload_contents( - &mut self, - sort_option: &sort::SortOption, - ) -> Result<(), std::io::Error> { - if self.curr_list.path.exists() { - self.curr_list.update_contents(sort_option)?; - } - if let Some(s) = self.curr_list.get_curr_ref() { - if s.path.is_dir() { - match self.history.entry(s.path.clone().to_path_buf()) { - Entry::Occupied(mut entry) => { - let dirlist = entry.get_mut(); - if dirlist.need_update() { - dirlist.update_contents(sort_option)?; - } - } - Entry::Vacant(entry) => { - let s = JoshutoDirList::new(s.path.clone().to_path_buf(), sort_option)?; - entry.insert(s); - } - } - } - } - - if let Some(parent) = self.curr_list.path.parent() { - match self.history.entry(parent.to_path_buf().clone()) { - Entry::Occupied(mut entry) => { - let dirlist = entry.get_mut(); - if dirlist.need_update() { - dirlist.update_contents(sort_option)?; - } - } - Entry::Vacant(entry) => { - let s = JoshutoDirList::new(parent.to_path_buf().clone(), sort_option)?; - entry.insert(s); - } - } - } - Ok(()) - } - pub fn refresh(&mut self, views: &JoshutoView, config_t: &config::JoshutoConfig) { self.refresh_curr(&views.mid_win); self.refresh_parent(&views.left_win, config_t); diff --git a/src/window/page_state.rs b/src/window/page_state.rs index cf4756e..f288a7c 100644 --- a/src/window/page_state.rs +++ b/src/window/page_state.rs @@ -16,7 +16,7 @@ impl JoshutoPageState { vec_len: usize, offset: usize, ) { - if self.end != win_rows as usize + self.start { + if self.end != self.start + win_rows as usize { self.end = self.start + win_rows as usize; } if self.end > vec_len { |