summaryrefslogtreecommitdiffstats
path: root/src/joshuto
diff options
context:
space:
mode:
Diffstat (limited to 'src/joshuto')
-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
13 files changed, 246 insertions, 207 deletions
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::JoshutoConfig,
+ theme_t: &config::JoshutoTheme, win: &window::JoshutoPanel,
+ dirlist: &mut structs::JoshutoDirList)
+{
+ let index = dirlist.index;
+ let vec_len = dirlist.contents.len();
if vec_len == 0 {
wprint_empty(win, "empty");
return;
}
+ dirlist.pagestate.update(index, win.rows, vec_len, config_t.scroll_offset);
+ draw_contents(theme_t, win, dirlist);
+}
- let offset : usize = 8;
- let start : usize;
- let end : usize;
-
- if win.rows as usize >= vec_len {
- start = 0;
- end = vec_len;
- } else if index <= offset {
- start = 0;
- end = win.rows as usize;
- } else if index + win.rows as usize >= vec_len + offset {
- start = vec_len - win.rows as usize;
- end = vec_len;
- } else {
- start = index - offset;
- end = start + win.rows as usize;
- }
+pub fn draw_contents(theme_t: &config::JoshutoTheme,
+ win: &window::JoshutoPanel, dirlist: &structs::JoshutoDirList)
+{
+ use std::os::unix::fs::PermissionsExt;
+ ncurses::werase(win.win);
ncurses::wmove(win.win, 0, 0);
+ let dir_contents = &dirlist.contents;
+
+ let (start, end) = (dirlist.pagestate.start, dirlist.pagestate.end);
+
for i in start..end {
let coord: (i32, i32) = (i as i32 - start as i32, 0);
wprint_direntry(win, &dir_contents[i], coord);
@@ -378,7 +366,7 @@ pub fn display_contents(theme_t: &config::JoshutoTheme,
let mode = dir_contents[i].metadata.permissions.mode();
let mut attr: ncurses::attr_t = 0;
- if index == i {
+ if dirlist.index as usize == i {
attr = attr | ncurses::A_STANDOUT();
}