diff options
author | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-02-16 16:40:20 -0500 |
---|---|---|
committer | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2020-02-16 16:40:20 -0500 |
commit | 88da91c0f97dcb40e7e4cab54941af92a46d2e1a (patch) | |
tree | d5e7fa33842c19b32bfc834e531e2b942813e985 /src | |
parent | 98d0ce7e70f9febf804cda7473f5e9f7f180fe91 (diff) |
remove more code
- remove curr_list field from tab
- fixes many commands not working
Diffstat (limited to 'src')
-rw-r--r-- | src/commands/bulk_rename.rs | 5 | ||||
-rw-r--r-- | src/commands/cursor_move.rs | 38 | ||||
-rw-r--r-- | src/commands/delete_files.rs | 6 | ||||
-rw-r--r-- | src/commands/reload_dir.rs | 5 | ||||
-rw-r--r-- | src/commands/rename_file.rs | 35 | ||||
-rw-r--r-- | src/commands/search.rs | 4 | ||||
-rw-r--r-- | src/commands/selection.rs | 36 | ||||
-rw-r--r-- | src/commands/set_mode.rs | 17 | ||||
-rw-r--r-- | src/commands/show_hidden.rs | 5 | ||||
-rw-r--r-- | src/fs/entry.rs | 108 | ||||
-rw-r--r-- | src/tab.rs | 4 | ||||
-rw-r--r-- | src/ui/tui_backend.rs | 33 | ||||
-rw-r--r-- | src/ui/widgets/tui_dirlist.rs | 15 |
13 files changed, 245 insertions, 66 deletions
diff --git a/src/commands/bulk_rename.rs b/src/commands/bulk_rename.rs index 9f67106..942ba73 100644 --- a/src/commands/bulk_rename.rs +++ b/src/commands/bulk_rename.rs @@ -45,7 +45,10 @@ impl BulkRename { file_path.push(rand_str); let curr_tab = &context.tabs[context.curr_tab_index]; - let paths = curr_tab.curr_list.get_selected_paths(); + let paths = match curr_tab.curr_list_ref() { + Some(s) => s.get_selected_paths(), + None => Vec::new(), + }; { let mut file = std::fs::File::create(&file_path)?; for path in &paths { diff --git a/src/commands/cursor_move.rs b/src/commands/cursor_move.rs index a0b7522..03d9908 100644 --- a/src/commands/cursor_move.rs +++ b/src/commands/cursor_move.rs @@ -218,13 +218,20 @@ impl std::fmt::Display for CursorMoveHome { impl JoshutoRunnable for CursorMoveHome { fn execute(&self, context: &mut JoshutoContext, _: &mut TuiBackend) -> JoshutoResult<()> { - let movement: Option<usize> = { - let len = context.curr_tab_mut().curr_list.contents.len(); - if len == 0 { - None - } else { - Some(0) + let movement: Option<usize> = match context + .curr_tab_ref() + .curr_list_ref() { + Some(curr_list) => { + let len = curr_list + .contents + .len(); + if len == 0 { + None + } else { + Some(0) + } } + None => None, }; if let Some(s) = movement { @@ -256,13 +263,20 @@ impl std::fmt::Display for CursorMoveEnd { impl JoshutoRunnable for CursorMoveEnd { fn execute(&self, context: &mut JoshutoContext, _: &mut TuiBackend) -> JoshutoResult<()> { - let movement: Option<usize> = { - let len = context.curr_tab_mut().curr_list.contents.len(); - if len == 0 { - None - } else { - Some(len - 1) + let movement: Option<usize> = match context + .curr_tab_ref() + .curr_list_ref() { + Some(curr_list) => { + let len = curr_list + .contents + .len(); + if len == 0 { + None + } else { + Some(len - 1) + } } + None => None, }; if let Some(s) = movement { diff --git a/src/commands/delete_files.rs b/src/commands/delete_files.rs index ed35630..f1ce09d 100644 --- a/src/commands/delete_files.rs +++ b/src/commands/delete_files.rs @@ -33,7 +33,11 @@ impl DeleteFiles { fn delete_files(context: &mut JoshutoContext, backend: &mut TuiBackend) -> std::io::Result<()> { let curr_tab = &mut context.tabs[context.curr_tab_index]; - let paths = curr_tab.curr_list.get_selected_paths(); + let paths = match curr_tab.curr_list_ref() { + Some(s) => s.get_selected_paths(), + None => Vec::new(), + }; + if paths.is_empty() { return Err(std::io::Error::new( std::io::ErrorKind::Other, diff --git a/src/commands/reload_dir.rs b/src/commands/reload_dir.rs index 7103970..ac8d72d 100644 --- a/src/commands/reload_dir.rs +++ b/src/commands/reload_dir.rs @@ -17,7 +17,10 @@ impl ReloadDirList { pub fn reload(index: usize, context: &mut JoshutoContext) -> std::io::Result<()> { let curr_tab = &mut context.tabs[index]; let sort_option = &context.config_t.sort_option; - curr_tab.curr_list.reload_contents(sort_option)?; + match curr_tab.curr_list_mut() { + Some(curr_list) => curr_list.reload_contents(sort_option)?, + None => {}, + } Ok(()) } diff --git a/src/commands/rename_file.rs b/src/commands/rename_file.rs index ad2441c..dad9632 100644 --- a/src/commands/rename_file.rs +++ b/src/commands/rename_file.rs @@ -32,9 +32,9 @@ impl RenameFile { } std::fs::rename(&path, &new_path)?; let curr_tab = &mut context.tabs[context.curr_tab_index]; - curr_tab - .curr_list - .reload_contents(&context.config_t.sort_option)?; + if let Some(curr_list) = curr_tab.curr_list_mut() { + curr_list.reload_contents(&context.config_t.sort_option)?; + } Ok(()) } } @@ -51,9 +51,10 @@ impl JoshutoRunnable for RenameFile { fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> { let mut path: Option<path::PathBuf> = None; - let curr_list = &context.tabs[context.curr_tab_index].curr_list; - if let Some(s) = curr_list.get_curr_ref() { - path = Some(s.file_path().clone()); + if let Some(curr_list) = context.curr_tab_ref().curr_list_ref() { + if let Some(s) = curr_list.get_curr_ref() { + path = Some(s.file_path().clone()); + } } if let Some(path) = path { @@ -105,10 +106,13 @@ impl std::fmt::Display for RenameFileAppend { impl JoshutoRunnable for RenameFileAppend { fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> { - let curr_list = &context.tabs[context.curr_tab_index].curr_list; - let file_name = curr_list - .get_curr_ref() - .and_then(|s| Some(String::from(s.file_name()))); + let mut file_name: Option<String> = None; + + if let Some(curr_list) = context.curr_tab_ref().curr_list_ref() { + file_name = curr_list + .get_curr_ref() + .and_then(|s| Some(s.file_name().to_string())); + } if let Some(file_name) = file_name { self.rename_file(context, backend, file_name)?; @@ -152,10 +156,13 @@ impl std::fmt::Display for RenameFilePrepend { impl JoshutoRunnable for RenameFilePrepend { fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> { - let curr_list = &context.tabs[context.curr_tab_index].curr_list; - let file_name = curr_list - .get_curr_ref() - .and_then(|s| Some(String::from(s.file_name()))); + let mut file_name: Option<String> = None; + + if let Some(curr_list) = context.curr_tab_ref().curr_list_ref() { + file_name = curr_list + .get_curr_ref() + .and_then(|s| Some(s.file_name().to_string())); + } if let Some(file_name) = file_name { self.rename_file(context, backend, file_name)?; diff --git a/src/commands/search.rs b/src/commands/search.rs index 0b7ef76..23180c4 100644 --- a/src/commands/search.rs +++ b/src/commands/search.rs @@ -26,7 +26,7 @@ impl Search { "search" } pub fn search(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> { - let curr_list = &curr_tab.curr_list; + let curr_list = curr_tab.curr_list_ref()?; let offset = curr_list.index? + 1; let contents_len = curr_list.contents.len(); @@ -41,7 +41,7 @@ impl Search { None } pub fn search_rev(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> { - let curr_list = &curr_tab.curr_list; + let curr_list = curr_tab.curr_list_ref()?; let offset = curr_list.index?; let contents_len = curr_list.contents.len(); diff --git a/src/commands/selection.rs b/src/commands/selection.rs index 4ce4772..dccb114 100644 --- a/src/commands/selection.rs +++ b/src/commands/selection.rs @@ -38,27 +38,35 @@ impl JoshutoRunnable for SelectFiles { let curr_tab = &mut context.tabs[context.curr_tab_index]; if self.toggle { if !self.all { - let curr_list = &mut curr_tab.curr_list; - if let Some(s) = curr_list.get_curr_mut() { - s.set_selected(!s.is_selected()); - CursorMoveDown::new(1).execute(context, backend)?; + let curr_list = curr_tab.curr_list_mut(); + if let Some(curr_list) = curr_list { + if let Some(s) = curr_list.get_curr_mut() { + s.set_selected(!s.is_selected()); + CursorMoveDown::new(1).execute(context, backend)?; + } } } else { - let curr_list = &mut curr_tab.curr_list; - for curr in &mut curr_list.contents { - curr.set_selected(!curr.is_selected()); + let curr_list = curr_tab.curr_list_mut(); + if let Some(curr_list) = curr_list { + for curr in &mut curr_list.contents { + curr.set_selected(!curr.is_selected()); + } } } } else if !self.all { - let curr_list = &mut curr_tab.curr_list; - if let Some(s) = curr_list.get_curr_mut() { - s.set_selected(true); - CursorMoveDown::new(1).execute(context, backend)?; + let curr_list = curr_tab.curr_list_mut(); + if let Some(curr_list) = curr_list { + if let Some(s) = curr_list.get_curr_mut() { + s.set_selected(!s.is_selected()); + CursorMoveDown::new(1).execute(context, backend)?; + } } } else { - let curr_list = &mut curr_tab.curr_list; - for curr in &mut curr_list.contents { - curr.set_selected(true); + let curr_list = curr_tab.curr_list_mut(); + if let Some(curr_list) = curr_list { + for curr in &mut curr_list.contents { + curr.set_selected(true); + } } } Ok(()) diff --git a/src/commands/set_mode.rs b/src/commands/set_mode.rs index 6a5896f..07f6d37 100644 --- a/src/commands/set_mode.rs +++ b/src/commands/set_mode.rs @@ -65,15 +65,16 @@ impl JoshutoRunnable for SetMode { fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> { use std::os::unix::fs::PermissionsExt; let curr_tab = &mut context.tabs[context.curr_tab_index]; - if let Some(file) = curr_tab.curr_list.get_curr_mut() { - let mode = file.metadata.permissions.mode(); - let mut mode_string = unix::stringify_mode(mode); - mode_string.remove(0); + if let Some(curr_list) = curr_tab.curr_list_mut() { + if let Some(file) = curr_list.get_curr_mut() { + let mode = file.metadata.permissions.mode(); + let mut mode_string = unix::stringify_mode(mode); + mode_string.remove(0); - self.set_mode(file, mode_string); - CursorMoveDown::new(1).execute(context, backend) - } else { - Ok(()) + self.set_mode(file, mode_string); + CursorMoveDown::new(1).execute(context, backend)?; + } } + Ok(()) } } diff --git a/src/commands/show_hidden.rs b/src/commands/show_hidden.rs index 3a51c84..63ac4bf 100644 --- a/src/commands/show_hidden.rs +++ b/src/commands/show_hidden.rs @@ -20,7 +20,10 @@ impl ToggleHiddenFiles { for tab in &mut context.tabs { tab.history.depreciate_all_entries(); - tab.curr_list.depreciate(); + match tab.curr_list_mut() { + Some(s) => s.depreciate(), + None => {}, + } } } } diff --git a/src/fs/entry.rs b/src/fs/entry.rs index ebc2e75..5cb8a2b 100644 --- a/src/fs/entry.rs +++ b/src/fs/entry.rs @@ -1,6 +1,6 @@ use std::{fs, path}; -use tui::style::Color; +use tui::style::{Color, Modifier, Style}; use crate::fs::JoshutoMetadata; @@ -112,6 +112,112 @@ impl JoshutoDirEntry { } } } + + pub fn get_modifier(&self) -> Modifier { + let metadata = &self.metadata; + let filetype = metadata.file_type; + + let mut modifier = Modifier::empty(); + + if filetype.is_dir() { + if THEME_T.directory.bold { + modifier.insert(Modifier::BOLD); + } + if THEME_T.directory.underline { + modifier.insert(Modifier::UNDERLINED); + } + } else if filetype.is_symlink() { + if THEME_T.link.bold { + modifier.insert(Modifier::BOLD); + } + if THEME_T.link.underline { + modifier.insert(Modifier::UNDERLINED); + } + } else { + match self.file_path().extension() { + None => {} + Some(os_str) => match os_str.to_str() { + None => {} + Some(s) => match THEME_T.ext.get(s) { + None => {} + Some(t) => { + if t.bold { + modifier.insert(Modifier::BOLD); + } + if t.underline { + modifier.insert(Modifier::UNDERLINED); + } + } + }, + }, + }; + } + modifier + } + + pub fn get_style(&self) -> Style { + let metadata = &self.metadata; + let filetype = metadata.file_type; + + let mut style = Style::default(); + + if self.is_selected() { + let mut modifier = Modifier::empty(); + if THEME_T.selection.bold { + modifier.insert(Modifier::BOLD); + } + if THEME_T.selection.underline { + modifier.insert(Modifier::UNDERLINED); + } + + style = style.fg(THEME_T.selection.fg).bg(THEME_T.selection.bg); + style = style.modifier(modifier); + } else if filetype.is_dir() { + let mut modifier = Modifier::empty(); + if THEME_T.directory.bold { + modifier.insert(Modifier::BOLD); + } + if THEME_T.directory.underline { + modifier.insert(Modifier::UNDERLINED); + } + + style = style.fg(THEME_T.directory.fg).bg(THEME_T.directory.bg); + style = style.modifier(modifier); + } else if filetype.is_symlink() { + let mut modifier = Modifier::empty(); + if THEME_T.link.bold { + modifier.insert(Modifier::BOLD); + } + if THEME_T.link.underline { + modifier.insert(Modifier::UNDERLINED); + } + + style = style.fg(THEME_T.link.fg).bg(THEME_T.link.bg); + style = style.modifier(modifier); + } else { + match self.file_path().extension() { + None => {} + Some(os_str) => match os_str.to_str() { + None => {} + Some(s) => match THEME_T.ext.get(s) { + None => {} + Some(t) => { + let mut modifier = Modifier::empty(); + if t.bold { + modifier.insert(Modifier::BOLD); + } + if t.underline { + modifier.insert(Modifier::UNDERLINED); + } + style = style.fg(t.fg).bg(t.bg); + style = style.modifier(modifier); + } + }, + }, + } + } + style + } } impl std::fmt::Display for JoshutoDirEntry { @@ -7,7 +7,6 @@ use crate::sort; pub struct JoshutoTab { pub history: JoshutoHistory, pub curr_path: PathBuf, - pub curr_list: JoshutoDirList, } impl JoshutoTab { @@ -15,12 +14,9 @@ impl JoshutoTab { let mut history = JoshutoHistory::new(); history.populate_to_root(&curr_path, sort_option)?; - let curr_list = JoshutoDirList::new(curr_path.clone(), sort_option)?; - let tab = JoshutoTab { curr_path, history, - curr_list, }; Ok(tab) } diff --git a/src/ui/tui_backend.rs b/src/ui/tui_backend.rs index fa923a2..2a0c53e 100644 --- a/src/ui/tui_backend.rs +++ b/src/ui/tui_backend.rs @@ -8,13 +8,14 @@ use termion::raw::{IntoRawMode, RawTerminal}; use termion::screen::AlternateScreen; use tui::backend::TermionBackend; use tui::layout::{Constraint, Direction, Layout, Rect}; -use tui::style::{Color, Style}; +use tui::style::{Color, Modifier, Style}; use tui::widgets::{Block, Borders, List, Paragraph, SelectableList, Text, Widget}; use unicode_width::UnicodeWidthStr; use super::widgets::TuiDirList; use crate::context::JoshutoContext; -// use crate::fs::JoshutoDirList; + +use crate::{HOSTNAME, USERNAME}; pub struct TuiBackend { pub terminal: tui::Terminal<TermionBackend<AlternateScreen<RawTerminal<std::io::Stdout>>>>, @@ -63,6 +64,34 @@ impl TuiBackend { .constraints(constraints.as_ref()) .split(f_size); + { + let username_style = Style::default() + .fg(Color::LightGreen) + .modifier(Modifier::BOLD); + + let path_style = Style::default() + .fg(Color::LightBlue) + .modifier(Modifier::BOLD); + + let curr_path_str = curr_tab.curr_path.to_string_lossy(); + + let text = [ + Text::styled(format!("{}@{} ", *USERNAME, *HOSTNAME), username_style), + Text::styled(curr_path_str, path_style), + ]; + + let top_rect = Rect { + x: 0, + y: 0, + width: f_size.width, + height: 1, + }; + + Paragraph::new(text.iter()) + .wrap(true) + .render(&mut frame, top_rect); + } + if let Some(curr_list) = parent_list.as_ref() { TuiDirList::new(&curr_list).render(&mut frame, layout_rect[0]); }; diff --git a/src/ui/widgets/tui_dirlist.rs b/src/ui/widgets/tui_dirlist.rs index 83891b4..cda2da9 100644 --- a/src/ui/widgets/tui_dirlist.rs +++ b/src/ui/widgets/tui_dirlist.rs @@ -103,20 +103,25 @@ impl<'a> Widget for TuiDirList<'a> { } let curr_index = self.dirlist.index.unwrap(); + let skip_dist = curr_index / area.height as usize * area.height as usize; + + let screen_index = if skip_dist > 0 { + curr_index % skip_dist + } else { + curr_index + }; for (i, entry) in self .dirlist .contents .iter() + .skip(skip_dist) .enumerate() .take(area.height as usize) { - let fg = entry.get_fg_color(); - let bg = entry.get_bg_color(); let name = entry.file_name(); + let mut style = entry.get_style(); - let mut style = Style::default().fg(fg).bg(bg); - - if i == curr_index { + if i == screen_index { style = style.modifier(Modifier::REVERSED); } buf.set_stringn(x, y + i as u16, name, area.width as usize, style); |