diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/commands/linemode.rs | 13 | ||||
-rw-r--r-- | src/commands/mod.rs | 1 | ||||
-rw-r--r-- | src/config/general/display_raw.rs | 8 | ||||
-rw-r--r-- | src/config/option/display_option.rs | 11 | ||||
-rw-r--r-- | src/config/option/linemodes.rs | 22 | ||||
-rw-r--r-- | src/config/option/mod.rs | 2 | ||||
-rw-r--r-- | src/key_command/command.rs | 4 | ||||
-rw-r--r-- | src/key_command/constants.rs | 1 | ||||
-rw-r--r-- | src/key_command/impl_appcommand.rs | 1 | ||||
-rw-r--r-- | src/key_command/impl_appexecute.rs | 1 | ||||
-rw-r--r-- | src/key_command/impl_comment.rs | 7 | ||||
-rw-r--r-- | src/key_command/impl_from_str.rs | 4 | ||||
-rw-r--r-- | src/ui/views/tui_folder_view.rs | 3 | ||||
-rw-r--r-- | src/ui/views/tui_hsplit_view.rs | 6 | ||||
-rw-r--r-- | src/ui/widgets/tui_dirlist_detailed.rs | 40 |
15 files changed, 102 insertions, 22 deletions
diff --git a/src/commands/linemode.rs b/src/commands/linemode.rs new file mode 100644 index 0000000..82668f6 --- /dev/null +++ b/src/commands/linemode.rs @@ -0,0 +1,13 @@ +use super::reload; +use crate::config::option::LineMode; +use crate::context::AppContext; +use crate::error::JoshutoResult; +use crate::history::DirectoryHistory; + +pub fn set_linemode(context: &mut AppContext, linemode: LineMode) -> JoshutoResult { + let curr_tab = context.tab_context_mut().curr_tab_mut(); + curr_tab.option_mut().linemode = linemode; + curr_tab.history_mut().depreciate_all_entries(); + reload::soft_reload_curr_tab(context)?; + Ok(()) +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs index c4f7531..cf7ef53 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -8,6 +8,7 @@ pub mod file_ops; pub mod filter; pub mod flat; pub mod line_nums; +pub mod linemode; pub mod new_directory; pub mod numbered_command; pub mod open_file; diff --git a/src/config/general/display_raw.rs b/src/config/general/display_raw.rs index c594e5c..84836f6 100644 --- a/src/config/general/display_raw.rs +++ b/src/config/general/display_raw.rs @@ -3,7 +3,9 @@ use std::convert::From; use serde_derive::Deserialize; use tui::layout::Constraint; -use crate::config::option::{DisplayMode, DisplayOption, LineNumberStyle, TabDisplayOption}; +use crate::config::option::{ + DisplayMode, DisplayOption, LineMode, LineNumberStyle, TabDisplayOption, +}; use super::sort_raw::SortOptionRaw; @@ -124,8 +126,10 @@ impl From<DisplayOptionRaw> for DisplayOption { default_layout, no_preview_layout, default_tab_display_option: TabDisplayOption { - _sort_options: raw.sort_options.into(), filter_string: "".to_owned(), + sort_options: raw.sort_options.into(), + // todo: make default line mode configurable + linemode: LineMode::Size, }, } } diff --git a/src/config/option/display_option.rs b/src/config/option/display_option.rs index a076db8..e213236 100644 --- a/src/config/option/display_option.rs +++ b/src/config/option/display_option.rs @@ -2,6 +2,7 @@ use std::fs; use tui::layout::Constraint; +use crate::config::option::LineMode; use crate::config::option::SortOption; #[derive(Clone, Copy, Debug)] @@ -35,8 +36,9 @@ pub struct DisplayOption { /// Display options valid per JoshutoTab #[derive(Clone, Debug)] pub struct TabDisplayOption { - pub _sort_options: SortOption, pub filter_string: String, + pub sort_options: SortOption, + pub linemode: LineMode, } #[derive(Clone, Copy, Debug)] @@ -48,11 +50,11 @@ pub enum LineNumberStyle { impl TabDisplayOption { pub fn sort_options_ref(&self) -> &SortOption { - &self._sort_options + &self.sort_options } pub fn sort_options_mut(&mut self) -> &mut SortOption { - &mut self._sort_options + &mut self.sort_options } pub fn set_filter_string(&mut self, pattern: &str) { @@ -146,8 +148,9 @@ impl std::default::Default for DisplayOption { default_layout, no_preview_layout, default_tab_display_option: TabDisplayOption { - _sort_options: SortOption::default(), filter_string: "".to_owned(), + sort_options: SortOption::default(), + linemode: LineMode::Size, }, } } diff --git a/src/config/option/linemodes.rs b/src/config/option/linemodes.rs new file mode 100644 index 0000000..405bb6b --- /dev/null +++ b/src/config/option/linemodes.rs @@ -0,0 +1,22 @@ +use crate::error::{JoshutoError, JoshutoErrorKind, JoshutoResult}; + +#[derive(Clone, Debug, Copy)] +pub enum LineMode { + Size, + MTime, + SizeMTime, +} + +impl LineMode { + pub fn from_string(name: &str) -> JoshutoResult<LineMode> { + match name { + "size" => Ok(LineMode::Size), + "mtime" => Ok(LineMode::MTime), + "sizemtime" => Ok(LineMode::SizeMTime), + _ => Err(JoshutoError::new( + JoshutoErrorKind::InvalidParameters, + format!("Linemode '{}' unknown.", name), + )), + } + } +} diff --git a/src/config/option/mod.rs b/src/config/option/mod.rs index a81bd06..cf90f1b 100644 --- a/src/config/option/mod.rs +++ b/src/config/option/mod.rs @@ -1,4 +1,5 @@ pub mod display_option; +pub mod linemodes; pub mod preview_option; pub mod select_option; pub mod sort_option; @@ -6,6 +7,7 @@ pub mod sort_type; pub mod tab_option; pub use self::display_option::*; +pub use self::linemodes::*; pub use self::preview_option::*; pub use self::select_option::*; pub use self::sort_option::*; diff --git a/src/key_command/command.rs b/src/key_command/command.rs index bc8fe6d..5da7e27 100644 --- a/src/key_command/command.rs +++ b/src/key_command/command.rs @@ -1,7 +1,7 @@ use std::path; use crate::commands::quit::QuitAction; -use crate::config::option::{LineNumberStyle, SelectOption, SortType}; +use crate::config::option::{LineMode, LineNumberStyle, SelectOption, SortType}; use crate::io::FileOperationOptions; #[derive(Clone, Debug)] @@ -53,6 +53,8 @@ pub enum Command { CursorMovePageMiddle, CursorMovePageEnd, + SetLineMode(LineMode), + ParentCursorMoveUp { offset: usize, }, diff --git a/src/key_command/constants.rs b/src/key_command/constants.rs index c3bddc9..de25d3a 100644 --- a/src/key_command/constants.rs +++ b/src/key_command/constants.rs @@ -71,6 +71,7 @@ cmd_constants![ (CMD_TOGGLE_HIDDEN, "toggle_hidden"), (CMD_TOGGLE_VISUAL, "toggle_visual"), (CMD_SWITCH_LINE_NUMBERS, "line_nums"), + (CMD_SET_LINEMODE, "linemode"), (CMD_TOUCH_FILE, "touch"), (CMD_HELP, "help"), (CMD_SEARCH_FZF, "search_fzf"), diff --git a/src/key_command/impl_appcommand.rs b/src/key_command/impl_appcommand.rs index bc509af..6f5c067 100644 --- a/src/key_command/impl_appcommand.rs +++ b/src/key_command/impl_appcommand.rs @@ -79,6 +79,7 @@ impl AppCommand for Command { Self::SubProcess { spawn: false, .. } => CMD_SUBPROCESS_FOREGROUND, Self::SubProcess { spawn: true, .. } => CMD_SUBPROCESS_BACKGROUND, Self::SwitchLineNums(_) => CMD_SWITCH_LINE_NUMBERS, + Self::SetLineMode(_) => CMD_SET_LINEMODE, Self::TabSwitch { .. } => CMD_TAB_SWITCH, Self::TabSwitchIndex { .. } => CMD_TAB_SWITCH_INDEX, diff --git a/src/key_command/impl_appexecute.rs b/src/key_command/impl_appexecute.rs index f72aca3..693ef0c 100644 --- a/src/key_command/impl_appexecute.rs +++ b/src/key_command/impl_appexecute.rs @@ -111,6 +111,7 @@ impl AppExecute for Command { Self::SetMode => set_mode::set_mode(context, backend), Self::ShowTasks => show_tasks::show_tasks(context, backend, keymap_t), Self::Sort(t) => sort::set_sort(context, *t), + Self::SetLineMode(mode) => linemode::set_linemode(context, *mode), Self::SortReverse => sort::toggle_reverse(context), Self::SubProcess { words, spawn } => { sub_process::sub_process(context, backend, words.as_slice(), *spawn) diff --git a/src/key_command/impl_comment.rs b/src/key_command/impl_comment.rs index b74da7a..5fb969f 100644 --- a/src/key_command/impl_comment.rs +++ b/src/key_command/impl_comment.rs @@ -1,4 +1,4 @@ -use crate::config::option::SortType; +use crate::config::option::{LineMode, SortType}; use crate::io::FileOperationOptions; use super::{Command, CommandComment}; @@ -7,6 +7,11 @@ impl CommandComment for Command { // These comments are displayed at the help page fn comment(&self) -> &'static str { match self { + Self::SetLineMode(linemode) => match linemode { + LineMode::Size => "Show files with size", + LineMode::MTime => "Show files with modified time", + LineMode::SizeMTime => "Show files with size and modified time", + }, Self::Escape => "Escape from visual mode (cancel)", Self::BulkRename => "Bulk rename", diff --git a/src/key_command/impl_from_str.rs b/src/key_command/impl_from_str.rs index 5802573..f7fe4e9 100644 --- a/src/key_command/impl_from_str.rs +++ b/src/key_command/impl_from_str.rs @@ -4,7 +4,7 @@ use dirs_next::home_dir; use shellexpand::tilde_with_context; use crate::commands::quit::QuitAction; -use crate::config::option::{LineNumberStyle, SelectOption, SortType}; +use crate::config::option::{LineMode, LineNumberStyle, SelectOption, SortType}; use crate::error::{JoshutoError, JoshutoErrorKind}; use crate::io::FileOperationOptions; @@ -334,6 +334,8 @@ impl std::str::FromStr for Command { )), }, } + } else if command == CMD_SET_LINEMODE { + Ok(Self::SetLineMode(LineMode::from_string(arg)?)) } else if command == CMD_TAB_SWITCH { match arg.parse::<i32>() { Ok(s) => Ok(Self::TabSwitch { offset: s }), diff --git a/src/ui/views/tui_folder_view.rs b/src/ui/views/tui_folder_view.rs index d2eabf4..dfa70ee 100644 --- a/src/ui/views/tui_folder_view.rs +++ b/src/ui/views/tui_folder_view.rs @@ -167,7 +167,8 @@ impl<'a> Widget for TuiFolderView<'a> { // render current view if let Some(list) = curr_list.as_ref() { - TuiDirListDetailed::new(list, display_options, true).render(layout_rect[1], buf); + TuiDirListDetailed::new(list, display_options, curr_tab.option_ref(), true) + .render(layout_rect[1], buf); let footer_area = Self::footer_area(&area); if self.show_bottom_status { diff --git a/src/ui/views/tui_hsplit_view.rs b/src/ui/views/tui_hsplit_view.rs index 71b483e..ce0877d 100644 --- a/src/ui/views/tui_hsplit_view.rs +++ b/src/ui/views/tui_hsplit_view.rs @@ -78,7 +78,8 @@ impl<'a> Widget for TuiHSplitView<'a> { // render current view if let Some(list) = curr_list.as_ref() { - TuiDirListDetailed::new(list, display_options, true).render(layout_rect, buf); + TuiDirListDetailed::new(list, display_options, curr_tab.option_ref(), true) + .render(layout_rect, buf); let rect = Rect { x: 0, y: area.height - 1, @@ -150,7 +151,8 @@ impl<'a> Widget for TuiHSplitView<'a> { }; if let Some(list) = curr_list.as_ref() { - TuiDirListDetailed::new(list, display_options, false).render(layout_rect, buf); + TuiDirListDetailed::new(list, display_options, curr_tab.option_ref(), false) + .render(layout_rect, buf); } } } diff --git a/src/ui/widgets/tui_dirlist_detailed.rs b/src/ui/widgets/tui_dirlist_detailed.rs index 85d5c7f..7cf721f 100644 --- a/src/ui/widgets/tui_dirlist_detailed.rs +++ b/src/ui/widgets/tui_dirlist_detailed.rs @@ -5,7 +5,7 @@ use tui::layout::Rect; use tui::style::{Color, Modifier, Style}; use tui::widgets::Widget; -use crate::config::option::{DisplayOption, LineNumberStyle}; +use crate::config::option::{DisplayOption, LineMode, LineNumberStyle, TabDisplayOption}; use crate::fs::{FileType, JoshutoDirEntry, JoshutoDirList, LinkType}; use crate::util::format; use crate::util::string::UnicodeTruncate; @@ -19,17 +19,20 @@ const ELLIPSIS: &str = "…"; pub struct TuiDirListDetailed<'a> { dirlist: &'a JoshutoDirList, display_options: &'a DisplayOption, + tab_display_options: &'a TabDisplayOption, pub focused: bool, } impl<'a> TuiDirListDetailed<'a> { pub fn new( dirlist: &'a JoshutoDirList, display_options: &'a DisplayOption, + tab_display_options: &'a TabDisplayOption, focused: bool, ) -> Self { Self { dirlist, display_options, + tab_display_options, focused, } } @@ -105,6 +108,7 @@ impl<'a> Widget for TuiDirListDetailed<'a> { entry, style, (x + 1, y + i as u16), + self.tab_display_options.linemode, drawing_width - 1, &prefix, ); @@ -112,28 +116,44 @@ impl<'a> Widget for TuiDirListDetailed<'a> { } } +fn get_entry_size_string(entry: &JoshutoDirEntry) -> String { + match entry.metadata.file_type() { + FileType::Directory => entry + .metadata + .directory_size() + .map(|n| n.to_string()) + .unwrap_or_else(|| "".to_string()), + FileType::File => format::file_size_to_string(entry.metadata.len()), + } +} + fn print_entry( buf: &mut Buffer, entry: &JoshutoDirEntry, style: Style, (x, y): (u16, u16), + linemode: LineMode, drawing_width: usize, prefix: &str, ) { - let size_string = match entry.metadata.file_type() { - FileType::Directory => entry - .metadata - .directory_size() - .map(|n| n.to_string()) - .unwrap_or_else(|| "".to_string()), - FileType::File => format::file_size_to_string(entry.metadata.len()), - }; let symlink_string = match entry.metadata.link_type() { LinkType::Normal => "", LinkType::Symlink(_, _) => "-> ", }; let left_label_original = entry.label(); - let right_label_original = format!(" {}{} ", symlink_string, size_string); + let right_label_original = format!( + " {}{} ", + symlink_string, + match linemode { + LineMode::Size => get_entry_size_string(entry), + LineMode::MTime => format::mtime_to_string(entry.metadata.modified()), + LineMode::SizeMTime => format!( + "{} {}", + get_entry_size_string(entry), + format::mtime_to_string(entry.metadata.modified()) + ), + } + ); // draw prefix first let prefix_width = prefix.width(); |