summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2019-01-13 10:49:39 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2019-01-13 10:49:45 -0500
commit280d2ff401e5b0fd9df0a2dfbe6ef3c138963caf (patch)
tree984bd332fb77940e7848c0d77aa6667c10d9af47
parent3a482adec669fbbd901ba052ec53251ce56506b5 (diff)
major refactoring
- completely remove preview_list and all references - instead use preview.rs to grab struct from hashmap at runtime - this allows for file previews to be implemented easier and more seamlessly - add JoshutoPageState struct for scrolling - previously cursor would stick at position 6 and won't move until reaching the top or bottom of dirlisting - now they stick to the current page and only move when they hit the threshold provided in settings
-rw-r--r--src/joshuto.rs51
-rw-r--r--src/joshuto/command/change_directory.rs27
-rw-r--r--src/joshuto/command/cursor_move.rs70
-rw-r--r--src/joshuto/command/file_operation.rs33
-rw-r--r--src/joshuto/command/new_directory.rs3
-rw-r--r--src/joshuto/command/open_file.rs52
-rw-r--r--src/joshuto/command/parent_directory.rs58
-rw-r--r--src/joshuto/command/reload_dir.rs4
-rw-r--r--src/joshuto/command/show_hidden.rs6
-rw-r--r--src/joshuto/command/tab_switch.rs2
-rw-r--r--src/joshuto/history.rs29
-rw-r--r--src/joshuto/preview.rs27
-rw-r--r--src/joshuto/structs.rs60
-rw-r--r--src/joshuto/ui.rs82
14 files changed, 255 insertions, 249 deletions
diff --git a/src/joshuto.rs b/src/joshuto.rs
index 2e44735..17ae3e2 100644
--- a/src/joshuto.rs
+++ b/src/joshuto.rs
@@ -13,6 +13,7 @@ pub mod config;
mod command;
mod history;
mod input;
+mod preview;
mod sort;
mod structs;
mod ui;
@@ -27,7 +28,6 @@ pub struct JoshutoTab {
pub curr_path: path::PathBuf,
pub parent_list: Option<structs::JoshutoDirList>,
pub curr_list: Option<structs::JoshutoDirList>,
- pub preview_list: Option<structs::JoshutoDirList>,
}
impl JoshutoTab {
@@ -38,7 +38,7 @@ impl JoshutoTab {
history.populate_to_root(&curr_path, sort_type);
/* load up directories */
- let curr_view: Option<structs::JoshutoDirList> =
+ let curr_list: Option<structs::JoshutoDirList> =
match history.pop_or_create(&curr_path, sort_type) {
Ok(s) => { Some(s) },
Err(e) => {
@@ -47,7 +47,7 @@ impl JoshutoTab {
},
};
- let parent_view: Option<structs::JoshutoDirList> =
+ let parent_list: Option<structs::JoshutoDirList> =
match curr_path.parent() {
Some(parent) => {
match history.pop_or_create(&parent, sort_type) {
@@ -61,33 +61,11 @@ impl JoshutoTab {
None => { None },
};
- let preview_view: Option<structs::JoshutoDirList>;
- if let Some(s) = curr_view.as_ref() {
- match s.get_curr_entry() {
- Some(dirent) => {
- if dirent.path.is_dir() {
- preview_view = match history.pop_or_create(&dirent.path, sort_type) {
- Ok(s) => Some(s),
- Err(_) => None,
- };
- } else {
- preview_view = None;
- }
- },
- None => {
- preview_view = None;
- }
- }
- } else {
- preview_view = None
- }
-
JoshutoTab {
curr_path,
history,
- curr_list: curr_view,
- parent_list: parent_view,
- preview_list: preview_view,
+ curr_list,
+ parent_list,
}
}
}
@@ -158,18 +136,6 @@ impl<'a> JoshutoContext<'a> {
if gone {
self.tabs[self.tab_index].parent_list = None;
}
-
- let mut gone = false;
- if let Some(s) = self.tabs[self.tab_index].preview_list.as_mut() {
- if !s.path.exists() {
- gone = true;
- } else if s.need_update() {
- s.update(&self.config_t.sort_type);
- }
- }
- if gone {
- self.tabs[self.tab_index].preview_list = None;
- }
}
}
@@ -223,7 +189,7 @@ pub fn resize_handler(context: &mut JoshutoContext)
{
context.views.redraw_views();
ncurses::refresh();
- ui::refresh(&context);
+ ui::refresh(context);
ui::redraw_tab_view(&context.views.tab_win, &context);
ncurses::doupdate();
}
@@ -234,12 +200,13 @@ pub fn run(mut config_t: config::JoshutoConfig,
theme_t: config::JoshutoTheme)
{
ui::init_ncurses(&theme_t);
-
ncurses::doupdate();
let mut context = JoshutoContext::new(&mut config_t, &mimetype_t, &theme_t);
-
command::NewTab::new_tab(&mut context);
+ preview::preview_file(&mut context);
+ ui::refresh(&mut context);
+ ncurses::doupdate();
let wait_duration: time::Duration = time::Duration::from_millis(100);
diff --git a/src/joshuto/command/change_directory.rs b/src/joshuto/command/change_directory.rs
index 14bd192..ec3be8e 100644
--- a/src/joshuto/command/change_directory.rs
+++ b/src/joshuto/command/change_directory.rs
@@ -62,28 +62,11 @@ impl command::Runnable for ChangeDirectory {
let curr_list = curr_tab.curr_list.take();
curr_tab.history.put_back(curr_list);
-
- let preview_list = curr_tab.preview_list.take();
- curr_tab.history.put_back(preview_list);
}
curr_tab.curr_list = match curr_tab.history.pop_or_create(&curr_tab.curr_path,
&context.config_t.sort_type) {
Ok(s) => {
- if let Some(dirent) = s.get_curr_entry() {
- if dirent.path.is_dir() {
- curr_tab.preview_list = match curr_tab.history.pop_or_create(
- &dirent.path, &context.config_t.sort_type) {
- Ok(s) => {
- Some(s)
- },
- Err(e) => {
- eprintln!("{}", e);
- None
- },
- };
- }
- }
Some(s)
},
Err(e) => {
@@ -102,12 +85,10 @@ impl command::Runnable for ChangeDirectory {
};
}
- ui::redraw_view(&context.theme_t, &context.views.left_win,
- curr_tab.parent_list.as_ref());
- ui::redraw_view_detailed(&context.theme_t, &context.views.mid_win,
- curr_tab.curr_list.as_ref());
- ui::redraw_view(&context.theme_t, &context.views.right_win,
- curr_tab.preview_list.as_ref());
+ ui::redraw_view(&context.config_t, &context.theme_t,
+ &context.views.left_win, curr_tab.parent_list.as_mut());
+ ui::redraw_view_detailed(&context.config_t, &context.theme_t,
+ &context.views.mid_win, curr_tab.curr_list.as_mut());
ui::redraw_status(&context.theme_t, &context.views,
curr_tab.curr_list.as_ref(),
diff --git a/src/joshuto/command/cursor_move.rs b/src/joshuto/command/cursor_move.rs
index f8496ee..775ac28 100644
--- a/src/joshuto/command/cursor_move.rs
+++ b/src/joshuto/command/cursor_move.rs
@@ -6,8 +6,8 @@ use std::fmt;
use joshuto;
use joshuto::ui;
-
use joshuto::command;
+use joshuto::preview;
#[derive(Clone, Debug)]
pub struct CursorMove {
@@ -25,62 +25,42 @@ impl CursorMove {
pub fn cursor_move(new_index: i32, context: &mut joshuto::JoshutoContext)
{
- let curr_tab = &mut context.tabs[context.tab_index];
-
- if let Some(ref mut curr_list) = curr_tab.curr_list {
- let curr_index = curr_list.index;
- let dir_len = curr_list.contents.len() as i32;
+ {
+ let curr_tab = &mut context.tabs[context.tab_index];
- let mut new_index = new_index;
- if new_index <= 0 {
- new_index = 0;
- if curr_index <= 0 {
- return;
- }
- } else if new_index >= dir_len {
- new_index = dir_len - 1;
- if curr_index == dir_len - 1 {
- return;
+ if let Some(ref mut curr_list) = curr_tab.curr_list {
+ let curr_index = curr_list.index;
+ let dir_len = curr_list.contents.len() as i32;
+
+ let mut new_index = new_index;
+ if new_index <= 0 {
+ new_index = 0;
+ if curr_index <= 0 {
+ return;
+ }
+ } else if new_index >= dir_len {
+ new_index = dir_len - 1;
+ if curr_index == dir_len - 1 {
+ return;
+ }
}
- }
- let dir_list = curr_tab.preview_list.take();
- if let Some(s) = dir_list {
- curr_tab.history.insert(s);
+ curr_list.index = new_index;
}
- curr_list.index = new_index;
- }
-
- if let Some(ref curr_list) = curr_tab.curr_list {
- let curr_index = curr_list.index as usize;
- let new_path = &curr_list.contents[curr_index].path;
-
- ui::display_contents(&context.theme_t, &context.views.mid_win, curr_list);
- ncurses::wnoutrefresh(context.views.mid_win.win);
-
- if new_path.is_dir() {
- match curr_tab.history.pop_or_create(new_path.as_path(),
- &context.config_t.sort_type) {
- Ok(s) => {
- curr_tab.preview_list = Some(s);
- ui::redraw_view(&context.theme_t, &context.views.right_win,
- curr_tab.preview_list.as_ref());
- },
- Err(e) => ui::wprint_err(&context.views.right_win, e.to_string().as_str()),
- }
- } else {
- ncurses::werase(context.views.right_win.win);
- ncurses::wnoutrefresh(context.views.right_win.win);
+ if let Some(ref mut curr_list) = curr_tab.curr_list {
+ ui::display_contents(&context.config_t, &context.theme_t, &context.views.mid_win, curr_list);
}
-
ui::redraw_status(&context.theme_t, &context.views,
curr_tab.curr_list.as_ref(),
&curr_tab.curr_path,
&context.username, &context.hostname);
- ncurses::doupdate();
+ ncurses::wnoutrefresh(context.views.mid_win.win);
}
+
+ preview::preview_file(context);
+ ncurses::doupdate();
}
}
diff --git a/src/joshuto/command/file_operation.rs b/src/joshuto/command/file_operation.rs
index d6b3ef8..27477df 100644
--- a/src/joshuto/command/file_operation.rs
+++ b/src/joshuto/command/file_operation.rs
@@ -215,7 +215,6 @@ impl PasteFiles {
}
0
});
-
(rx, child)
}
}
@@ -239,18 +238,20 @@ impl std::fmt::Debug for PasteFiles {
impl command::Runnable for PasteFiles {
fn execute(&self, context: &mut joshuto::JoshutoContext)
{
- let file_operation = fileop.lock().unwrap();
+ {
+ let file_operation = fileop.lock().unwrap();
- let curr_tab = &context.tabs[context.tab_index];
- let cprocess = match *file_operation {
- FileOp::Copy => self.copy(&curr_tab.curr_path),
- FileOp::Cut => self.cut(&curr_tab.curr_path),
- };
- context.threads.push(cprocess);
+ let curr_tab = &context.tabs[context.tab_index];
+ let cprocess = match *file_operation {
+ FileOp::Copy => self.copy(&curr_tab.curr_path),
+ FileOp::Cut => self.cut(&curr_tab.curr_path),
+ };
+ context.threads.push(cprocess);
+ }
ncurses::timeout(0);
- ui::refresh(&context);
+ ui::refresh(context);
ncurses::doupdate();
}
@@ -304,13 +305,11 @@ impl command::Runnable for DeleteFiles {
ui::wprint_msg(&context.views.bot_win, "Deleted files");
- let curr_tab = &context.tabs[context.tab_index];
- ui::redraw_view(&context.theme_t, &context.views.left_win,
- curr_tab.parent_list.as_ref());
- ui::redraw_view_detailed(&context.theme_t, &context.views.mid_win,
- curr_tab.curr_list.as_ref());
- ui::redraw_view(&context.theme_t, &context.views.right_win,
- curr_tab.preview_list.as_ref());
+ let curr_tab = &mut context.tabs[context.tab_index];
+ ui::redraw_view(&context.config_t, &context.theme_t,
+ &context.views.left_win, curr_tab.parent_list.as_mut());
+ ui::redraw_view_detailed(&context.config_t, &context.theme_t,
+ &context.views.mid_win, curr_tab.curr_list.as_mut());
} else {
let curr_tab = &context.tabs[context.tab_index];
ui::redraw_status(&context.theme_t, &context.views,
@@ -373,7 +372,7 @@ impl RenameFile {
match fs::rename(&path, &new_path) {
Ok(_) => {
context.reload_dirlists();
- ui::refresh(&context);
+ ui::refresh(context);
},
Err(e) => {
ui::wprint_err(&context.views.bot_win, e.to_string().as_str());
diff --git a/src/joshuto/command/new_directory.rs b/src/joshuto/command/new_directory.rs
index 0cdd407..c3beacf 100644
--- a/src/joshuto/command/new_directory.rs
+++ b/src/joshuto/command/new_directory.rs
@@ -49,8 +49,7 @@ impl command::Runnable for NewDirectory {
match std::fs::create_dir_all(&path) {
Ok(_) => {
- context.reload_dirlists();
- ui::refresh(&context);
+ command::ReloadDirList::reload(context);
},
Err(e) => {
ui::wprint_err(&context.views.bot_win, e.to_string().as_str());
diff --git a/src/joshuto/command/open_file.rs b/src/joshuto/command/open_file.rs
index 27b5cf5..dd05756 100644
--- a/src/joshuto/command/open_file.rs
+++ b/src/joshuto/command/open_file.rs
@@ -11,7 +11,7 @@ use joshuto;
use joshuto::command;
use joshuto::input;
use joshuto::config::mimetype;
-use joshuto::structs;
+use joshuto::preview;
use joshuto::ui;
use joshuto::unix;
use joshuto::window;
@@ -56,6 +56,8 @@ impl OpenFile {
} else if paths[0].is_dir() {
Self::into_directory(&paths[0], context);
+ preview::preview_file(context);
+ ncurses::doupdate();
}
}
@@ -72,16 +74,21 @@ impl OpenFile {
}
{
- let dir_list = curr_tab.parent_list.take();
- curr_tab.history.put_back(dir_list);
+ let parent_list = curr_tab.parent_list.take();
+ curr_tab.history.put_back(parent_list);
let curr_list = curr_tab.curr_list.take();
curr_tab.parent_list = curr_list;
-
- let preview_list = curr_tab.preview_list.take();
- curr_tab.curr_list = preview_list;
}
+ curr_tab.curr_list = match curr_tab.history.pop_or_create(&path, &context.config_t.sort_type) {
+ Ok(s) => Some(s),
+ Err(e) => {
+ ui::wprint_err(&context.views.left_win, e.to_string().as_str());
+ None
+ },
+ };
+
/* update curr_path */
match path.strip_prefix(curr_tab.curr_path.as_path()) {
Ok(s) => curr_tab.curr_path.push(s),
@@ -91,40 +98,15 @@ impl OpenFile {
}
}
- if let Some(s) = curr_tab.curr_list.as_ref() {
- if s.contents.len() > 0 {
- let dirent: &structs::JoshutoDirEntry = &s.contents[s.index as usize];
- let new_path: path::PathBuf = dirent.path.clone();
-
- if new_path.is_dir() {
- curr_tab.preview_list = match curr_tab.history.pop_or_create(
- new_path.as_path(), &context.config_t.sort_type) {
- Ok(s) => { Some(s) },
- Err(e) => {
- ui::wprint_err(&context.views.right_win,
- e.to_string().as_str());
- None
- },
- };
- } else {
- ncurses::werase(context.views.right_win.win);
- }
- }
- }
-
- ui::redraw_view(&context.theme_t, &context.views.left_win,
- curr_tab.parent_list.as_ref());
- ui::redraw_view_detailed(&context.theme_t, &context.views.mid_win,
- curr_tab.curr_list.as_ref());
- ui::redraw_view(&context.theme_t, &context.views.right_win,
- curr_tab.preview_list.as_ref());
+ ui::redraw_view(&context.config_t, &context.theme_t,
+ &context.views.left_win, curr_tab.parent_list.as_mut());
+ ui::redraw_view_detailed(&context.config_t, &context.theme_t,
+ &context.views.mid_win, curr_tab.curr_list.as_mut());
ui::redraw_status(&context.theme_t, &context.views,
curr_tab.curr_list.as_ref(),
&curr_tab.curr_path,
&context.username, &context.hostname);
-
- ncurses::doupdate();
}
}
diff --git a/src/joshuto/command/parent_directory.rs b/src/joshuto/command/parent_directory.rs
index c11eac7..912394f 100644
--- a/src/joshuto/command/parent_directory.rs
+++ b/src/joshuto/command/parent_directory.rs
@@ -6,8 +6,9 @@ use std;
use std::fmt;
use joshuto;
-use joshuto::ui;
use joshuto::command;
+use joshuto::preview;
+use joshuto::ui;
#[derive(Clone, Debug)]
pub struct ParentDirectory;
@@ -15,35 +16,19 @@ pub struct ParentDirectory;
impl ParentDirectory {
pub fn new() -> Self { ParentDirectory }
pub fn command() -> &'static str { "parent_directory" }
-}
-
-impl command::JoshutoCommand for ParentDirectory {}
-impl std::fmt::Display for ParentDirectory {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
+ pub fn parent_directory(context: &mut joshuto::JoshutoContext) -> bool
{
- f.write_str(Self::command())
- }
-}
-
-impl command::Runnable for ParentDirectory {
- fn execute(&self, context: &mut joshuto::JoshutoContext)
- {
-
let curr_tab = &mut context.tabs[context.tab_index];
-
if curr_tab.curr_path.pop() == false {
- return;
+ return false;
}
match std::env::set_current_dir(&curr_tab.curr_path) {
Ok(_) => {
{
- let dir_list = curr_tab.preview_list.take();
- curr_tab.history.put_back(dir_list);
-
let curr_list = curr_tab.curr_list.take();
- curr_tab.preview_list = curr_list;
+ curr_tab.history.put_back(curr_list);
let parent_list = curr_tab.parent_list.take();
curr_tab.curr_list = parent_list;
@@ -65,22 +50,41 @@ impl command::Runnable for ParentDirectory {
},
}
- ui::redraw_view(&context.theme_t, &context.views.left_win,
- curr_tab.parent_list.as_ref());
- ui::redraw_view_detailed(&context.theme_t, &context.views.mid_win,
- curr_tab.curr_list.as_ref());
- ui::redraw_view(&context.theme_t, &context.views.right_win,
- curr_tab.preview_list.as_ref());
+ ui::redraw_view(&context.config_t, &context.theme_t,
+ &context.views.left_win, curr_tab.parent_list.as_mut());
+ ui::redraw_view_detailed(&context.config_t, &context.theme_t,
+ &context.views.mid_win, curr_tab.curr_list.as_mut());
ui::redraw_status(&context.theme_t, &context.views,
curr_tab.curr_list.as_ref(),
&curr_tab.curr_path,
&context.username, &context.hostname);
+ return true;
},
Err(e) => {
ui::wprint_err(&context.views.bot_win, e.to_string().as_str());
+ return false;
},
};
- ncurses::doupdate();
+
+ }
+}
+
+impl command::JoshutoCommand for ParentDirectory {}
+
+impl std::fmt::Display for ParentDirectory {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
+ {
+ f.write_str(Self::command())
+ }
+}
+
+impl command::Runnable for ParentDirectory {
+ fn execute(&self, context: &mut joshuto::JoshutoContext)
+ {
+ if Self::parent_directory(context) {
+ preview::preview_file(context);
+ ncurses::doupdate();
+ }
}
}
diff --git a/src/joshuto/command/reload_dir.rs b/src/joshuto/command/reload_dir.rs
index c262359..e597e79 100644
--- a/src/joshuto/command/reload_dir.rs
+++ b/src/joshuto/command/reload_dir.rs
@@ -19,8 +19,7 @@ impl ReloadDirList {
pub fn reload(context: &mut joshuto::JoshutoContext)
{
context.reload_dirlists();
- ui::refresh(&context);
- ncurses::doupdate();
+ ui::refresh(context);
}
}
@@ -37,5 +36,6 @@ impl command::Runnable for ReloadDirList {
fn execute(&self, context: &mut joshuto::JoshutoContext)
{
Self::reload(context);
+ ncurses::doupdate();
}
}
diff --git a/src/joshuto/command/show_hidden.rs b/src/joshuto/command/show_hidden.rs
index 853c7b7..47944ea 100644
--- a/src/joshuto/command/show_hidden.rs
+++ b/src/joshuto/command/show_hidden.rs
@@ -38,17 +38,13 @@ impl command::Runnable for ToggleHiddenFiles {
s.update(&context.config_t.sort_type);
}
- if let Some(s) = tab.preview_list.as_mut() {
- s.update(&context.config_t.sort_type);
- }
-
if let Some(s) = tab.parent_list.as_mut() {
s.update(&context.config_t.sort_type);
}
}
}
- ui::refresh(&context);
+ ui::refresh(context);
ncurses::doupdate();
}
diff --git a/src/joshuto/command/tab_switch.rs b/src/joshuto/command/tab_switch.rs
index 4c38fa0..577ea34 100644
--- a/src/joshuto/command/tab_switch.rs
+++ b/src/joshuto/command/tab_switch.rs
@@ -21,7 +21,7 @@ impl TabSwitch {
pub fn tab_switch(new_index: i32, context: &mut joshuto::JoshutoContext)
{
context.tab_index = new_index as usize;
- ui::refresh(&context);
+ ui::refresh(context);
ui::redraw_tab_view(&context.views.tab_win, &context);
ncurses::doupdate();
diff --git a/src/joshuto/history.rs b/src/joshuto/history.rs
index 58445ef..dbf2f68 100644
--- a/src/joshuto/history.rs
+++ b/src/joshuto/history.rs
@@ -4,6 +4,7 @@ use std::path;
use joshuto::structs;
use joshuto::sort;
+use std::collections::hash_map::Entry;
pub struct DirHistory {
map: HashMap<path::PathBuf, structs::JoshutoDirList>,
@@ -67,6 +68,34 @@ impl DirHistory {
}
}
+ pub fn get_mut_or_create(&mut self, path: &path::Path,
+ sort_type: &sort::SortType)
+ -> Option<&mut structs::JoshutoDirList>
+ {
+ let pathbuf = path.to_path_buf();
+
+ {
+ let entry = self.map.entry(pathbuf.clone());
+ match entry {
+ Entry::Occupied(mut entry) => {
+ {
+ let dir_entry = entry.get_mut();
+ if dir_entry.need_update() {
+ dir_entry.update(sort_type);
+ }
+ }
+ },
+ Entry::Vacant(entry) => {
+ if let Ok(s) = structs::JoshutoDirList::new(path.clone().to_path_buf(), &sort_type) {
+ entry.insert(s);
+ }
+ },
+ };
+ }
+
+ self.map.get_mut(&pathbuf)
+ }
+
pub fn put_back(&mut self, dirlist: Option<structs::JoshutoDirList>)
{
if let Some(s) = dirlist {
diff --git a/src/joshuto/preview.rs b/src/joshuto/preview.rs
new file mode 100644
index 0000000..5136949
--- /dev/null
+++ b/src/joshuto/preview.rs
@@ -0,0 +1,27 @@
+extern crate ncurses;
+
+use joshuto;
+use joshuto::ui;
+
+pub fn preview_file(context: &mut joshuto::JoshutoContext)
+{
+ let curr_tab = &mut context.tabs[context.tab_index];
+
+ if let Some(ref curr_list) = curr_tab.curr_list {
+ if let Some(entry) = curr_list.get_curr_entry() {
+ if entry.path.is_dir() {
+ if let Some(dirlist) = curr_tab.history.get_mut_or_create(&entry.path, &context.config_t.sort_type) {
+ ui::display_contents(&context.config_t, &context.theme_t, &context.views.right_win, dirlist);
+ } else {
+ ncurses::werase(context.views.right_win.win);
+ ncurses::waddstr(context.views.right_win.win, "Can't find direntry");
+ ncurses::wnoutrefresh(context.views.right_win.win);
+ }
+ } else {
+ ncurses::werase(context.views.right_win.win);
+ ncurses::waddstr(context.views.right_win.win, "Not a directory");
+ ncurses::wnoutrefresh(context.views.right_win.win);
+ }
+ }
+ }
+}
diff --git a/src/joshuto/structs.rs b/src/joshuto/structs.rs
index b2da9ca..7cbbcad 100644
--- a/src/joshuto/structs.rs
+++ b/src/joshuto/structs.rs
@@ -6,7 +6,7 @@ use std::time;
use joshuto::sort;
-#[derive(Debug)]
+#[derive(Clone, Debug)]
pub struct JoshutoMetadata {
pub len: u64,
pub modified: time::SystemTime,
@@ -31,7 +31,7 @@ impl JoshutoMetadata {
}
}
-#[derive(Debug)]
+#[derive(Clone, Debug)]
pub struct JoshutoDirEntry {
pub file_name: ffi::OsString,
pub file_name_as_string: String,
@@ -65,6 +65,57 @@ impl JoshutoDirEntry {
}
+#[derive(Clone, Debug)]
+pub struct JoshutoPageState {
+ pub start: usize,
+ pub end: usize,
+}
+
+impl JoshutoPageState {
+ pub fn new() -> Self
+ {
+ JoshutoPageState {
+ start: 0,
+ end: 0,
+ }
+ }
+
+ pub fn update(&mut self, index: i32, win_rows: i32, vec_len: usize, offset: usize)
+ {
+ if self.start + offset < index as usize && self.end > index as usize + offset {
+ return;
+ }
+ self.end = self.start + win_rows as usize;
+
+ if win_rows as usize >= vec_len {
+ self.start = 0;
+ self.end = vec_len;
+ } else if index as i32 - self.start as i32 <= offset as i32 {
+ self.start = if index as usize <= offset {
+ 0
+ } else {
+ index as usize - offset
+ };
+ self.end = if self.start + win_rows as usize >= vec_len {
+ vec_len
+ } else {
+ self.start + win_rows as usize
+ };
+ } else if self.end as i32 <= offset as i32 + index {
+ self.end = if index as usize + offset >= vec_len {
+ vec_len
+ } else {
+ index as usize + offset
+ };
+ self.start = if self.end < win_rows as usize {
+ 0
+ } else {
+ self.end - win_rows as usize
+ };
+ }
+ }
+}
+
#[derive(Debug)]
pub struct JoshutoDirList {
pub index: i32,
@@ -72,7 +123,8 @@ pub struct JoshutoDirList {
pub update_needed: bool,
pub metadata: JoshutoMetadata,
pub contents: Vec<JoshutoDirEntry>,
- pub selected: usize
+ pub selected: usize,
+ pub pagestate: JoshutoPageState,
}
impl JoshutoDirList {
@@ -89,6 +141,7 @@ impl JoshutoDirList {
let metadata = fs::metadata(&path)?;
let metadata = JoshutoMetadata::from(&metadata)?;
+ let pagestate = JoshutoPageState::new();
Ok(JoshutoDirList {
index,
@@ -97,6 +150,7 @@ impl JoshutoDirList {
metadata,
contents,
selected: 0,
+ pagestate,
})
}
diff --git a/src/joshuto/ui.rs b/src/joshuto/ui.rs
index 52957bb..1a39d0a 100644
--- a/src/joshuto/ui.rs
+++ b/src/joshuto/ui.rs
@@ -157,7 +157,9 @@ fn wprint_file_mode(win: ncurses::WINDOW, file: &structs::JoshutoDirEntry)
let mode = file.metadata.permissions.mode();
+ ncurses::wattron(win, ncurses::COLOR_PAIR(6));
ncurses::waddstr(win, unix::stringify_mode(mode).as_str());
+ ncurses::wattroff(win, ncurses::COLOR_PAIR(6));
}
pub fn wprint_file_info(win: ncurses::WINDOW, file: &structs::JoshutoDirEntry)
@@ -237,20 +239,18 @@ pub fn wprint_direntry(win: &window::JoshutoPanel,
wprint_file_name(win, file, coord);
}
-pub fn refresh(context: &joshuto::JoshutoContext)
+pub fn refresh(context: &mut joshuto::JoshutoContext)
{
if context.tabs.len() == 0 {
return;
}
- let curr_tab = &context.tabs[context.tab_index];
+ let curr_tab = &mut context.tabs[context.tab_index];
- redraw_view(&context.theme_t, &context.views.left_win,
- curr_tab.parent_list.as_ref());
- redraw_view_detailed(&context.theme_t, &context.views.mid_win,
- curr_tab.curr_list.as_ref());
- redraw_view(&context.theme_t, &context.views.right_win,
- curr_tab.preview_list.as_ref());
+ redraw_view(&context.config_t, &context.theme_t,
+ &context.views.left_win, curr_tab.parent_list.as_mut());
+ redraw_view_detailed(&context.config_t, &context.theme_t,
+ &context.views.mid_win, curr_tab.curr_list.as_mut());
redraw_status(&context.theme_t, &context.views,
curr_tab.curr_list.as_ref(),
@@ -258,11 +258,11 @@ pub fn refresh(context: &joshuto::JoshutoContext)
&context.username, &context.hostname);
}
-pub fn redraw_view(theme_t: &config::JoshutoTheme, win: &window::JoshutoPanel,
- view: Option<&structs::JoshutoDirList>)
+pub fn redraw_view(config_t: &config::JoshutoConfig, theme_t: &config::JoshutoTheme, win: &window::JoshutoPanel,
+ mut view: Option<&mut structs::JoshutoDirList>)
{
- if let Some(s) = view {
- display_contents(theme_t, win, s);
+ if let Some(s) = view.as_mut() {
+ display_contents(config_t, theme_t, win, s);
ncurses::wnoutrefresh(win.win);
} else {
ncurses::werase(win.win);
@@ -270,11 +270,11 @@ pub fn redraw_view(theme_t: &config::JoshutoTheme, win: &window::JoshutoPanel,
ncurses::wnoutrefresh(win.win);
}
-pub fn redraw_view_detailed(theme_t: &config::JoshutoTheme, win: &window::JoshutoPanel,
- view: Option<&structs::JoshutoDirList>)
+pub fn redraw_view_detailed(config_t: &config::JoshutoConfig, theme_t: &config::JoshutoTheme, win: &window::JoshutoPanel,
+ mut view: Option<&mut structs::JoshutoDirList>)
{
- if let Some(s) = view {
- display_contents(theme_t, win, s);
+ if let Some(ref mut s) = view {
+ display_contents(config_t, theme_t, win, s);
ncurses::wnoutrefresh(win.win);
} else {
ncurses::werase(win.win);
@@ -333,44 +333,32 @@ pub fn draw_loading_bar(theme_t: &config::JoshutoTheme,
theme_t.selection.colorpair);
}
-pub fn display_contents(theme_t: &config::JoshutoTheme,
- win: &window::JoshutoPanel,
- entry: &structs::JoshutoDirList) {
- use std::os::unix::fs::PermissionsExt;
-
- ncurses::werase(win.win);
- if win.cols <= 6 {
- return;
- }
-
- let index = entry.index as usize;
- let dir_contents = &entry.contents;
- let vec_len = dir_contents.len();
+pub fn display_contents(config_t: &config::Joshut