diff --git a/desktop/assets/texts/en-US/preferences_dialog.ftl b/desktop/assets/texts/en-US/preferences_dialog.ftl index 7ac662933..f8e2b1a83 100644 --- a/desktop/assets/texts/en-US/preferences_dialog.ftl +++ b/desktop/assets/texts/en-US/preferences_dialog.ftl @@ -22,4 +22,5 @@ storage-backend = Save-File Location storage-backend-disk = Disk storage-backend-memory = Memory -recent-limit = Recent Limit \ No newline at end of file +recent-limit = Recent Limit +recent-clear = Clear \ No newline at end of file diff --git a/desktop/src/gui/dialogs/preferences_dialog.rs b/desktop/src/gui/dialogs/preferences_dialog.rs index 977b884e0..06da0e00d 100644 --- a/desktop/src/gui/dialogs/preferences_dialog.rs +++ b/desktop/src/gui/dialogs/preferences_dialog.rs @@ -324,12 +324,22 @@ impl PreferencesDialog { fn show_misc_preferences(&mut self, locale: &LanguageIdentifier, ui: &mut Ui) { ui.label(text(locale, "recent-limit")); - let previous = self.recent_limit; - DragValue::new(&mut self.recent_limit).ui(ui); + ui.horizontal(|ui| { + let previous = self.recent_limit; + DragValue::new(&mut self.recent_limit).ui(ui); - if self.recent_limit != previous { - self.recent_limit_changed = true; - } + if self.recent_limit != previous { + self.recent_limit_changed = true; + } + + if ui.button(text(locale, "recent-clear")).clicked() { + if let Err(e) = self.preferences.write_recents(|writer| { + writer.clear(); + }) { + tracing::warn!("Couldn't update recents: {e}"); + } + } + }); ui.end_row() } diff --git a/frontend-utils/src/recents/write.rs b/frontend-utils/src/recents/write.rs index f2a3d05f2..9932ee7cd 100644 --- a/frontend-utils/src/recents/write.rs +++ b/frontend-utils/src/recents/write.rs @@ -1,7 +1,7 @@ use crate::parse::DocumentHolder; use crate::recents::{Recent, Recents}; use crate::write::TableExt; -use toml_edit::{value, Table}; +use toml_edit::{value, ArrayOfTables, Table}; pub struct RecentsWriter<'a>(&'a mut DocumentHolder); @@ -10,11 +10,23 @@ impl<'a> RecentsWriter<'a> { Self(recents) } + fn with_underlying_table(&mut self, fun: impl FnOnce(&mut Recents, &mut ArrayOfTables)) { + self.0.edit(|values, toml_document| { + let table = toml_document.get_or_create_array_of_tables("recent"); + fun(values, table) + }) + } + + pub fn clear(&mut self) { + self.with_underlying_table(|values, array| { + array.clear(); + values.clear(); + }); + } + /// Pushes a new recent entry on the entry stack, if same entry already exists, it will get moved to the top. pub fn push(&mut self, recent: Recent, limit: usize) { - self.0.edit(|values, toml_document| { - let array = toml_document.get_or_create_array_of_tables("recent"); - + self.with_underlying_table(|values, array| { // First, lets check if we already have existing entry with the same URL and move it to the top. let existing = values.iter().position(|x| x.url == recent.url); @@ -92,4 +104,9 @@ mod tests { url: Url::parse("file:///very_important_file.swf").unwrap(), }, 3), "[[recent]]\nurl = \"file:///2.swf\"\n[[recent]]\nurl = \"file:///3.swf\"\n\n[[recent]]\nurl = \"file:///very_important_file.swf\"\n"); } + + #[test] + fn clear() { + test("[[recent]]\nurl = \"file:///file_one.swf\"\n[[recent]]\nurl = \"file:///file_two.swf\"\n[[recent]]\nurl = \"file:///3.swf\"\n", |writer| writer.clear(), ""); + } }