summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2019-05-30 22:15:35 -0400
committerJiayi Zhao <jeff.no.zhao@gmail.com>2019-05-30 22:15:35 -0400
commit70c8251b479e745edeb080058c1b95bf677684e1 (patch)
treea654e33e23fa6aa17ca8977807753209c312b39e /src
parent5980d762dba38b003dbe54506cdd58ee85f97c8c (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.rs26
-rw-r--r--src/commands/new_directory.rs10
-rw-r--r--src/commands/reload_dir.rs60
-rw-r--r--src/history.rs14
-rw-r--r--src/run.rs12
-rw-r--r--src/structs/dirlist.rs2
-rw-r--r--src/tab.rs44
-rw-r--r--src/window/page_state.rs2
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();
diff --git a/src/run.rs b/src/run.rs
index ef8a499..4d4053f 100644
--- a/src/run.rs
+++ b/src/run.rs
@@ -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 {
diff --git a/src/tab.rs b/src/tab.rs
index 5e9440e..27c04ee 100644
--- a/src/tab.rs
+++ b/src/tab.rs
@@ -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 {