mirror of
https://github.com/an-anime-team/sleepy-launcher.git
synced 2024-11-22 21:02:44 +03:00
feat(core): added dynamic components loading
Now launcher will update its local wine/dxvk versions index from remotes in config file
This commit is contained in:
parent
5f0d6f5c14
commit
d69107dfba
6 changed files with 73 additions and 23 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -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",
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 9d6aeff5265999f724ff6caf288007a0756f1415
|
||||
Subproject commit 42b738dc1ec5be8e6ced48501604622b8d0ab91e
|
|
@ -27,7 +27,7 @@ pub struct ComponentsListGroup {
|
|||
impl From<wine::Group> 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<wine::Version> for ComponentsListVersion {
|
|||
name: version.name,
|
||||
title: version.title,
|
||||
uri: version.uri,
|
||||
recommended: version.recommended
|
||||
recommended: true // FIXME
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ impl From<dxvk::Version> for ComponentsListVersion {
|
|||
name: version.name.clone(),
|
||||
title: version.name,
|
||||
uri: version.uri,
|
||||
recommended: version.recommended
|
||||
recommended: true // FIXME
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Installer> {
|
||||
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,
|
||||
|
|
|
@ -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())
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue