diff options
Diffstat (limited to 'src/joshuto')
-rw-r--r-- | src/joshuto/command/change_directory.rs | 27 | ||||
-rw-r--r-- | src/joshuto/command/cursor_move.rs | 70 | ||||
-rw-r--r-- | src/joshuto/command/file_operation.rs | 33 | ||||
-rw-r--r-- | src/joshuto/command/new_directory.rs | 3 | ||||
-rw-r--r-- | src/joshuto/command/open_file.rs | 52 | ||||
-rw-r--r-- | src/joshuto/command/parent_directory.rs | 58 | ||||
-rw-r--r-- | src/joshuto/command/reload_dir.rs | 4 | ||||
-rw-r--r-- | src/joshuto/command/show_hidden.rs | 6 | ||||
-rw-r--r-- | src/joshuto/command/tab_switch.rs | 2 | ||||
-rw-r--r-- | src/joshuto/history.rs | 29 | ||||
-rw-r--r-- | src/joshuto/preview.rs | 27 | ||||
-rw-r--r-- | src/joshuto/structs.rs | 60 | ||||
-rw-r--r-- | src/joshuto/ui.rs | 82 |
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(); } |