summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/commands/linemode.rs13
-rw-r--r--src/commands/mod.rs1
-rw-r--r--src/config/general/display_raw.rs8
-rw-r--r--src/config/option/display_option.rs11
-rw-r--r--src/config/option/linemodes.rs22
-rw-r--r--src/config/option/mod.rs2
-rw-r--r--src/key_command/command.rs4
-rw-r--r--src/key_command/constants.rs1
-rw-r--r--src/key_command/impl_appcommand.rs1
-rw-r--r--src/key_command/impl_appexecute.rs1
-rw-r--r--src/key_command/impl_comment.rs7
-rw-r--r--src/key_command/impl_from_str.rs4
-rw-r--r--src/ui/views/tui_folder_view.rs3
-rw-r--r--src/ui/views/tui_hsplit_view.rs6
-rw-r--r--src/ui/widgets/tui_dirlist_detailed.rs40
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();