Clear recent media button

Closes: #141
This commit is contained in:
Josh Megnauth 2025-10-11 22:03:18 -04:00
parent 18be235628
commit 04c354584d
No known key found for this signature in database
GPG key ID: 70813183462EFAD3
3 changed files with 42 additions and 3 deletions

View file

@ -26,6 +26,7 @@ light = Light
file = File file = File
open-media = Open media... open-media = Open media...
open-recent-media = Open recent media open-recent-media = Open recent media
clear-recent = Clear recent list
close-file = Close file close-file = Close file
open-media-folder = Open media folder... open-media-folder = Open media folder...
open-recent-media-folder = Open recent media folder open-recent-media-folder = Open recent media folder

View file

@ -158,9 +158,11 @@ fn main() -> Result<(), Box<dyn Error>> {
pub enum Action { pub enum Action {
FileClose, FileClose,
FileOpen, FileOpen,
FileClearRecents,
FileOpenRecent(usize), FileOpenRecent(usize),
FolderClose(usize), FolderClose(usize),
FolderOpen, FolderOpen,
FolderClearRecents,
FolderOpenRecent(usize), FolderOpenRecent(usize),
Fullscreen, Fullscreen,
PlayPause, PlayPause,
@ -176,9 +178,11 @@ impl MenuAction for Action {
match self { match self {
Self::FileClose => Message::FileClose, Self::FileClose => Message::FileClose,
Self::FileOpen => Message::FileOpen, Self::FileOpen => Message::FileOpen,
Self::FileClearRecents => Message::FileClearRecents,
Self::FileOpenRecent(index) => Message::FileOpenRecent(*index), Self::FileOpenRecent(index) => Message::FileOpenRecent(*index),
Self::FolderClose(index) => Message::FolderClose(*index), Self::FolderClose(index) => Message::FolderClose(*index),
Self::FolderOpen => Message::FolderOpen, Self::FolderOpen => Message::FolderOpen,
Self::FolderClearRecents => Message::FolderClearRecents,
Self::FolderOpenRecent(index) => Message::FolderOpenRecent(*index), Self::FolderOpenRecent(index) => Message::FolderOpenRecent(*index),
Self::Fullscreen => Message::Fullscreen, Self::Fullscreen => Message::Fullscreen,
Self::PlayPause => Message::PlayPause, Self::PlayPause => Message::PlayPause,
@ -256,10 +260,12 @@ pub enum Message {
FileClose, FileClose,
FileLoad(url::Url), FileLoad(url::Url),
FileOpen, FileOpen,
FileClearRecents,
FileOpenRecent(usize), FileOpenRecent(usize),
FolderClose(usize), FolderClose(usize),
FolderLoad(PathBuf), FolderLoad(PathBuf),
FolderOpen, FolderOpen,
FolderClearRecents,
FolderOpenRecent(usize), FolderOpenRecent(usize),
MultipleLoad(Vec<url::Url>), MultipleLoad(Vec<url::Url>),
Fullscreen, Fullscreen,
@ -1065,6 +1071,10 @@ impl Application for App {
|x| x, |x| x,
); );
} }
Message::FileClearRecents => {
self.flags.config_state.recent_files.clear();
self.save_config_state();
}
Message::FileOpenRecent(index) => { Message::FileOpenRecent(index) => {
if let Some(url) = self.flags.config_state.recent_files.get(index) { if let Some(url) = self.flags.config_state.recent_files.get(index) {
return self.update(Message::FileLoad(url.clone())); return self.update(Message::FileLoad(url.clone()));
@ -1137,6 +1147,10 @@ impl Application for App {
return self.update(Message::FolderLoad(path.clone())); return self.update(Message::FolderLoad(path.clone()));
} }
} }
Message::FolderClearRecents => {
self.flags.config_state.recent_projects.clear();
self.save_config_state();
}
Message::MultipleLoad(urls) => { Message::MultipleLoad(urls) => {
log::trace!("Loading multiple URLs: {urls:?}"); log::trace!("Loading multiple URLs: {urls:?}");
let paths: Vec<_> = urls let paths: Vec<_> = urls

View file

@ -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() { for (i, path) in config_state.recent_files.iter().enumerate() {
recent_files.push(menu::Item::Button( recent_files.push(menu::Item::Button(
format_url(path), format_url(path),
Action::FileOpenRecent(i), 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() { for (i, path) in config_state.recent_projects.iter().enumerate() {
recent_projects.push(menu::Item::Button( recent_projects.push(menu::Item::Button(
format_path(path), format_path(path),
Action::FolderOpenRecent(i), 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()); let mut close_projects = Vec::with_capacity(projects.len());
for (folder_i, (name, _path)) in projects.iter().enumerate() { for (folder_i, (name, _path)) in projects.iter().enumerate() {