From 4965a9f005d3ea99d657384d6bfe54a3cf958ff0 Mon Sep 17 00:00:00 2001 From: Observer KRypt0n_ Date: Sat, 11 Feb 2023 11:12:57 +0200 Subject: [PATCH] Settings: added toast messages on errors --- assets/locales/en/errors.ftl | 3 ++ assets/locales/en/main.ftl | 2 ++ assets/locales/ru/errors.ftl | 3 ++ assets/locales/ru/main.ftl | 2 ++ src/ui/components/list.rs | 8 ++--- src/ui/preferences/main.rs | 68 ++++++++++++++++++++++++++++++------ 6 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 assets/locales/en/errors.ftl create mode 100644 assets/locales/ru/errors.ftl diff --git a/assets/locales/en/errors.ftl b/assets/locales/en/errors.ftl new file mode 100644 index 0000000..86cb4d8 --- /dev/null +++ b/assets/locales/en/errors.ftl @@ -0,0 +1,3 @@ +config-flush-error = Failed to flush config +wine-prefix-update-failed = Failed to update wine prefix +dxvk-install-failed = Failed to install DXVK diff --git a/assets/locales/en/main.ftl b/assets/locales/en/main.ftl index d6e49c1..2e749ed 100644 --- a/assets/locales/en/main.ftl +++ b/assets/locales/en/main.ftl @@ -1,6 +1,8 @@ custom = Custom none = None default = Default +details = Details +close = Close checking-free-space = Checking free space diff --git a/assets/locales/ru/errors.ftl b/assets/locales/ru/errors.ftl new file mode 100644 index 0000000..814f0b0 --- /dev/null +++ b/assets/locales/ru/errors.ftl @@ -0,0 +1,3 @@ +config-flush-error = Ошибка сохранения настроек +wine-prefix-update-failed = Ошибка обновления префикса Wine +dxvk-install-failed = Ошибка установки DXVK diff --git a/assets/locales/ru/main.ftl b/assets/locales/ru/main.ftl index dd7e0d1..f06f0c2 100644 --- a/assets/locales/ru/main.ftl +++ b/assets/locales/ru/main.ftl @@ -1,6 +1,8 @@ custom = Свое значение none = Нет default = По умолчанию +details = Подробнее +close = Закрыть checking-free-space = Проверка свободного места diff --git a/src/ui/components/list.rs b/src/ui/components/list.rs index c40537e..5516105 100644 --- a/src/ui/components/list.rs +++ b/src/ui/components/list.rs @@ -79,13 +79,13 @@ impl SimpleAsyncComponent for ComponentsList { } #[allow(unused_must_use)] - AppMsg::CallOnDownloaded => if let Some(on_downloaded) = self.init.on_downloaded { - sender.output(on_downloaded); + AppMsg::CallOnDownloaded => if let Some(on_downloaded) = &self.init.on_downloaded { + sender.output(on_downloaded.to_owned()); } #[allow(unused_must_use)] - AppMsg::CallOnDeleted => if let Some(on_deleted) = self.init.on_deleted { - sender.output(on_deleted); + AppMsg::CallOnDeleted => if let Some(on_deleted) = &self.init.on_deleted { + sender.output(on_deleted.to_owned()); } } } diff --git a/src/ui/preferences/main.rs b/src/ui/preferences/main.rs index fc7ae39..7b10b22 100644 --- a/src/ui/preferences/main.rs +++ b/src/ui/preferences/main.rs @@ -14,6 +14,8 @@ use crate::is_ready; use crate::CONFIG; +pub static mut PREFERENCES_WINDOW: Option = None; + pub struct App { wine_components: AsyncController, dxvk_components: AsyncController, @@ -28,8 +30,12 @@ pub struct App { selecting_dxvk_version: bool } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] pub enum AppMsg { + Toast { + title: String, + description: Option + }, WineRecommendedOnly(bool), DxvkRecommendedOnly(bool), UpdateDownloadedWine, @@ -47,7 +53,6 @@ impl SimpleAsyncComponent for App { type Output = (); view! { - #[root] preferences_window = adw::PreferencesWindow { set_title: Some(&tr("preferences")), set_default_size: (700, 560), @@ -141,9 +146,14 @@ impl SimpleAsyncComponent for App { #[template] add = &super::enhancements::Enhancements, - - connect_close_request => |_| { - anime_launcher_sdk::config::flush().unwrap(); // FIXME + + connect_close_request[sender] => move |_| { + if let Err(err) = anime_launcher_sdk::config::flush() { + sender.input(AppMsg::Toast { + title: tr("config-flush-error"), + description: Some(err.to_string()) + }); + } gtk::Inhibit::default() } @@ -195,6 +205,10 @@ impl SimpleAsyncComponent for App { widgets.preferences_window.set_transient_for(Some(&parent)); + unsafe { + PREFERENCES_WINDOW = Some(widgets.preferences_window.clone()); + } + sender.input(AppMsg::UpdateDownloadedWine); sender.input(AppMsg::UpdateDownloadedDxvk); @@ -205,6 +219,26 @@ impl SimpleAsyncComponent for App { tracing::debug!("Called preferences window event: {:?}", msg); match msg { + AppMsg::Toast { title, description } => unsafe { + let toast = adw::Toast::new(&title); + + toast.set_timeout(5000); + + if let Some(description) = description { + toast.set_button_label(Some(&tr("details"))); + + let dialog = adw::MessageDialog::new(PREFERENCES_WINDOW.as_ref(), Some(&title), Some(&description)); + + dialog.add_response("close", &tr("close")); + + toast.connect_button_clicked(move |_| { + dialog.show(); + }); + } + + PREFERENCES_WINDOW.as_ref().unwrap_unchecked().add_toast(&toast); + } + AppMsg::WineRecommendedOnly(state) => { // todo self.wine_components.sender().send(components::list::AppMsg::ShowRecommendedOnly(state)).unwrap(); @@ -269,12 +303,20 @@ impl SimpleAsyncComponent for App { let wine_name = version.name.to_string(); std::thread::spawn(move || { - wine.update_prefix(&config.game.wine.prefix) - .expect("Failed to update wine prefix"); + match wine.update_prefix(&config.game.wine.prefix) { + Ok(_) => { + config.game.wine.selected = Some(wine_name); - config.game.wine.selected = Some(wine_name); + config::update(config); + } - config::update(config); + Err(err) => { + sender.input(AppMsg::Toast { + title: tr("wine-prefix-update-failed"), + description: Some(err.to_string()) + }); + } + } sender.input(AppMsg::ResetWineSelection(index)); }); @@ -305,8 +347,12 @@ impl SimpleAsyncComponent for App { let dxvk_folder = config.game.dxvk.builds.join(&version.name); std::thread::spawn(move || { - Dxvk::install(&wine, dxvk_folder, InstallParams::default()) - .expect("Failed to install dxvk"); + if let Err(err) = Dxvk::install(&wine, dxvk_folder, InstallParams::default()) { + sender.input(AppMsg::Toast { + title: tr("dxvk-install-failed"), + description: Some(err.to_string()) + }); + } sender.input(AppMsg::ResetDxvkSelection(index)); });