summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPiotr Wach <pwach@bloomberg.net>2024-01-09 22:06:12 +0000
committerPiotr Wach <pwach@bloomberg.net>2024-01-09 22:08:12 +0000
commit1544e8dffeacb55940deae2d06534d8a500765d4 (patch)
treefdbb127b95e4f162233a0893cbdb0d59b130f78d /src
parent181222745ed50b7346bfd082473168634e01fa99 (diff)
feat: show and hide mtime and item count columns with 'M' and 'C' respectively
Diffstat (limited to 'src')
-rw-r--r--src/interactive/app/eventloop.rs4
-rw-r--r--src/interactive/app/handlers.rs18
-rw-r--r--src/interactive/app/state.rs5
-rw-r--r--src/interactive/widgets/entries.rs19
-rw-r--r--src/interactive/widgets/help.rs4
-rw-r--r--src/interactive/widgets/main.rs1
6 files changed, 40 insertions, 11 deletions
diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs
index cd91a27..71dcb82 100644
--- a/src/interactive/app/eventloop.rs
+++ b/src/interactive/app/eventloop.rs
@@ -289,8 +289,10 @@ impl AppState {
}
Char('s') => self.cycle_sorting(&tree_view),
Char('m') => self.cycle_mtime_sorting(&tree_view),
+ Char('M') => self.toggle_mtime_column(),
Char('c') => self.cycle_count_sorting(&tree_view),
- Char('g') => display.byte_vis.cycle(),
+ Char('C') => self.toggle_count_column(),
+ Char('g') | Char('S') => display.byte_vis.cycle(),
Char('d') => self.mark_entry(
CursorMode::Advance,
MarkEntryMode::Toggle,
diff --git a/src/interactive/app/handlers.rs b/src/interactive/app/handlers.rs
index d6b6582..754fa51 100644
--- a/src/interactive/app/handlers.rs
+++ b/src/interactive/app/handlers.rs
@@ -1,6 +1,6 @@
use crate::interactive::{
app::tree_view::TreeView,
- widgets::{GlobPane, HelpPane, MainWindow, MarkMode, MarkPane},
+ widgets::{Column, GlobPane, HelpPane, MainWindow, MarkMode, MarkPane},
DisplayOptions, EntryDataBundle,
};
use crosstermion::input::Key;
@@ -135,6 +135,22 @@ impl AppState {
self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting);
}
+ pub fn toggle_mtime_column(&mut self) {
+ self.toggle_column(Column::MTime);
+ }
+
+ pub fn toggle_count_column(&mut self) {
+ self.toggle_column(Column::Count);
+ }
+
+ fn toggle_column(&mut self, column: Column) {
+ if self.show_columns.contains(&column) {
+ self.show_columns.remove(&column);
+ } else {
+ self.show_columns.insert(column);
+ }
+ }
+
pub fn toggle_glob_search(&mut self, window: &mut MainWindow) {
self.focussed = match self.focussed {
Main | Mark | Help => {
diff --git a/src/interactive/app/state.rs b/src/interactive/app/state.rs
index 9157da1..b303531 100644
--- a/src/interactive/app/state.rs
+++ b/src/interactive/app/state.rs
@@ -1,5 +1,9 @@
+use std::collections::HashSet;
+
use dua::traverse::BackgroundTraversal;
+use crate::interactive::widgets::Column;
+
use super::{navigation::Navigation, EntryDataBundle, SortMode};
#[derive(Default, Copy, Clone, PartialEq)]
@@ -24,6 +28,7 @@ pub struct AppState {
pub glob_navigation: Option<Navigation>,
pub entries: Vec<EntryDataBundle>,
pub sorting: SortMode,
+ pub show_columns: HashSet<Column>,
pub message: Option<String>,
pub focussed: FocussedPane,
pub received_events: bool,
diff --git a/src/interactive/widgets/entries.rs b/src/interactive/widgets/entries.rs
index efa5ca5..45e070c 100644
--- a/src/interactive/widgets/entries.rs
+++ b/src/interactive/widgets/entries.rs
@@ -7,6 +7,7 @@ use chrono::DateTime;
use dua::traverse::TreeIndex;
use itertools::Itertools;
use std::borrow::{Borrow, Cow};
+use std::collections::HashSet;
use std::time::SystemTime;
use tui::{
buffer::Buffer,
@@ -33,6 +34,7 @@ pub struct EntriesProps<'a> {
pub border_style: Style,
pub is_focussed: bool,
pub sort_mode: SortMode,
+ pub show_columns: &'a HashSet<Column>,
}
#[derive(Default)]
@@ -56,6 +58,7 @@ impl Entries {
border_style,
is_focussed,
sort_mode,
+ show_columns,
} = props.borrow();
let list = &mut self.list;
@@ -87,7 +90,7 @@ impl Entries {
let percentage_style = percentage_style(fraction, text_style);
let mut columns = Vec::new();
- if show_mtime_column(sort_mode) {
+ if show_mtime_column(sort_mode, show_columns) {
columns.push(mtime_column(
bundle.mtime,
column_style(Column::MTime, *sort_mode, text_style),
@@ -99,7 +102,7 @@ impl Entries {
column_style(Column::Bytes, *sort_mode, text_style),
));
columns.push(percentage_column(*display, fraction, percentage_style));
- if show_count_column(sort_mode) {
+ if show_count_column(sort_mode, show_columns) {
columns.push(count_column(
bundle.entry_count,
column_style(Column::Count, *sort_mode, text_style),
@@ -323,8 +326,8 @@ fn bytes_column(display: DisplayOptions, entry_size: u128, style: Style) -> Span
)
}
-#[derive(PartialEq)]
-enum Column {
+#[derive(PartialEq, Eq, Hash)]
+pub enum Column {
Bytes,
MTime,
Count,
@@ -344,18 +347,18 @@ fn column_style(column: Column, sort_mode: SortMode, style: Style) -> Style {
}
}
-fn show_mtime_column(sort_mode: &SortMode) -> bool {
+fn show_mtime_column(sort_mode: &SortMode, show_columns: &HashSet<Column>) -> bool {
matches!(
sort_mode,
SortMode::MTimeAscending | SortMode::MTimeDescending
- )
+ ) || show_columns.contains(&Column::MTime)
}
-fn show_count_column(sort_mode: &SortMode) -> bool {
+fn show_count_column(sort_mode: &SortMode, show_columns: &HashSet<Column>) -> bool {
matches!(
sort_mode,
SortMode::CountAscending | SortMode::CountDescending
- )
+ ) || show_columns.contains(&Column::Count)
}
/// Note that this implementation isn't correct as `width` is the amount of blocks to display,
diff --git a/src/interactive/widgets/help.rs b/src/interactive/widgets/help.rs
index 8ca2661..d5a481e 100644
--- a/src/interactive/widgets/help.rs
+++ b/src/interactive/widgets/help.rs
@@ -149,9 +149,11 @@ impl HelpPane {
"Toggle sort by modified time descending/ascending.",
None,
);
+ hotkey("M", "Show/hide modified time.", None);
hotkey("c", "Toggle sort by items descending/ascending.", None);
+ hotkey("C", "Show/hide item count.", None);
hotkey(
- "g",
+ "g/S",
"Cycle through percentage display and bar options.",
None,
);
diff --git a/src/interactive/widgets/main.rs b/src/interactive/widgets/main.rs
index cd3c330..46f0883 100644
--- a/src/interactive/widgets/main.rs
+++ b/src/interactive/widgets/main.rs
@@ -111,6 +111,7 @@ impl MainWindow {
border_style: entries_style,
is_focussed: matches!(state.focussed, Main),
sort_mode: state.sorting,
+ show_columns: &state.show_columns,
};
self.entries_pane
.render(props, entries_area, terminal.current_buffer_mut());