diff options
author | Piotr Wach <pwach@bloomberg.net> | 2024-01-09 22:06:12 +0000 |
---|---|---|
committer | Piotr Wach <pwach@bloomberg.net> | 2024-01-09 22:08:12 +0000 |
commit | 1544e8dffeacb55940deae2d06534d8a500765d4 (patch) | |
tree | fdbb127b95e4f162233a0893cbdb0d59b130f78d /src | |
parent | 181222745ed50b7346bfd082473168634e01fa99 (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.rs | 4 | ||||
-rw-r--r-- | src/interactive/app/handlers.rs | 18 | ||||
-rw-r--r-- | src/interactive/app/state.rs | 5 | ||||
-rw-r--r-- | src/interactive/widgets/entries.rs | 19 | ||||
-rw-r--r-- | src/interactive/widgets/help.rs | 4 | ||||
-rw-r--r-- | src/interactive/widgets/main.rs | 1 |
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()); |