From b6bfc4d2ecd210f97ee03b9f8c4d84aeb8048a97 Mon Sep 17 00:00:00 2001 From: Observer KRypt0n_ Date: Fri, 15 Jul 2022 15:09:45 +0200 Subject: [PATCH] Added dxvks downloading and deleting functionality --- assets/dxvk.json | 28 ++++++++++ assets/ui/preferences.blp | 1 - ...anced.blp => preferences_enhancements.blp} | 0 assets/ui/preferences_general.blp | 2 +- src/lib/config/mod.rs | 20 ++++++++ src/lib/dxvk.rs | 1 + src/ui/components/dxvk_row.rs | 51 +++++++++---------- ...{enhanced_page.rs => enhancements_page.rs} | 4 +- src/ui/preferences/general_page.rs | 36 +++++++++++-- src/ui/preferences/mod.rs | 12 ++--- 10 files changed, 115 insertions(+), 40 deletions(-) rename assets/ui/{preferences_enhanced.blp => preferences_enhancements.blp} (100%) rename src/ui/preferences/{enhanced_page.rs => enhancements_page.rs} (98%) diff --git a/assets/dxvk.json b/assets/dxvk.json index edc1bfd..1fb4875 100644 --- a/assets/dxvk.json +++ b/assets/dxvk.json @@ -1,81 +1,97 @@ { "vanilla": [ { + "name": "dxvk-1.10.2", "version": "1.10.2", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.10.2/dxvk-1.10.2.tar.gz", "recommended": true }, { + "name": "dxvk-1.10.1", "version": "1.10.1", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.10.1/dxvk-1.10.1.tar.gz", "recommended": true }, { + "name": "dxvk-1.10", "version": "1.10", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.10/dxvk-1.10.tar.gz", "recommended": true }, { + "name": "dxvk-1.9.4", "version": "1.9.4", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.9.4/dxvk-1.9.4.tar.gz", "recommended": true }, { + "name": "dxvk-1.9.3", "version": "1.9.3", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.9.3/dxvk-1.9.3.tar.gz", "recommended": true }, { + "name": "dxvk-1.9.2", "version": "1.9.2", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.9.2/dxvk-1.9.2.tar.gz", "recommended": true }, { + "name": "dxvk-1.9.1", "version": "1.9.1", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.9.1/dxvk-1.9.1.tar.gz", "recommended": true }, { + "name": "dxvk-1.9", "version": "1.9", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.9/dxvk-1.9.tar.gz", "recommended": true }, { + "name": "dxvk-1.8.1", "version": "1.8.1", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.8.1/dxvk-1.8.1.tar.gz", "recommended": false }, { + "name": "dxvk-1.8", "version": "1.8", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.8/dxvk-1.8.tar.gz", "recommended": false }, { + "name": "dxvk-1.7.3", "version": "1.7.3", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.7.3/dxvk-1.7.3.tar.gz", "recommended": false }, { + "name": "dxvk-1.7.2", "version": "1.7.2", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.7.2/dxvk-1.7.2.tar.gz", "recommended": false }, { + "name": "dxvk-1.7.1", "version": "1.7.1", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.7.1/dxvk-1.7.1.tar.gz", "recommended": false }, { + "name": "dxvk-1.7", "version": "1.7", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.7/dxvk-1.7.tar.gz", "recommended": false }, { + "name": "dxvk-1.6.1", "version": "1.6.1", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.6.1/dxvk-1.6.1.tar.gz", "recommended": false }, { + "name": "dxvk-1.6", "version": "1.6", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.6/dxvk-1.6.tar.gz", "recommended": false @@ -83,61 +99,73 @@ ], "async": [ { + "name": "dxvk-async-1.10.2", "version": "1.10.2", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.10.2/dxvk-async-1.10.2.tar.gz", "recommended": true }, { + "name": "dxvk-async-1.10.1", "version": "1.10.1", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.10.1/dxvk-async-1.10.1.tar.gz", "recommended": true }, { + "name": "dxvk-async-1.10", "version": "1.10", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.10/dxvk-async-1.10.tar.gz", "recommended": true }, { + "name": "dxvk-async-1.9.4", "version": "1.9.4", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.9.4/dxvk-async-1.9.4.tar.gz", "recommended": true }, { + "name": "dxvk-async-1.9.3", "version": "1.9.3", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.9.3/dxvk-async-1.9.3.tar.gz", "recommended": true }, { + "name": "dxvk-async-1.9.2", "version": "1.9.2", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.9.4/dxvk-async-1.9.4.tar.gz", "recommended": true }, { + "name": "dxvk-async-1.9.1", "version": "1.9.1", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.9.1/dxvk-async-1.9.1.tar.gz", "recommended": true }, { + "name": "dxvk-async-1.9", "version": "1.9", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.9/dxvk-async-1.9.tar.gz", "recommended": true }, { + "name": "dxvk-async-1.8.1", "version": "1.8.1", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.8.1/dxvk-async-1.8.1.tar.gz", "recommended": false }, { + "name": "dxvk-async-1.8", "version": "1.8", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.8.1/dxvk-async-1.8.1.tar.gz", "recommended": false }, { + "name": "dxvk-async-1.7.3", "version": "1.7.3", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.7.3/dxvk-async-1.7.3.tar.gz", "recommended": false }, { + "name": "dxvk-async-1.7.2", "version": "1.7.2", "uri": "https://github.com/Sporif/dxvk-async/releases/download/1.7.2/dxvk-async-1.7.2.tar.gz", "recommended": false diff --git a/assets/ui/preferences.blp b/assets/ui/preferences.blp index 133bda8..4c13fd0 100644 --- a/assets/ui/preferences.blp +++ b/assets/ui/preferences.blp @@ -31,7 +31,6 @@ Gtk.Box preferences { stack: stack; }; - separator: Gtk.Separator {}; content: Gtk.Stack stack {}; } } diff --git a/assets/ui/preferences_enhanced.blp b/assets/ui/preferences_enhancements.blp similarity index 100% rename from assets/ui/preferences_enhanced.blp rename to assets/ui/preferences_enhancements.blp diff --git a/assets/ui/preferences_general.blp b/assets/ui/preferences_general.blp index 6905135..d6a9f59 100644 --- a/assets/ui/preferences_general.blp +++ b/assets/ui/preferences_general.blp @@ -106,7 +106,7 @@ Adw.PreferencesPage general_page { Adw.PreferencesGroup { title: "Wine version"; - Adw.ComboRow { + Adw.ComboRow wine_selected { title: "Selected version"; model: Gtk.StringList { diff --git a/src/lib/config/mod.rs b/src/lib/config/mod.rs index 18d3f2d..3d11519 100644 --- a/src/lib/config/mod.rs +++ b/src/lib/config/mod.rs @@ -130,6 +130,7 @@ pub struct Game { pub path: String, pub voices: Vec, pub wine: Wine, + pub dxvk: Dxvk, pub enhancements: Enhancements, pub environment: HashMap } @@ -145,6 +146,7 @@ impl Default for Game { String::from("en-us") ], wine: Wine::default(), + dxvk: Dxvk::default(), enhancements: Enhancements::default(), environment: HashMap::new() } @@ -178,6 +180,24 @@ impl Default for Wine { } } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Dxvk { + pub builds: String, + pub selected: Option +} + +impl Default for Dxvk { + fn default() -> Self { + Self { + builds: match launcher_dir() { + Some(dir) => format!("{}/dxvks", dir), + None => String::new() + }, + selected: None + } + } +} + #[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)] pub struct Enhancements { pub fsr: Fsr, diff --git a/src/lib/dxvk.rs b/src/lib/dxvk.rs index 234bf9d..105f4c5 100644 --- a/src/lib/dxvk.rs +++ b/src/lib/dxvk.rs @@ -16,6 +16,7 @@ impl List { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Version { + pub name: String, pub version: String, pub uri: String, pub recommended: bool diff --git a/src/ui/components/dxvk_row.rs b/src/ui/components/dxvk_row.rs index e0e2e11..22250ec 100644 --- a/src/ui/components/dxvk_row.rs +++ b/src/ui/components/dxvk_row.rs @@ -1,10 +1,10 @@ use gtk4::{self as gtk, prelude::*}; use libadwaita::{self as adw, prelude::*}; -use gtk::glib; use gtk::Align; use crate::lib::dxvk::Version; +use crate::ui::traits::download_component::*; #[derive(Debug, Clone)] pub struct DxvkRow { @@ -48,31 +48,30 @@ impl DxvkRow { } } - pub fn download(&self) { - let (sender, receiver) = glib::MainContext::channel::(glib::PRIORITY_DEFAULT); - let this = self.clone(); + pub fn update_state(&self, dxvks_folder: T) { + if self.is_downloaded(dxvks_folder) { + self.button.set_icon_name("user-trash-symbolic"); + } - this.progress_bar.set_visible(true); - this.button.set_visible(false); - - receiver.attach(None, move |fraction| { - this.progress_bar.set_fraction(fraction as f64 / 100f64); - this.progress_bar.set_text(Some(&format!("Downloading: {}%", fraction))); - - if fraction == 100 { - this.progress_bar.set_visible(false); - this.button.set_visible(true); - } - - glib::Continue(true) - }); - - std::thread::spawn(move || { - for i in 1..101 { - std::thread::sleep(std::time::Duration::from_millis(150)); - - sender.send(i); - } - }); + else { + self.button.set_icon_name("document-save-symbolic"); + } } } + +impl DownloadComponent for DxvkRow { + fn get_component_path(&self, installation_path: T) -> String { + format!("{}/{}", installation_path.to_string(), self.version.name) + } + + fn get_downloading_widgets(&self) -> (gtk::ProgressBar, gtk::Button) { + (self.progress_bar.clone(), self.button.clone()) + } + + fn get_download_uri(&self) -> String { + self.version.uri.clone() + } +} + +unsafe impl Send for DxvkRow {} +unsafe impl Sync for DxvkRow {} diff --git a/src/ui/preferences/enhanced_page.rs b/src/ui/preferences/enhancements_page.rs similarity index 98% rename from src/ui/preferences/enhanced_page.rs rename to src/ui/preferences/enhancements_page.rs index ab6e73c..8e705ad 100644 --- a/src/ui/preferences/enhanced_page.rs +++ b/src/ui/preferences/enhancements_page.rs @@ -31,7 +31,7 @@ pub struct AppWidgets { impl AppWidgets { fn try_get() -> Result { - let builder = gtk::Builder::from_string(include_str!("../../../assets/ui/.dist/preferences_enhanced.ui")); + let builder = gtk::Builder::from_string(include_str!("../../../assets/ui/.dist/preferences_enhancements.ui")); let result = Self { page: get_object(&builder, "enhanced_page")?, @@ -164,7 +164,7 @@ impl App { } pub fn title() -> String { - String::from("Enhanced") + String::from("Enhancements") } pub fn get_page(&self) -> adw::PreferencesPage { diff --git a/src/ui/preferences/general_page.rs b/src/ui/preferences/general_page.rs index 1b0525b..924e778 100644 --- a/src/ui/preferences/general_page.rs +++ b/src/ui/preferences/general_page.rs @@ -34,6 +34,8 @@ pub struct AppWidgets { pub game_version: gtk::Label, pub patch_version: gtk::Label, + pub wine_selected: adw::ComboRow, + pub wine_groups: adw::PreferencesGroup, pub wine_recommended_only: gtk::Switch, @@ -59,6 +61,8 @@ impl AppWidgets { game_version: get_object(&builder, "game_version")?, patch_version: get_object(&builder, "patch_version")?, + wine_selected: get_object(&builder, "wine_selected")?, + wine_groups: get_object(&builder, "wine_groups")?, wine_recommended_only: get_object(&builder, "wine_recommended_only")?, @@ -108,6 +112,8 @@ impl AppWidgets { for version in versions { let row = DxvkRow::new(version); + row.update_state(&config.game.dxvk.builds); + match i { 0 => result.dxvk_vanilla.add_row(&row.row), 1 => result.dxvk_async.add_row(&row.row), @@ -129,7 +135,7 @@ impl AppWidgets { /// It may be helpful if you want to add the same event for several widgets, or call an action inside of another action #[derive(Debug, Clone, glib::Downgrade)] pub enum Actions { - DownloadDXVK(Rc), + DxvkPerformAction(Rc), WinePerformAction(Rc<(usize, usize)>) } @@ -181,6 +187,10 @@ impl App { /// Add default events and values to the widgets fn init_events(self) -> Self { + /*self.widgets.wine_selected.connect_selected_notify(|_| { + + });*/ + // Set wine recommended only switcher event self.widgets.wine_recommended_only.connect_state_notify(clone!(@strong self as this => move |switcher| { for group in &*this.widgets.wine_components { @@ -218,7 +228,7 @@ impl App { let components = &*self.widgets.dxvk_components; for (i, component) in components.into_iter().enumerate() { - component.button.connect_clicked(Actions::DownloadDXVK(Rc::new(i)).into_fn(&self)); + component.button.connect_clicked(Actions::DxvkPerformAction(Rc::new(i)).into_fn(&self)); } self @@ -240,8 +250,26 @@ impl App { println!("[general page] [update] action: {:?}, values: {:?}", &action, &values); match action { - Actions::DownloadDXVK(i) => { - this.widgets.dxvk_components[*i].download(); + Actions::DxvkPerformAction(i) => { + let config = config::get().expect("Failed to load config"); + + let component = this.widgets.dxvk_components[*i].clone(); + + if component.is_downloaded(&config.game.dxvk.builds) { + if let Err(err) = component.delete(&config.game.dxvk.builds) { + this.toast_error("Failed to delete dxvk", err); + } + + component.update_state(&config.game.dxvk.builds); + } + + else { + if let Ok(awaiter) = component.download(&config.game.dxvk.builds) { + awaiter.then(move |_| { + component.update_state(&config.game.dxvk.builds); + }); + } + } } Actions::WinePerformAction(version) => { diff --git a/src/ui/preferences/mod.rs b/src/ui/preferences/mod.rs index 4a5aa75..a84ab39 100644 --- a/src/ui/preferences/mod.rs +++ b/src/ui/preferences/mod.rs @@ -9,11 +9,11 @@ use crate::ui::*; use crate::ui::traits::prelude::*; mod general_page; -mod enhanced_page; +mod enhancements_page; pub mod pages { pub use super::general_page::App as GeneralPage; - pub use super::enhanced_page::App as EnhancedPage; + pub use super::enhancements_page::App as EnhancementsPage; } #[derive(Clone, glib::Downgrade)] @@ -30,7 +30,7 @@ pub struct PreferencesStack { pub stack: gtk::Stack, pub general_page: pages::GeneralPage, - pub enhanced_page: pages::EnhancedPage + pub enhancements_page: pages::EnhancementsPage } impl PreferencesStack { @@ -50,11 +50,11 @@ impl PreferencesStack { stack: get_object(&builder, "stack")?, general_page: pages::GeneralPage::new(window, toast_overlay)?, - enhanced_page: pages::EnhancedPage::new()? + enhancements_page: pages::EnhancementsPage::new()? }; result.stack.add_titled(&result.general_page.get_page(), None, &pages::GeneralPage::title()); - result.stack.add_titled(&result.enhanced_page.get_page(), None, &pages::EnhancedPage::title()); + result.stack.add_titled(&result.enhancements_page.get_page(), None, &pages::EnhancementsPage::title()); Ok(result) } @@ -70,7 +70,7 @@ impl PreferencesStack { self.flap.set_visible(false); self.general_page.prepare(&self.status_page)?; - self.enhanced_page.prepare(&self.status_page)?; + self.enhancements_page.prepare(&self.status_page)?; self.status_page.set_visible(false); self.flap.set_visible(true);