Settings: added toast messages on errors

This commit is contained in:
Observer KRypt0n_ 2023-02-11 11:12:57 +02:00
parent 036beac9d8
commit 4965a9f005
No known key found for this signature in database
GPG key ID: 844DA47BA25FE1E2
6 changed files with 71 additions and 15 deletions

View file

@ -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

View file

@ -1,6 +1,8 @@
custom = Custom custom = Custom
none = None none = None
default = Default default = Default
details = Details
close = Close
checking-free-space = Checking free space checking-free-space = Checking free space

View file

@ -0,0 +1,3 @@
config-flush-error = Ошибка сохранения настроек
wine-prefix-update-failed = Ошибка обновления префикса Wine
dxvk-install-failed = Ошибка установки DXVK

View file

@ -1,6 +1,8 @@
custom = Свое значение custom = Свое значение
none = Нет none = Нет
default = По умолчанию default = По умолчанию
details = Подробнее
close = Закрыть
checking-free-space = Проверка свободного места checking-free-space = Проверка свободного места

View file

@ -79,13 +79,13 @@ impl SimpleAsyncComponent for ComponentsList {
} }
#[allow(unused_must_use)] #[allow(unused_must_use)]
AppMsg::CallOnDownloaded => if let Some(on_downloaded) = self.init.on_downloaded { AppMsg::CallOnDownloaded => if let Some(on_downloaded) = &self.init.on_downloaded {
sender.output(on_downloaded); sender.output(on_downloaded.to_owned());
} }
#[allow(unused_must_use)] #[allow(unused_must_use)]
AppMsg::CallOnDeleted => if let Some(on_deleted) = self.init.on_deleted { AppMsg::CallOnDeleted => if let Some(on_deleted) = &self.init.on_deleted {
sender.output(on_deleted); sender.output(on_deleted.to_owned());
} }
} }
} }

View file

@ -14,6 +14,8 @@ use crate::is_ready;
use crate::CONFIG; use crate::CONFIG;
pub static mut PREFERENCES_WINDOW: Option<adw::PreferencesWindow> = None;
pub struct App { pub struct App {
wine_components: AsyncController<ComponentsList>, wine_components: AsyncController<ComponentsList>,
dxvk_components: AsyncController<ComponentsList>, dxvk_components: AsyncController<ComponentsList>,
@ -28,8 +30,12 @@ pub struct App {
selecting_dxvk_version: bool selecting_dxvk_version: bool
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone)]
pub enum AppMsg { pub enum AppMsg {
Toast {
title: String,
description: Option<String>
},
WineRecommendedOnly(bool), WineRecommendedOnly(bool),
DxvkRecommendedOnly(bool), DxvkRecommendedOnly(bool),
UpdateDownloadedWine, UpdateDownloadedWine,
@ -47,7 +53,6 @@ impl SimpleAsyncComponent for App {
type Output = (); type Output = ();
view! { view! {
#[root]
preferences_window = adw::PreferencesWindow { preferences_window = adw::PreferencesWindow {
set_title: Some(&tr("preferences")), set_title: Some(&tr("preferences")),
set_default_size: (700, 560), set_default_size: (700, 560),
@ -141,9 +146,14 @@ impl SimpleAsyncComponent for App {
#[template] #[template]
add = &super::enhancements::Enhancements, add = &super::enhancements::Enhancements,
connect_close_request => |_| { connect_close_request[sender] => move |_| {
anime_launcher_sdk::config::flush().unwrap(); // FIXME 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() gtk::Inhibit::default()
} }
@ -195,6 +205,10 @@ impl SimpleAsyncComponent for App {
widgets.preferences_window.set_transient_for(Some(&parent)); widgets.preferences_window.set_transient_for(Some(&parent));
unsafe {
PREFERENCES_WINDOW = Some(widgets.preferences_window.clone());
}
sender.input(AppMsg::UpdateDownloadedWine); sender.input(AppMsg::UpdateDownloadedWine);
sender.input(AppMsg::UpdateDownloadedDxvk); sender.input(AppMsg::UpdateDownloadedDxvk);
@ -205,6 +219,26 @@ impl SimpleAsyncComponent for App {
tracing::debug!("Called preferences window event: {:?}", msg); tracing::debug!("Called preferences window event: {:?}", msg);
match 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) => { AppMsg::WineRecommendedOnly(state) => {
// todo // todo
self.wine_components.sender().send(components::list::AppMsg::ShowRecommendedOnly(state)).unwrap(); 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(); let wine_name = version.name.to_string();
std::thread::spawn(move || { std::thread::spawn(move || {
wine.update_prefix(&config.game.wine.prefix) match wine.update_prefix(&config.game.wine.prefix) {
.expect("Failed to update 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)); sender.input(AppMsg::ResetWineSelection(index));
}); });
@ -305,8 +347,12 @@ impl SimpleAsyncComponent for App {
let dxvk_folder = config.game.dxvk.builds.join(&version.name); let dxvk_folder = config.game.dxvk.builds.join(&version.name);
std::thread::spawn(move || { std::thread::spawn(move || {
Dxvk::install(&wine, dxvk_folder, InstallParams::default()) if let Err(err) = Dxvk::install(&wine, dxvk_folder, InstallParams::default()) {
.expect("Failed to install dxvk"); sender.input(AppMsg::Toast {
title: tr("dxvk-install-failed"),
description: Some(err.to_string())
});
}
sender.input(AppMsg::ResetDxvkSelection(index)); sender.input(AppMsg::ResetDxvkSelection(index));
}); });