diff --git a/Cargo.lock b/Cargo.lock index d2f5e5a..5c2c625 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,7 +31,7 @@ dependencies = [ [[package]] name = "anime-game-core" -version = "1.3.7" +version = "1.3.8" dependencies = [ "anyhow", "bzip2", @@ -76,7 +76,7 @@ dependencies = [ [[package]] name = "anime-launcher-sdk" -version = "0.2.5" +version = "0.3.0" dependencies = [ "anime-game-core", "anyhow", diff --git a/anime-launcher-sdk b/anime-launcher-sdk index 9d6aeff..42b738d 160000 --- a/anime-launcher-sdk +++ b/anime-launcher-sdk @@ -1 +1 @@ -Subproject commit 9d6aeff5265999f724ff6caf288007a0756f1415 +Subproject commit 42b738dc1ec5be8e6ced48501604622b8d0ab91e diff --git a/src/ui/components/mod.rs b/src/ui/components/mod.rs index 6e93fc5..d8de85f 100644 --- a/src/ui/components/mod.rs +++ b/src/ui/components/mod.rs @@ -27,7 +27,7 @@ pub struct ComponentsListGroup { impl From for ComponentsListGroup { fn from(group: wine::Group) -> Self { Self { - title: group.name, + title: group.title, versions: group.versions.into_iter().map(|version| version.into()).collect() } } @@ -56,7 +56,7 @@ impl From for ComponentsListVersion { name: version.name, title: version.title, uri: version.uri, - recommended: version.recommended + recommended: true // FIXME } } } @@ -67,7 +67,7 @@ impl From for ComponentsListVersion { name: version.name.clone(), title: version.name, uri: version.uri, - recommended: version.recommended + recommended: true // FIXME } } } diff --git a/src/ui/first_run/download_components.rs b/src/ui/first_run/download_components.rs index 5c0954d..ca1cec7 100644 --- a/src/ui/first_run/download_components.rs +++ b/src/ui/first_run/download_components.rs @@ -13,7 +13,7 @@ use std::path::PathBuf; use super::main::FirstRunAppMsg; use crate::ui::components::*; use crate::i18n::*; -use crate::FIRST_RUN_FILE; +use crate::*; fn get_installer(uri: &str, temp: Option<&PathBuf>, speed_limit: u64) -> anyhow::Result { let mut installer = Installer::new(uri)?; @@ -264,8 +264,9 @@ impl SimpleAsyncComponent for DownloadComponentsApp { wine_combo: adw::ComboRow::new(), dxvk_combo: adw::ComboRow::new(), - wine_versions: wine::get_groups()[0].versions.clone().into_iter().filter(|version| version.recommended).collect(), - dxvk_versions: dxvk::get_groups()[0].versions.clone().into_iter().filter(|version| version.recommended).collect(), + // FIXME: .filter(|version| version.recommended) + wine_versions: wine::get_groups(&CONFIG.components.path).unwrap_or_default()[0].versions.clone().into_iter().collect(), + dxvk_versions: dxvk::get_groups(&CONFIG.components.path).unwrap_or_default()[0].versions.clone().into_iter().collect(), downloading_wine: None, creating_prefix: None, diff --git a/src/ui/main.rs b/src/ui/main.rs index 0940b99..ac060cf 100644 --- a/src/ui/main.rs +++ b/src/ui/main.rs @@ -13,6 +13,7 @@ use gtk::glib::clone; use anime_launcher_sdk::config::launcher::LauncherStyle; use anime_launcher_sdk::states::LauncherState; use anime_launcher_sdk::wincompatlib::prelude::*; +use anime_launcher_sdk::components::loader::ComponentsLoader; use anime_launcher_sdk::components::wine; use std::path::Path; @@ -600,6 +601,43 @@ impl SimpleComponent for App { } } + // Update components index + + sender.input(AppMsg::SetLoadingStatus(Some(Some(String::from("Updating components index"))))); + + let components = ComponentsLoader::new(&CONFIG.components.path); + + match components.is_sync(&CONFIG.components.servers) { + Ok(true) => (), + + Ok(false) => { + for host in &CONFIG.components.servers { + match components.sync(host) { + Ok(true) => break, + Ok(false) => continue, + + Err(err) => { + tracing::error!("Failed to sync components index"); + + sender.input(AppMsg::Toast { + title: String::from("Failed to sync components index"), + description: Some(err.to_string()) + }); + } + } + } + } + + Err(err) => { + tracing::error!("Failed to verify that components index synced"); + + sender.input(AppMsg::Toast { + title: String::from("Failed to verify components index"), + description: Some(err.to_string()) + }); + } + } + // Update initial game version status sender.input(AppMsg::SetLoadingStatus(Some(Some(tr("loading-game-version"))))); @@ -1050,16 +1088,17 @@ impl SimpleComponent for App { LauncherState::WineNotInstalled => { let mut config = config::get().unwrap(); - match wine::get_downloaded(&config.game.wine.builds) { + match wine::get_downloaded(&CONFIG.components.path, &config.game.wine.builds) { Ok(list) => { - if let Some(version) = list.into_iter().find(|version| version.recommended) { - config.game.wine.selected = Some(version.name); + // FIXME: .find(|version| version.recommended) + if !list.is_empty() { + config.game.wine.selected = Some(list[0].name.clone()); config::update(config.clone()); } if config.game.wine.selected.is_none() { - let wine = wine::Version::latest(); + let wine = wine::Version::latest(&CONFIG.components.path).expect("Failed to get latest wine version"); match Installer::new(wine.uri) { Ok(mut installer) => { @@ -1134,12 +1173,13 @@ impl SimpleComponent for App { LauncherState::PrefixNotExists => { let config = config::get().unwrap(); - match config.try_get_wine_executable() { - Some(wine) => { + match config.try_get_selected_wine_info() { + Ok(Some(wine)) => { sender.input(AppMsg::DisableButtons(true)); std::thread::spawn(move || { - let wine = Wine::from_binary(wine) + let wine = wine + .to_wine(Some(config.game.wine.builds.join(&wine.name))) .with_loader(WineLoader::Current) .with_arch(WineArch::Win64); @@ -1160,7 +1200,7 @@ impl SimpleComponent for App { }); } - None => { + Ok(None) => { tracing::error!("Failed to get selected wine executable"); sender.input(AppMsg::Toast { @@ -1168,6 +1208,15 @@ impl SimpleComponent for App { description: None }); } + + Err(err) => { + tracing::error!("Failed to get selected wine executable: {err}"); + + sender.input(AppMsg::Toast { + title: tr("failed-get-selected-wine"), + description: Some(err.to_string()) + }); + } } } diff --git a/src/ui/preferences/general.rs b/src/ui/preferences/general.rs index 49f15f9..bcb6c32 100644 --- a/src/ui/preferences/general.rs +++ b/src/ui/preferences/general.rs @@ -542,7 +542,7 @@ impl SimpleAsyncComponent for GeneralApp { .launch(ComponentsListInit { pattern: ComponentsListPattern { download_folder: CONFIG.game.wine.builds.clone(), - groups: wine::get_groups().into_iter().map(|group| group.into()).collect() + groups: wine::get_groups(&CONFIG.components.path).unwrap_or_default().into_iter().map(|group| group.into()).collect() }, on_downloaded: Some(GeneralAppMsg::UpdateDownloadedWine), on_deleted: Some(GeneralAppMsg::UpdateDownloadedWine) @@ -553,7 +553,7 @@ impl SimpleAsyncComponent for GeneralApp { .launch(ComponentsListInit { pattern: ComponentsListPattern { download_folder: CONFIG.game.dxvk.builds.clone(), - groups: dxvk::get_groups().into_iter().map(|group| group.into()).collect() + groups: dxvk::get_groups(&CONFIG.components.path).unwrap_or_default().into_iter().map(|group| group.into()).collect() }, on_downloaded: Some(GeneralAppMsg::UpdateDownloadedDxvk), on_deleted: Some(GeneralAppMsg::UpdateDownloadedDxvk) @@ -701,7 +701,7 @@ impl SimpleAsyncComponent for GeneralApp { } GeneralAppMsg::UpdateDownloadedWine => { - self.downloaded_wine_versions = wine::get_downloaded(&CONFIG.game.wine.builds).unwrap_or_default(); + self.downloaded_wine_versions = wine::get_downloaded(&CONFIG.components.path, &CONFIG.game.wine.builds).unwrap_or_default(); self.selected_wine_version = if let Some(selected) = &CONFIG.game.wine.selected { let mut index = 0; @@ -723,7 +723,7 @@ impl SimpleAsyncComponent for GeneralApp { } GeneralAppMsg::UpdateDownloadedDxvk => { - self.downloaded_dxvk_versions = dxvk::get_downloaded(&CONFIG.game.dxvk.builds).unwrap_or_default(); + self.downloaded_dxvk_versions = dxvk::get_downloaded(&CONFIG.components.path, &CONFIG.game.dxvk.builds).unwrap_or_default(); self.selected_dxvk_version = if let Ok(Some(selected)) = CONFIG.try_get_selected_dxvk_info() { let mut index = 0; @@ -789,8 +789,8 @@ impl SimpleAsyncComponent for GeneralApp { self.selecting_dxvk_version = true; let mut wine = match config.try_get_selected_wine_info() { - Some(version) => version.to_wine(Some(config.game.wine.builds.join(&version.name))), - None => Wine::default() + Ok(Some(version)) => version.to_wine(Some(config.game.wine.builds.join(&version.name))), + _ => Wine::default() }; wine = wine.with_prefix(config.game.wine.prefix);