0.2.0
- updated core library to 0.1.3 - added soda wine version - added default patch servers for config file - with core modifications now first run window finally works
This commit is contained in:
parent
0f6ebfff55
commit
ecb5094785
7 changed files with 207 additions and 51 deletions
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "anime-game-launcher"
|
name = "anime-game-launcher"
|
||||||
version = "0.1.1"
|
version = "0.2.0"
|
||||||
description = "Anime Game launcher"
|
description = "Anime Game launcher"
|
||||||
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit f5c91f01561cd12873e92bb51b37c7d68ca0cd99
|
Subproject commit 33893a336d4051e14ce6ed1da81a18910f0a82b0
|
|
@ -255,6 +255,53 @@ Adw.ApplicationWindow window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fourth page (downloading finished)
|
||||||
|
|
||||||
|
Gtk.Box fourth_page {
|
||||||
|
orientation: vertical;
|
||||||
|
hexpand: true;
|
||||||
|
|
||||||
|
Adw.PreferencesPage {
|
||||||
|
Adw.PreferencesGroup {
|
||||||
|
Gtk.Label {
|
||||||
|
label: "Downloading finished!";
|
||||||
|
margin-top: 16;
|
||||||
|
|
||||||
|
styles ["title-1"]
|
||||||
|
}
|
||||||
|
|
||||||
|
Gtk.Label {
|
||||||
|
label: "All the basic components were downloaded. Now you can restart the launcher and download the game. Welcome to our club!";
|
||||||
|
|
||||||
|
wrap: true;
|
||||||
|
justify: center;
|
||||||
|
margin-top: 32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Adw.PreferencesGroup {
|
||||||
|
vexpand: true;
|
||||||
|
valign: center;
|
||||||
|
|
||||||
|
Gtk.Box {
|
||||||
|
orientation: horizontal;
|
||||||
|
spacing: 8;
|
||||||
|
halign: center;
|
||||||
|
|
||||||
|
Gtk.Button fourth_page_restart {
|
||||||
|
label: "Restart";
|
||||||
|
|
||||||
|
styles ["suggested-action"]
|
||||||
|
}
|
||||||
|
|
||||||
|
Gtk.Button fourth_page_exit {
|
||||||
|
label: "Exit";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Adw.CarouselIndicatorDots {
|
Adw.CarouselIndicatorDots {
|
||||||
|
|
|
@ -492,6 +492,51 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"title": "Soda",
|
||||||
|
"subtitle": "New runner based on Valve’s Wine, with patches from Proton, TKG and GE. Developed by Bottles",
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"family": "Soda",
|
||||||
|
"name": "soda-7.0-2-x86_64",
|
||||||
|
"title": "Soda 7.0-2",
|
||||||
|
"uri": "https://github.com/bottlesdevs/wine/releases/download/soda-7.0-2/soda-7.0-2-x86_64.tar.xz",
|
||||||
|
"files": {
|
||||||
|
"wine": "bin/wine64",
|
||||||
|
"wineserver": "bin/wineserver",
|
||||||
|
"wineboot": "bin/wineboot",
|
||||||
|
"winecfg": "lib/wine/x86_64-windows/winecfg.exe"
|
||||||
|
},
|
||||||
|
"recommended": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"family": "Soda",
|
||||||
|
"name": "soda-7.0-1-x86_64",
|
||||||
|
"title": "Soda 7.0-1",
|
||||||
|
"uri": "https://github.com/bottlesdevs/wine/releases/download/soda-7.0-1/soda-7.0-1-x86_64.tar.xz",
|
||||||
|
"files": {
|
||||||
|
"wine": "bin/wine64",
|
||||||
|
"wineserver": "bin/wineserver",
|
||||||
|
"wineboot": "bin/wineboot",
|
||||||
|
"winecfg": "lib/wine/x86_64-windows/winecfg.exe"
|
||||||
|
},
|
||||||
|
"recommended": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"family": "Soda",
|
||||||
|
"name": "soda-7.0-x86_64",
|
||||||
|
"title": "Soda 7.0",
|
||||||
|
"uri": "https://github.com/bottlesdevs/wine/releases/download/soda-7.0/soda-7.0-x86_64.tar.xz",
|
||||||
|
"files": {
|
||||||
|
"wine": "bin/wine64",
|
||||||
|
"wineserver": "bin/wineserver",
|
||||||
|
"wineboot": "bin/wineboot",
|
||||||
|
"winecfg": "lib/wine/x86_64-windows/winecfg.exe"
|
||||||
|
},
|
||||||
|
"recommended": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"title": "Lutris",
|
"title": "Lutris",
|
||||||
"subtitle": null,
|
"subtitle": null,
|
||||||
|
|
|
@ -197,7 +197,10 @@ impl Default for Patch {
|
||||||
Some(dir) => format!("{}/patch", dir),
|
Some(dir) => format!("{}/patch", dir),
|
||||||
None => String::new()
|
None => String::new()
|
||||||
},
|
},
|
||||||
servers: Vec::new()
|
servers: vec![
|
||||||
|
"https://notabug.org/Krock/dawn".to_string(),
|
||||||
|
"https://dev.kaifa.ch/Maroxy/dawn".to_string()
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,8 @@ use gtk::glib;
|
||||||
use std::io::Error;
|
use std::io::Error;
|
||||||
|
|
||||||
use anime_game_core::prelude::*;
|
use anime_game_core::prelude::*;
|
||||||
use wait_not_await::Await;
|
|
||||||
|
use crate::lib::prettify_bytes::prettify_bytes;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum ProgressUpdateResult {
|
pub enum ProgressUpdateResult {
|
||||||
|
@ -56,13 +57,23 @@ impl ProgressBar {
|
||||||
InstallerUpdate::DownloadingProgress(curr, total) => {
|
InstallerUpdate::DownloadingProgress(curr, total) => {
|
||||||
let progress = curr as f64 / total as f64;
|
let progress = curr as f64 / total as f64;
|
||||||
|
|
||||||
self.update(progress, None);
|
self.update(progress, Some(&format!(
|
||||||
|
"Downloading: {:.2}% ({} of {})",
|
||||||
|
progress * 100.0,
|
||||||
|
prettify_bytes(curr),
|
||||||
|
prettify_bytes(total)
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
InstallerUpdate::UnpackingProgress(curr, total) => {
|
InstallerUpdate::UnpackingProgress(curr, total) => {
|
||||||
let progress = curr as f64 / total as f64;
|
let progress = curr as f64 / total as f64;
|
||||||
|
|
||||||
self.update(progress, None);
|
self.update(progress, Some(&format!(
|
||||||
|
"Unpacking: {:.2}% ({} of {})",
|
||||||
|
progress * 100.0,
|
||||||
|
prettify_bytes(curr),
|
||||||
|
prettify_bytes(total)
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
InstallerUpdate::DownloadingFinished => (),
|
InstallerUpdate::DownloadingFinished => (),
|
||||||
|
|
|
@ -45,7 +45,12 @@ pub struct AppWidgets {
|
||||||
pub third_page_download: gtk::Button,
|
pub third_page_download: gtk::Button,
|
||||||
pub third_page_exit: gtk::Button,
|
pub third_page_exit: gtk::Button,
|
||||||
|
|
||||||
pub third_page_progress_bar: ProgressBar
|
pub third_page_progress_bar: ProgressBar,
|
||||||
|
|
||||||
|
// Fourth page
|
||||||
|
pub fourth_page: gtk::Box,
|
||||||
|
pub fourth_page_restart: gtk::Button,
|
||||||
|
pub fourth_page_exit: gtk::Button
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppWidgets {
|
impl AppWidgets {
|
||||||
|
@ -79,6 +84,11 @@ impl AppWidgets {
|
||||||
get_object(&builder, "third_page_buttons_group")?,
|
get_object(&builder, "third_page_buttons_group")?,
|
||||||
get_object(&builder, "third_page_progress_bar_group")?
|
get_object(&builder, "third_page_progress_bar_group")?
|
||||||
),
|
),
|
||||||
|
|
||||||
|
// Fourth page
|
||||||
|
fourth_page: get_object(&builder, "fourth_page")?,
|
||||||
|
fourth_page_restart: get_object(&builder, "fourth_page_restart")?,
|
||||||
|
fourth_page_exit: get_object(&builder, "fourth_page_exit")?
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,6 +103,8 @@ pub enum Actions {
|
||||||
FirstPageContinue,
|
FirstPageContinue,
|
||||||
SecondPageContinue,
|
SecondPageContinue,
|
||||||
ThirdPageDownload,
|
ThirdPageDownload,
|
||||||
|
ThirdPageContinue,
|
||||||
|
FourthPageRestart,
|
||||||
Exit
|
Exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,9 +163,11 @@ impl App {
|
||||||
self.widgets.first_page_continue.connect_clicked(Actions::FirstPageContinue.into_fn(&self));
|
self.widgets.first_page_continue.connect_clicked(Actions::FirstPageContinue.into_fn(&self));
|
||||||
self.widgets.second_page_continue.connect_clicked(Actions::SecondPageContinue.into_fn(&self));
|
self.widgets.second_page_continue.connect_clicked(Actions::SecondPageContinue.into_fn(&self));
|
||||||
self.widgets.third_page_download.connect_clicked(Actions::ThirdPageDownload.into_fn(&self));
|
self.widgets.third_page_download.connect_clicked(Actions::ThirdPageDownload.into_fn(&self));
|
||||||
|
self.widgets.fourth_page_restart.connect_clicked(Actions::FourthPageRestart.into_fn(&self));
|
||||||
|
|
||||||
self.widgets.second_page_exit.connect_clicked(Actions::Exit.into_fn(&self));
|
self.widgets.second_page_exit.connect_clicked(Actions::Exit.into_fn(&self));
|
||||||
self.widgets.third_page_exit.connect_clicked(Actions::Exit.into_fn(&self));
|
self.widgets.third_page_exit.connect_clicked(Actions::Exit.into_fn(&self));
|
||||||
|
self.widgets.fourth_page_exit.connect_clicked(Actions::Exit.into_fn(&self));
|
||||||
|
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
@ -185,19 +199,30 @@ impl App {
|
||||||
|
|
||||||
this.widgets.third_page_progress_bar.show();
|
this.widgets.third_page_progress_bar.show();
|
||||||
|
|
||||||
let this = this.clone();
|
let (sender, receiver) = glib::MainContext::channel::<InstallerUpdate>(glib::PRIORITY_DEFAULT);
|
||||||
|
|
||||||
std::thread::spawn(move || {
|
let progress_bar = this.widgets.third_page_progress_bar.clone();
|
||||||
let config = config::get().unwrap();
|
|
||||||
|
|
||||||
let wine_version = WineVersion::latest().unwrap();
|
let wine_version = WineVersion::latest().unwrap();
|
||||||
let dxvk_version = DxvkVersion::latest().unwrap();
|
let dxvk_version = DxvkVersion::latest().unwrap();
|
||||||
|
|
||||||
let mut wine_version_installer = Installer::new(&wine_version.uri).unwrap();
|
let wine_version_copy = wine_version.clone();
|
||||||
|
|
||||||
let progress_bar = this.widgets.third_page_progress_bar.clone();
|
// Download wine
|
||||||
|
std::thread::spawn(move || {
|
||||||
|
let config = config::get().unwrap();
|
||||||
|
|
||||||
|
let mut wine_version_installer = Installer::new(&wine_version_copy.uri).unwrap();
|
||||||
|
|
||||||
wine_version_installer.install(&config.game.wine.builds, move |state| {
|
wine_version_installer.install(&config.game.wine.builds, move |state| {
|
||||||
|
sender.send(state).unwrap();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
let this = this.clone();
|
||||||
|
|
||||||
|
// Download wine (had to do so this way)
|
||||||
|
receiver.attach(None, move |state| {
|
||||||
match progress_bar.update_from_state(state) {
|
match progress_bar.update_from_state(state) {
|
||||||
ProgressUpdateResult::Updated => (),
|
ProgressUpdateResult::Updated => (),
|
||||||
ProgressUpdateResult::Error(_, _) => todo!(),
|
ProgressUpdateResult::Error(_, _) => todo!(),
|
||||||
|
@ -206,17 +231,23 @@ impl App {
|
||||||
let mut config = config::get().unwrap();
|
let mut config = config::get().unwrap();
|
||||||
let prefix = WinePrefix::new(&config.game.wine.prefix);
|
let prefix = WinePrefix::new(&config.game.wine.prefix);
|
||||||
|
|
||||||
|
// Update wine config
|
||||||
config.game.wine.selected = Some(wine_version.name.clone());
|
config.game.wine.selected = Some(wine_version.name.clone());
|
||||||
|
|
||||||
config::update_raw(config.clone()).unwrap();
|
config::update_raw(config.clone()).unwrap();
|
||||||
|
|
||||||
|
// Create wine prefix
|
||||||
prefix.update(&config.game.wine.builds, wine_version.clone()).unwrap();
|
prefix.update(&config.game.wine.builds, wine_version.clone()).unwrap();
|
||||||
|
|
||||||
|
// Prepare DXVK downloader
|
||||||
let mut dxvk_version_installer = Installer::new(&dxvk_version.uri).unwrap();
|
let mut dxvk_version_installer = Installer::new(&dxvk_version.uri).unwrap();
|
||||||
|
|
||||||
let dxvk_version = dxvk_version.clone();
|
let dxvk_version = dxvk_version.clone();
|
||||||
let progress_bar = progress_bar.clone();
|
let progress_bar = progress_bar.clone();
|
||||||
|
|
||||||
|
let this = this.clone();
|
||||||
|
|
||||||
|
// Download DXVK
|
||||||
dxvk_version_installer.install(&config.game.dxvk.builds, move |state| {
|
dxvk_version_installer.install(&config.game.dxvk.builds, move |state| {
|
||||||
match progress_bar.update_from_state(state) {
|
match progress_bar.update_from_state(state) {
|
||||||
ProgressUpdateResult::Updated => (),
|
ProgressUpdateResult::Updated => (),
|
||||||
|
@ -225,18 +256,37 @@ impl App {
|
||||||
ProgressUpdateResult::Finished => {
|
ProgressUpdateResult::Finished => {
|
||||||
let mut config = config::get().unwrap();
|
let mut config = config::get().unwrap();
|
||||||
|
|
||||||
|
// Apply DXVK
|
||||||
|
println!("{}", dxvk_version.apply(&config.game.dxvk.builds, &config.game.wine.prefix).unwrap());
|
||||||
|
|
||||||
|
// Update dxvk config
|
||||||
config.game.dxvk.selected = Some(dxvk_version.name.clone());
|
config.game.dxvk.selected = Some(dxvk_version.name.clone());
|
||||||
|
|
||||||
config::update_raw(config.clone()).unwrap();
|
config::update_raw(config.clone()).unwrap();
|
||||||
|
|
||||||
println!("Done!!");
|
// Remove .first-run file
|
||||||
|
let launcher_dir = crate::lib::consts::launcher_dir().unwrap();
|
||||||
|
std::fs::remove_file(format!("{}/.first-run", launcher_dir)).unwrap();
|
||||||
|
|
||||||
|
// Show next page
|
||||||
|
this.update(Actions::ThirdPageContinue).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glib::Continue(true)
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
|
Actions::ThirdPageContinue => {
|
||||||
|
this.widgets.carousel.scroll_to(&this.widgets.fourth_page, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME
|
||||||
|
Actions::FourthPageRestart => {
|
||||||
|
this.widgets.window.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
Actions::Exit => {
|
Actions::Exit => {
|
||||||
|
|
Loading…
Reference in a new issue