diff --git a/i18n/en/cosmic_player.ftl b/i18n/en/cosmic_player.ftl index 49e8950..ede9bc2 100644 --- a/i18n/en/cosmic_player.ftl +++ b/i18n/en/cosmic_player.ftl @@ -26,8 +26,9 @@ light = Light file = File open-media = Open media... open-recent-media = Open recent media +clear-recent = Clear recent list close-file = Close file open-media-folder = Open media folder... open-recent-media-folder = Open recent media folder close-media-folder = Close media folder -quit = Quit \ No newline at end of file +quit = Quit diff --git a/src/main.rs b/src/main.rs index 8745fd7..53f6c1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -158,9 +158,11 @@ fn main() -> Result<(), Box> { pub enum Action { FileClose, FileOpen, + FileClearRecents, FileOpenRecent(usize), FolderClose(usize), FolderOpen, + FolderClearRecents, FolderOpenRecent(usize), Fullscreen, PlayPause, @@ -176,9 +178,11 @@ impl MenuAction for Action { match self { Self::FileClose => Message::FileClose, Self::FileOpen => Message::FileOpen, + Self::FileClearRecents => Message::FileClearRecents, Self::FileOpenRecent(index) => Message::FileOpenRecent(*index), Self::FolderClose(index) => Message::FolderClose(*index), Self::FolderOpen => Message::FolderOpen, + Self::FolderClearRecents => Message::FolderClearRecents, Self::FolderOpenRecent(index) => Message::FolderOpenRecent(*index), Self::Fullscreen => Message::Fullscreen, Self::PlayPause => Message::PlayPause, @@ -256,10 +260,12 @@ pub enum Message { FileClose, FileLoad(url::Url), FileOpen, + FileClearRecents, FileOpenRecent(usize), FolderClose(usize), FolderLoad(PathBuf), FolderOpen, + FolderClearRecents, FolderOpenRecent(usize), MultipleLoad(Vec), Fullscreen, @@ -1065,6 +1071,10 @@ impl Application for App { |x| x, ); } + Message::FileClearRecents => { + self.flags.config_state.recent_files.clear(); + self.save_config_state(); + } Message::FileOpenRecent(index) => { if let Some(url) = self.flags.config_state.recent_files.get(index) { return self.update(Message::FileLoad(url.clone())); @@ -1137,6 +1147,10 @@ impl Application for App { return self.update(Message::FolderLoad(path.clone())); } } + Message::FolderClearRecents => { + self.flags.config_state.recent_projects.clear(); + self.save_config_state(); + } Message::MultipleLoad(urls) => { log::trace!("Loading multiple URLs: {urls:?}"); let paths: Vec<_> = urls diff --git a/src/menu.rs b/src/menu.rs index 2a1fc5d..e277db1 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -31,21 +31,45 @@ pub fn menu_bar<'a>( } }; - let mut recent_files = Vec::with_capacity(config_state.recent_files.len()); + let files_len = if config_state.recent_files.is_empty() { + 0 + } else { + config_state.recent_files.len() + 2 + }; + let mut recent_files = Vec::with_capacity(files_len); for (i, path) in config_state.recent_files.iter().enumerate() { recent_files.push(menu::Item::Button( format_url(path), Action::FileOpenRecent(i), )); } + if files_len > 0 { + recent_files.push(menu::Item::Divider); + recent_files.push(menu::Item::Button( + fl!("clear-recent"), + Action::FileClearRecents, + )); + } - let mut recent_projects = Vec::with_capacity(config_state.recent_projects.len()); + let projects_len = if config_state.recent_projects.is_empty() { + 0 + } else { + config_state.recent_projects.len() + 2 + }; + let mut recent_projects = Vec::with_capacity(projects_len); for (i, path) in config_state.recent_projects.iter().enumerate() { recent_projects.push(menu::Item::Button( format_path(path), Action::FolderOpenRecent(i), )); } + if projects_len > 0 { + recent_projects.push(menu::Item::Divider); + recent_projects.push(menu::Item::Button( + fl!("clear-recent"), + Action::FolderClearRecents, + )); + } let mut close_projects = Vec::with_capacity(projects.len()); for (folder_i, (name, _path)) in projects.iter().enumerate() {