From 76cf9865f0835cf5282e92f1282b4016fcbf000a Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 11 Sep 2024 13:29:00 -0600 Subject: [PATCH] Add sort menu, fixes #192 --- i18n/en/cosmic_files.ftl | 9 +++++++++ src/app.rs | 4 ++++ src/menu.rs | 41 ++++++++++++++++++++++++++++++++++++++++ src/tab.rs | 5 +++++ 4 files changed, 59 insertions(+) diff --git a/i18n/en/cosmic_files.ftl b/i18n/en/cosmic_files.ftl index 8778c23..9407db7 100644 --- a/i18n/en/cosmic_files.ftl +++ b/i18n/en/cosmic_files.ftl @@ -202,3 +202,12 @@ show-hidden-files = Show hidden files list-directories-first = List directories first menu-settings = Settings... menu-about = About COSMIC Files... + +## Sort +sort = Sort +sort-a-z = A-Z +sort-z-a = Z-A +sort-newest-first = Newest first +sort-oldest-first = Oldest first +sort-smallest-to-largest = Smallest to largest +sort-largest-to-smallest = Largest to smallest \ No newline at end of file diff --git a/src/app.rs b/src/app.rs index e053814..1f234ca 100644 --- a/src/app.rs +++ b/src/app.rs @@ -115,6 +115,7 @@ pub enum Action { RestoreFromTrash, SearchActivate, SelectAll, + SetSort(HeadingOptions, bool), Settings, TabClose, TabNew, @@ -166,6 +167,9 @@ impl Action { Action::RestoreFromTrash => Message::RestoreFromTrash(entity_opt), Action::SearchActivate => Message::SearchActivate, Action::SelectAll => Message::TabMessage(entity_opt, tab::Message::SelectAll), + Action::SetSort(sort, dir) => { + Message::TabMessage(entity_opt, tab::Message::SetSort(*sort, *dir)) + } Action::Settings => Message::ToggleContextPage(ContextPage::Settings), Action::TabClose => Message::TabClose(entity_opt), Action::TabNew => Message::TabNew, diff --git a/src/menu.rs b/src/menu.rs index 16e39a2..6389f97 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -244,6 +244,16 @@ pub fn menu_bar<'a>( tab_opt: Option<&Tab>, key_binds: &HashMap, ) -> Element<'a, Message> { + let sort_item = |label, sort, dir| { + menu::Item::CheckBox( + label, + tab_opt.map_or(false, |tab| { + tab.config.sort_name == sort && tab.config.sort_direction == dir + }), + Action::SetSort(sort, dir), + ) + }; + MenuBar::new(vec![ menu::Tree::with_children( menu::root(fl!("file")), @@ -321,6 +331,37 @@ pub fn menu_bar<'a>( ], ), ), + menu::Tree::with_children( + menu::root(fl!("sort")), + menu::items( + key_binds, + vec![ + sort_item(fl!("sort-a-z"), tab::HeadingOptions::Name, true), + sort_item(fl!("sort-z-a"), tab::HeadingOptions::Name, false), + sort_item( + fl!("sort-newest-first"), + tab::HeadingOptions::Modified, + false, + ), + sort_item( + fl!("sort-oldest-first"), + tab::HeadingOptions::Modified, + true, + ), + sort_item( + fl!("sort-smallest-to-largest"), + tab::HeadingOptions::Size, + true, + ), + sort_item( + fl!("sort-largest-to-smallest"), + tab::HeadingOptions::Size, + false, + ), + //TODO: sort by type + ], + ), + ), ]) .item_height(ItemHeight::Dynamic(40)) .item_width(ItemWidth::Uniform(240)) diff --git a/src/tab.rs b/src/tab.rs index a20a4cb..70a50a0 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -797,6 +797,7 @@ pub enum Message { MiddleClick(usize), Scroll(Viewport), SelectAll, + SetSort(HeadingOptions, bool), Thumbnail(PathBuf, ItemThumbnail), ToggleFoldersFirst, ToggleShowHidden, @@ -2017,6 +2018,10 @@ impl Tab { commands.push(Command::Iced(widget::button::focus(widget::Id::unique()))); } } + Message::SetSort(heading_option, dir) => { + self.config.sort_name = heading_option; + self.config.sort_direction = dir; + } Message::Thumbnail(path, thumbnail) => { if let Some(ref mut items) = self.items_opt { for item in items.iter_mut() {