From 172241457abefdaa1fe4ab39c9e548a6641f8873 Mon Sep 17 00:00:00 2001 From: Observer KRypt0n_ Date: Mon, 13 Nov 2023 21:18:38 +0200 Subject: [PATCH] feat(ui): added new patch status, fixed voiceovers issue --- Cargo.lock | 8 +-- Cargo.toml | 4 +- src/ui/main/mod.rs | 128 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 106 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5155c70..755d29e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,8 +57,8 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "anime-game-core" -version = "1.17.0" -source = "git+https://github.com/an-anime-team/anime-game-core?tag=1.17.0#e2cd6d91ef80d9fba72e0abe2e71b802d558dd75" +version = "1.17.2" +source = "git+https://github.com/an-anime-team/anime-game-core?tag=1.17.2#11b51441ed0390b7a5ba20e62e3c28a6886f8b97" dependencies = [ "anyhow", "bzip2", @@ -82,8 +82,8 @@ dependencies = [ [[package]] name = "anime-launcher-sdk" -version = "1.12.0" -source = "git+https://github.com/an-anime-team/anime-launcher-sdk?tag=1.12.0#eaa6db3a68c6c73120589185e78c707945d7723f" +version = "1.12.2" +source = "git+https://github.com/an-anime-team/anime-launcher-sdk?tag=1.12.2#923a389dffe44c2076bbacb7085084069fbaee4f" dependencies = [ "anime-game-core", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 7bfeef0..5f661aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "honkers-railway-launcher" version = "1.4.0" description = "The Honkers Railway launcher" -authors = ["Nikita Podvirnyy "] +authors = ["Nikita Podvirnyy "] homepage = "https://github.com/an-anime-team/the-honkers-railway-launcher" repository = "https://github.com/an-anime-team/the-honkers-railway-launcher" license = "GPL-3.0" @@ -19,7 +19,7 @@ glib-build-tools = "0.18" [dependencies.anime-launcher-sdk] git = "https://github.com/an-anime-team/anime-launcher-sdk" -tag = "1.12.0" +tag = "1.12.2" features = ["all", "star-rail", "star-rail-patch"] # path = "../anime-launcher-sdk" # ! for dev purposes only diff --git a/src/ui/main/mod.rs b/src/ui/main/mod.rs index 8fbfa47..1adb734 100644 --- a/src/ui/main/mod.rs +++ b/src/ui/main/mod.rs @@ -303,12 +303,21 @@ impl SimpleComponent for App { #[watch] set_tooltip_text: Some(&tr!("predownload-update", { "version" = match model.state.as_ref() { - Some(LauncherState::PredownloadAvailable { diff, .. }) => diff.latest().to_string(), + Some(LauncherState::PredownloadAvailable { game, .. }) => game.latest().to_string(), _ => String::from("?") }, "size" = match model.state.as_ref() { - Some(LauncherState::PredownloadAvailable { diff, .. }) => prettify_bytes(diff.downloaded_size().unwrap_or(0)), + Some(LauncherState::PredownloadAvailable { game, voices, .. }) => { + let mut size = game.downloaded_size().unwrap_or(0); + + for voice in voices { + size += voice.downloaded_size().unwrap_or(0); + } + + prettify_bytes(size) + } + _ => String::from("?") } })), @@ -318,13 +327,27 @@ impl SimpleComponent for App { #[watch] set_sensitive: match model.state.as_ref() { - Some(LauncherState::PredownloadAvailable { diff, .. }) => { + Some(LauncherState::PredownloadAvailable { game, voices, .. }) => { let config = Config::get().unwrap(); let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir); - !temp.join(diff.file_name().unwrap()).metadata() - .map(|metadata| Some(metadata.len()) == diff.downloaded_size()) - .unwrap_or(false) + let mut downloaded = temp.join(game.file_name().unwrap()).metadata() + .map(|metadata| Some(metadata.len()) == game.downloaded_size()) + .unwrap_or(false); + + if downloaded { + for voice in voices { + downloaded = !temp.join(voice.file_name().unwrap()).metadata() + .map(|metadata| Some(metadata.len()) == voice.downloaded_size()) + .unwrap_or(false); + + if downloaded { + break; + } + } + } + + !downloaded } _ => false @@ -332,14 +355,26 @@ impl SimpleComponent for App { #[watch] set_css_classes: match model.state.as_ref() { - Some(LauncherState::PredownloadAvailable { diff, .. }) => { + Some(LauncherState::PredownloadAvailable { game, voices, .. }) => { let config = Config::get().unwrap(); let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir); - let downloaded = temp.join(diff.file_name().unwrap()).metadata() - .map(|metadata| Some(metadata.len()) == diff.downloaded_size()) + let mut downloaded = temp.join(game.file_name().unwrap()).metadata() + .map(|metadata| Some(metadata.len()) == game.downloaded_size()) .unwrap_or(false); + if downloaded { + for voice in voices { + downloaded = !temp.join(voice.file_name().unwrap()).metadata() + .map(|metadata| Some(metadata.len()) == voice.downloaded_size()) + .unwrap_or(false); + + if downloaded { + break; + } + } + } + if downloaded { &["success", "circular"] } else { @@ -369,8 +404,10 @@ impl SimpleComponent for App { set_icon_name: match &model.state { Some(LauncherState::Launch) | Some(LauncherState::PatchNotVerified) | + Some(LauncherState::PatchConcerning) | Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. }) | - Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. }) + Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. }) | + Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. }) => "media-playback-start-symbolic", Some(LauncherState::PatchNotInstalled) | @@ -382,9 +419,12 @@ impl SimpleComponent for App { Some(LauncherState::PrefixNotExists) => "document-save-symbolic", Some(LauncherState::GameUpdateAvailable(_)) | - Some(LauncherState::GameNotInstalled(_)) => "document-save-symbolic", + Some(LauncherState::GameNotInstalled(_)) | + Some(LauncherState::VoiceUpdateAvailable(_)) | + Some(LauncherState::VoiceNotInstalled(_)) => "document-save-symbolic", Some(LauncherState::GameOutdated(_)) | + Some(LauncherState::VoiceOutdated(_)) | Some(LauncherState::PatchBroken) | Some(LauncherState::PatchUnsafe) | Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) | @@ -396,8 +436,10 @@ impl SimpleComponent for App { set_label: &match &model.state { Some(LauncherState::Launch) | Some(LauncherState::PatchNotVerified) | + Some(LauncherState::PatchConcerning) | Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. }) | - Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. }) + Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. }) | + Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. }) => tr!("launch"), Some(LauncherState::PatchNotInstalled) | @@ -417,7 +459,9 @@ impl SimpleComponent for App { Some(LauncherState::PrefixNotExists) => tr!("create-prefix"), Some(LauncherState::GameUpdateAvailable(diff)) | - Some(LauncherState::GameOutdated(diff)) => { + Some(LauncherState::GameOutdated(diff)) | + Some(LauncherState::VoiceUpdateAvailable(diff)) | + Some(LauncherState::VoiceOutdated(diff)) => { match (Config::get(), diff.file_name()) { (Ok(config), Some(filename)) => { let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir); @@ -435,7 +479,8 @@ impl SimpleComponent for App { } }, - Some(LauncherState::GameNotInstalled(_)) => tr!("download"), + Some(LauncherState::GameNotInstalled(_)) | + Some(LauncherState::VoiceNotInstalled(_)) => tr!("download"), None => String::from("...") } @@ -444,6 +489,7 @@ impl SimpleComponent for App { #[watch] set_sensitive: !model.disabled_buttons && match &model.state { Some(LauncherState::GameOutdated { .. }) | + Some(LauncherState::VoiceOutdated(_)) | Some(LauncherState::PatchBroken) | Some(LauncherState::PatchUnsafe) | Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) | @@ -456,12 +502,15 @@ impl SimpleComponent for App { #[watch] set_css_classes: match &model.state { Some(LauncherState::GameOutdated { .. }) | + Some(LauncherState::VoiceOutdated(_)) | Some(LauncherState::PatchNotVerified) => &["warning", "pill"], Some(LauncherState::PatchBroken) | Some(LauncherState::PatchUnsafe) | Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) | - Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) => &["error", "pill"], + Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) | + Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. }) + => &["error", "pill"], Some(_) => &["suggested-action", "pill"], None => &["pill"] @@ -469,7 +518,8 @@ impl SimpleComponent for App { #[watch] set_tooltip_text: Some(&match &model.state { - Some(LauncherState::GameOutdated { .. }) => tr!("main-window--version-outdated-tooltip"), + Some(LauncherState::GameOutdated { .. }) | + Some(LauncherState::VoiceOutdated(_)) => tr!("main-window--version-outdated-tooltip"), Some(LauncherState::PatchNotVerified) => tr!("patch-testing-tooltip"), @@ -477,8 +527,12 @@ impl SimpleComponent for App { Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) => tr!("patch-broken-tooltip"), + // TODO: a special tooltip for concerning patch state + Some(LauncherState::PatchUnsafe) | - Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) + Some(LauncherState::PatchConcerning) | + Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) | + Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. }) => tr!("patch-unsafe-tooltip"), _ => String::new() @@ -965,6 +1019,12 @@ impl SimpleComponent for App { sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--game"))))); } + StateUpdating::Voice(locale) => { + sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--voice", { + "locale" = locale.to_name() + }))))); + } + StateUpdating::Patch => { sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--patch"))))); } @@ -1047,7 +1107,7 @@ impl SimpleComponent for App { #[allow(unused_must_use)] AppMsg::PredownloadUpdate => { - if let Some(LauncherState::PredownloadAvailable { mut diff, .. }) = self.state.clone() { + if let Some(LauncherState::PredownloadAvailable { game, mut voices, .. }) = self.state.clone() { let tmp = Config::get().unwrap().launcher.temp.unwrap_or_else(std::env::temp_dir); self.downloading = true; @@ -1056,18 +1116,26 @@ impl SimpleComponent for App { progress_bar_input.send(ProgressBarMsg::UpdateCaption(Some(tr!("downloading")))); + let mut diffs: Vec = vec![game]; + + diffs.append(&mut voices); + std::thread::spawn(move || { - let result = diff.download_to(&tmp, clone!(@strong progress_bar_input => move |curr, total| { - progress_bar_input.send(ProgressBarMsg::UpdateProgress(curr, total)); - })); + for mut diff in diffs { + let result = diff.download_to(&tmp, clone!(@strong progress_bar_input => move |curr, total| { + progress_bar_input.send(ProgressBarMsg::UpdateProgress(curr, total)); + })); - if let Err(err) = result { - sender.input(AppMsg::Toast { - title: tr!("downloading-failed"), - description: Some(err.to_string()) - }); + if let Err(err) = result { + sender.input(AppMsg::Toast { + title: tr!("downloading-failed"), + description: Some(err.to_string()) + }); - tracing::error!("Failed to predownload update: {err}"); + tracing::error!("Failed to predownload update: {err}"); + + break; + } } sender.input(AppMsg::SetDownloading(false)); @@ -1082,8 +1150,10 @@ impl SimpleComponent for App { AppMsg::PerformAction => unsafe { match self.state.as_ref().unwrap_unchecked() { LauncherState::PatchNotVerified | + LauncherState::PatchConcerning | LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. } | LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. } | + LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. } | LauncherState::Launch => launch::launch(sender), LauncherState::PatchNotInstalled | @@ -1095,7 +1165,9 @@ impl SimpleComponent for App { LauncherState::PrefixNotExists => create_prefix::create_prefix(sender), LauncherState::GameUpdateAvailable(diff) | - LauncherState::GameNotInstalled(diff) => + LauncherState::GameNotInstalled(diff) | + LauncherState::VoiceUpdateAvailable(diff) | + LauncherState::VoiceNotInstalled(diff) => download_diff::download_diff(sender, self.progress_bar.sender().to_owned(), diff.to_owned()), _ => ()