diff --git a/assets/dxvk.json b/assets/dxvk.json index 1fb4875..39e4ffa 100644 --- a/assets/dxvk.json +++ b/assets/dxvk.json @@ -34,19 +34,19 @@ "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 + "recommended": false }, { "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 + "recommended": false }, { "name": "dxvk-1.9", "version": "1.9", "uri": "https://github.com/doitsujin/dxvk/releases/download/v1.9/dxvk-1.9.tar.gz", - "recommended": true + "recommended": false }, { "name": "dxvk-1.8.1", @@ -71,30 +71,6 @@ "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 } ], "async": [ @@ -132,19 +108,19 @@ "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 + "recommended": false }, { "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 + "recommended": false }, { "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 + "recommended": false }, { "name": "dxvk-async-1.8.1", diff --git a/assets/icons/64x64.ico b/assets/icons/64x64.ico deleted file mode 100644 index 8025d8b..0000000 Binary files a/assets/icons/64x64.ico and /dev/null differ diff --git a/assets/resources.xml b/assets/resources.xml index c440f83..18718a2 100644 --- a/assets/resources.xml +++ b/assets/resources.xml @@ -3,7 +3,4 @@ images/icon.png - - icons/64x64.ico - diff --git a/assets/ui/main.blp b/assets/ui/main.blp index 6c3a781..616769f 100644 --- a/assets/ui/main.blp +++ b/assets/ui/main.blp @@ -5,8 +5,6 @@ Adw.ApplicationWindow window { default-width: 900; default-height: 600; - icon-name: "resource:///org/app/assets/icons/64x64"; - content: Adw.ToastOverlay toast_overlay { Adw.Leaflet leaflet { can-navigate-back: true; @@ -34,7 +32,7 @@ Adw.ApplicationWindow window { Adw.StatusPage status_page { icon-name: "image-loading-symbolic"; title: "Loading data"; - + vexpand: true; } @@ -92,7 +90,6 @@ Adw.ApplicationWindow window { spacing: 20; Gtk.ProgressBar progress_bar { - text: "Downloading: 37% (3.7 of 10 GB)"; show-text: true; width-request: 360; diff --git a/assets/ui/preferences/enhancements.blp b/assets/ui/preferences/enhancements.blp index 7403748..0ac9c96 100644 --- a/assets/ui/preferences/enhancements.blp +++ b/assets/ui/preferences/enhancements.blp @@ -1,9 +1,7 @@ using Gtk 4.0; using Adw 1; -Adw.PreferencesPage enhanced_page { - title: "Enhancements"; - +Adw.PreferencesPage page { Adw.PreferencesGroup { title: "Wine"; diff --git a/assets/ui/preferences/environment.blp b/assets/ui/preferences/environment.blp new file mode 100644 index 0000000..9c7cbe0 --- /dev/null +++ b/assets/ui/preferences/environment.blp @@ -0,0 +1,81 @@ +using Gtk 4.0; +using Adw 1; + +Adw.PreferencesPage page { + Adw.PreferencesGroup { + title: "New variable"; + + Gtk.Box { + orientation: horizontal; + spacing: 8; + + Gtk.Entry { + placeholder-text: "Name"; + } + + Gtk.Entry { + placeholder-text: "Value"; + hexpand: true; + } + } + + Gtk.Button { + label: "Add"; + + margin-top: 8; + halign: start; + } + } + + Adw.PreferencesGroup { + title: "Variables"; + + Adw.ActionRow { + title: "DXVK_HUD"; + subtitle: "1"; + + Gtk.Button { + icon-name: "user-trash-symbolic"; + valign: center; + + styles ["flat"] + } + } + + Adw.ActionRow { + title: "DXVK_HUD"; + subtitle: "1"; + + Gtk.Button { + icon-name: "user-trash-symbolic"; + valign: center; + + styles ["flat"] + } + } + + Adw.ActionRow { + title: "DXVK_HUD"; + subtitle: "1"; + + Gtk.Button { + icon-name: "user-trash-symbolic"; + valign: center; + + styles ["flat"] + } + } + + Adw.ActionRow { + title: "DXVK_HUD"; + subtitle: "1"; + + Gtk.Button { + icon-name: "user-trash-symbolic"; + valign: center; + + styles ["flat"] + } + } + } +} diff --git a/assets/ui/preferences/general.blp b/assets/ui/preferences/general.blp index cf74028..3a14052 100644 --- a/assets/ui/preferences/general.blp +++ b/assets/ui/preferences/general.blp @@ -1,7 +1,7 @@ using Gtk 4.0; using Adw 1; -Adw.PreferencesPage general_page { +Adw.PreferencesPage page { Adw.PreferencesGroup { title: "General"; diff --git a/assets/wine.json b/assets/wine.json index 9166bf5..14a3a87 100644 --- a/assets/wine.json +++ b/assets/wine.json @@ -3,6 +3,32 @@ "title": "Wine-GE-Proton", "subtitle": null, "versions": [ + { + "family": "Wine-GE-Proton", + "name": "lutris-GE-Proton7-24-x86_64", + "title": "Wine-GE-Proton 7-24", + "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-24/wine-lutris-GE-Proton7-24-x86_64.tar.xz", + "files": { + "wine": "bin/wine64", + "wineserver": "bin/wineserver", + "wineboot": "bin/wineboot", + "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" + }, + "recommended": true + }, + { + "family": "Wine-GE-Proton", + "name": "lutris-GE-Proton7-23-x86_64", + "title": "Wine-GE-Proton 7-23", + "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-23/wine-lutris-GE-Proton7-23-x86_64.tar.xz", + "files": { + "wine": "bin/wine64", + "wineserver": "bin/wineserver", + "wineboot": "bin/wineboot", + "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" + }, + "recommended": true + }, { "family": "Wine-GE-Proton", "name": "lutris-GE-Proton7-22-x86_64", @@ -66,7 +92,7 @@ "wineboot": "bin/wineboot", "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" }, - "recommended": true + "recommended": false }, { "family": "Wine-GE-Proton", @@ -79,7 +105,7 @@ "wineboot": "bin/wineboot", "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" }, - "recommended": true + "recommended": false }, { "family": "Wine-GE-Proton", @@ -119,123 +145,6 @@ "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" }, "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-9-x86_64", - "title": "Wine-GE-Proton 7-9", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-9/wine-lutris-GE-Proton7-9-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-8-x86_64", - "title": "Wine-GE-Proton 7-8", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-8/wine-lutris-GE-Proton7-8-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-7-x86_64", - "title": "Wine-GE-Proton 7-7", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-7/wine-lutris-GE-Proton7-7-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-6-x86_64", - "title": "Wine-GE-Proton 7-6", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-6/wine-lutris-GE-Proton7-6-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-5-x86_64", - "title": "Wine-GE-Proton 7-5", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-5/wine-lutris-GE-Proton7-5-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-4-x86_64", - "title": "Wine-GE-Proton 7-4", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-4/wine-lutris-GE-Proton7-4-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-3-x86_64", - "title": "Wine-GE-Proton 7-3", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-3/wine-lutris-GE-Proton7-3-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-2-x86_64", - "title": "Wine-GE-Proton 7-2", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-2/wine-lutris-GE-Proton7-2-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Wine-GE-Proton", - "name": "lutris-GE-Proton7-1-x86_64", - "title": "Wine-GE-Proton 7-1", - "uri": "https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton7-1/wine-lutris-GE-Proton7-1-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false } ] }, @@ -243,6 +152,32 @@ "title": "GE-Proton", "subtitle": "This version includes its own DXVK builds and you can use DXVK_ASYNC variable", "versions": [ + { + "family": "GE-Proton", + "name": "GE-Proton7-28", + "title": "GE-Proton 7-28", + "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-28/GE-Proton7-28.tar.gz", + "files": { + "wine": "files/bin/wine64", + "wineserver": "files/bin/wineserver", + "wineboot": "files/bin/wineboot", + "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" + }, + "recommended": true + }, + { + "family": "GE-Proton", + "name": "GE-Proton7-27", + "title": "GE-Proton 7-27", + "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-27/GE-Proton7-27.tar.gz", + "files": { + "wine": "files/bin/wine64", + "wineserver": "files/bin/wineserver", + "wineboot": "files/bin/wineboot", + "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" + }, + "recommended": true + }, { "family": "GE-Proton", "name": "GE-Proton7-26", @@ -332,7 +267,7 @@ "wineboot": "files/bin/wineboot", "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" }, - "recommended": true + "recommended": false }, { "family": "GE-Proton", @@ -345,7 +280,7 @@ "wineboot": "files/bin/wineboot", "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" }, - "recommended": true + "recommended": false }, { "family": "GE-Proton", @@ -372,123 +307,6 @@ "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" }, "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-9", - "title": "GE-Proton 7-9", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-9/GE-Proton7-9.tar.gz", - "files": { - "wine": "files/bin/wine64", - "wineserver": "files/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-8", - "title": "GE-Proton 7-8", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-8/GE-Proton7-8.tar.gz", - "files": { - "wine": "files/bin/wine64", - "wineserver": "files/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-7", - "title": "GE-Proton 7-7", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-7/GE-Proton7-7.tar.gz", - "files": { - "wine": "files/bin/wine64", - "wineserver": "files/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-6", - "title": "GE-Proton 7-6", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-6/GE-Proton7-6.tar.gz", - "files": { - "wine": "files/bin/wine64", - "wineserver": "files/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-5", - "title": "GE-Proton 7-5", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-5/GE-Proton7-5.tar.gz", - "files": { - "wine": "files/bin/wine64", - "wineserver": "files/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-4", - "title": "GE-Proton 7-4", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-4/GE-Proton7-4.tar.gz", - "files": { - "wine": "files/bin/wine64", - "wineserver": "files/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-3", - "title": "GE-Proton 7-3", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-3/GE-Proton7-3.tar.gz", - "files": { - "wine": "files/bin/wine64", - "wineserver": "files/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "files/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-2", - "title": "GE-Proton 7-2", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-2/GE-Proton7-2.tar.gz", - "files": { - "wine": "dist/bin/wine64", - "wineserver": "dist/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "dist/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "GE-Proton", - "name": "GE-Proton7-1", - "title": "GE-Proton 7-1", - "uri": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton7-1/GE-Proton7-1.tar.gz", - "files": { - "wine": "dist/bin/wine64", - "wineserver": "dist/bin/wineserver", - "wineboot": "files/bin/wineboot", - "winecfg": "dist/lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false } ] }, @@ -709,45 +527,6 @@ "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" }, "recommended": false - }, - { - "family": "Lutris", - "name": "lutris-6.13-3-x86_64", - "title": "Lutris 6.13-3", - "uri": "https://github.com/lutris/wine/releases/download/lutris-6.13-3/wine-lutris-6.13-3-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Lutris", - "name": "lutris-6.13-2-x86_64", - "title": "Lutris 6.13-2", - "uri": "https://github.com/lutris/wine/releases/download/lutris-6.13-2/wine-lutris-6.13-2-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false - }, - { - "family": "Lutris", - "name": "lutris-6.13-x86_64", - "title": "Lutris 6.13", - "uri": "https://github.com/lutris/wine/releases/download/lutris-6.13/wine-lutris-6.13-x86_64.tar.xz", - "files": { - "wine": "bin/wine64", - "wineserver": "bin/wineserver", - "wineboot": "bin/wineboot", - "winecfg": "lib64/wine/x86_64-windows/winecfg.exe" - }, - "recommended": false } ] } diff --git a/src/lib/config/mod.rs b/src/lib/config/mod.rs index 289ade4..f8a4184 100644 --- a/src/lib/config/mod.rs +++ b/src/lib/config/mod.rs @@ -1,7 +1,9 @@ use std::collections::HashMap; -use std::{fs::File, io::Read}; +use std::fs::File; +use std::io::Read; use std::path::Path; use std::io::{Error, ErrorKind, Write}; +use std::process::{Command, Stdio}; use serde::{Serialize, Deserialize}; @@ -122,6 +124,10 @@ pub struct Config { impl Config { /// Try to get a path to the wine executable based on `game.wine.builds` and `game.wine.selected` + /// + /// Returns `Some("wine")` if: + /// 1) `game.wine.selected = None` + /// 2) wine installed and available in system pub fn try_get_wine_executable(&self) -> Option { match &self.game.wine.selected { Some(selected) => { @@ -142,7 +148,10 @@ impl Config { // ???? None }, - None => None + None => match Command::new("wine").stdout(Stdio::null()).stderr(Stdio::null()).output() { + Ok(output) => if output.status.success() { Some(String::from("wine")) } else { None }, + Err(_) => None + } } } diff --git a/src/ui/main.rs b/src/ui/main.rs index f2a7963..a1d5486 100644 --- a/src/ui/main.rs +++ b/src/ui/main.rs @@ -7,6 +7,7 @@ use gtk4::glib::clone; use std::rc::Rc; use std::cell::Cell; use std::io::Error; +use std::process::{Command, Stdio}; use anime_game_core::prelude::*; use wait_not_await::Await; @@ -256,10 +257,35 @@ impl App { Ok(mut config) => { match state { LauncherState::Launch => { - // Display toast message if the game is failed to run - if let Err(err) = game::run(false) { - this.toast_error("Failed to run game", err); - } + let this = this.clone(); + + this.widgets.window.hide(); + + std::thread::spawn(move || { + // Display toast message if the game is failed to run + if let Err(err) = game::run(false) { + this.widgets.window.show(); + + this.toast_error("Failed to run game", err); + } + + else { + loop { + std::thread::sleep(std::time::Duration::from_secs(3)); + + match Command::new("ps").arg("-A").stdout(Stdio::piped()).output() { + Ok(output) => { + if !String::from_utf8_lossy(&output.stdout).contains("GenshinImpact.e") { + break; + } + }, + Err(_) => break + } + } + + this.widgets.window.show(); + } + }); }, LauncherState::PatchAvailable(patch) => { @@ -546,6 +572,7 @@ impl App { self.widgets.launch_game.add_css_class("suggested-action"); self.widgets.launch_game.remove_css_class("warning"); + self.widgets.launch_game.remove_css_class("destructive-action"); match &state { LauncherState::Launch => { @@ -559,6 +586,9 @@ impl App { Patch::Preparation { .. } => { self.widgets.launch_game.set_label("Patch not available"); self.widgets.launch_game.set_sensitive(false); + + self.widgets.launch_game.remove_css_class("suggested-action"); + self.widgets.launch_game.add_css_class("destructive-action"); } Patch::Testing { .. } => { diff --git a/src/ui/preferences/enhancements_page.rs b/src/ui/preferences/enhancements.rs similarity index 99% rename from src/ui/preferences/enhancements_page.rs rename to src/ui/preferences/enhancements.rs index b2fd4f5..2a77535 100644 --- a/src/ui/preferences/enhancements_page.rs +++ b/src/ui/preferences/enhancements.rs @@ -34,7 +34,7 @@ impl AppWidgets { let builder = gtk::Builder::from_string(include_str!("../../../assets/ui/.dist/preferences/enhancements.ui")); let result = Self { - page: get_object(&builder, "enhanced_page")?, + page: get_object(&builder, "page")?, sync_combo: get_object(&builder, "sync_combo")?, wine_lang: get_object(&builder, "wine_lang")?, diff --git a/src/ui/preferences/environment.rs b/src/ui/preferences/environment.rs new file mode 100644 index 0000000..81765b4 --- /dev/null +++ b/src/ui/preferences/environment.rs @@ -0,0 +1,119 @@ +use gtk4 as gtk; +use libadwaita::{self as adw, prelude::*}; + +use gtk4::glib; +use gtk4::glib::clone; + +use std::rc::Rc; +use std::cell::Cell; +use std::io::Error; + +use crate::ui::get_object; +use crate::lib::config; + +/// This structure is used to describe widgets used in application +/// +/// `AppWidgets::try_get` function loads UI file from `.assets/ui/.dist` folder and returns structure with references to its widgets +/// +/// This function does not implement events +#[derive(Clone, glib::Downgrade)] +pub struct AppWidgets { + pub page: adw::PreferencesPage +} + +impl AppWidgets { + fn try_get() -> Result { + let builder = gtk::Builder::from_string(include_str!("../../../assets/ui/.dist/preferences/environment.ui")); + + let result = Self { + page: get_object(&builder, "page")? + }; + + Ok(result) + } +} + +/// This enum is used to describe an action inside of this application +/// +/// 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)] +pub enum Actions { + None +} + +/// This enum is used to store some of this application data +/// +/// In this example we store a counter here to know what should we increment or decrement +/// +/// This must implement `Default` trait +#[derive(Debug, Default, glib::Downgrade)] +pub struct Values; + +/// The main application structure +/// +/// `Default` macro automatically calls `AppWidgets::default`, i.e. loads UI file and reference its widgets +/// +/// `Rc>` means this: +/// - `Rc` addeds ability to reference the same value from various clones of the structure. +/// This will guarantee us that inner `Cell` is the same for all the `App::clone()` values +/// - `Cell` addeds inner mutability to its value, so we can mutate it even without mutable reference. +/// +/// So we have a shared reference to some value that can be changed without mutable reference. +/// That's what we need and what we use in `App::update` method +#[derive(Clone, glib::Downgrade)] +pub struct App { + widgets: AppWidgets, + values: Rc> +} + +impl App { + /// Create new application + pub fn new() -> Result { + let result = Self { + widgets: AppWidgets::try_get()?, + values: Default::default() + }.init_events(); + + Ok(result) + } + + /// Add default events and values to the widgets + fn init_events(self) -> Self { + // .. + + self + } + + /// Update widgets state by calling some action + pub fn update(&self, action: Actions) { + let values = self.values.take(); + + match action { + Actions::None => () + } + + self.values.set(values); + } + + pub fn title() -> String { + String::from("Environment (WIP)") + } + + pub fn get_page(&self) -> adw::PreferencesPage { + self.widgets.page.clone() + } + + /// This method is being called by the `PreferencesStack::update` + pub fn prepare(&self, status_page: &adw::StatusPage) -> Result<(), Error> { + let config = config::get()?; + + status_page.set_description(Some("Loading environment...")); + + // .. + + Ok(()) + } +} + +unsafe impl Send for App {} +unsafe impl Sync for App {} diff --git a/src/ui/preferences/general_page.rs b/src/ui/preferences/general.rs similarity index 99% rename from src/ui/preferences/general_page.rs rename to src/ui/preferences/general.rs index b547f62..d036205 100644 --- a/src/ui/preferences/general_page.rs +++ b/src/ui/preferences/general.rs @@ -57,7 +57,7 @@ impl AppWidgets { let builder = gtk::Builder::from_string(include_str!("../../../assets/ui/.dist/preferences/general.ui")); let mut result = Self { - page: get_object(&builder, "general_page")?, + page: get_object(&builder, "page")?, voiceovers_row: get_object(&builder, "voiceovers_row")?, voieover_components: Default::default(), diff --git a/src/ui/preferences/mod.rs b/src/ui/preferences/mod.rs index c69bdbd..a8a9708 100644 --- a/src/ui/preferences/mod.rs +++ b/src/ui/preferences/mod.rs @@ -10,12 +10,14 @@ use std::io::Error; use crate::ui::*; use crate::ui::traits::prelude::*; -mod general_page; -mod enhancements_page; +mod general; +mod enhancements; +mod environment; pub mod pages { - pub use super::general_page::App as GeneralPage; - pub use super::enhancements_page::App as EnhancementsPage; + pub use super::general::App as GeneralPage; + pub use super::enhancements::App as EnhancementsPage; + pub use super::environment::App as EnvironmentPage; } #[derive(Clone, glib::Downgrade)] @@ -31,7 +33,8 @@ pub struct PreferencesStack { pub stack: gtk::Stack, pub general_page: pages::GeneralPage, - pub enhancements_page: pages::EnhancementsPage + pub enhancements_page: pages::EnhancementsPage, + pub environment_page: pages::EnvironmentPage } impl PreferencesStack { @@ -50,11 +53,13 @@ impl PreferencesStack { stack: get_object(&builder, "stack")?, general_page: pages::GeneralPage::new()?, - enhancements_page: pages::EnhancementsPage::new()? + enhancements_page: pages::EnhancementsPage::new()?, + environment_page: pages::EnvironmentPage::new()? }; result.stack.add_titled(&result.general_page.get_page(), None, &pages::GeneralPage::title()); result.stack.add_titled(&result.enhancements_page.get_page(), None, &pages::EnhancementsPage::title()); + result.stack.add_titled(&result.environment_page.get_page(), None, &pages::EnvironmentPage::title()); Ok(result) } @@ -75,6 +80,7 @@ impl PreferencesStack { self.general_page.prepare(&self.status_page)?; self.enhancements_page.prepare(&self.status_page)?; + self.environment_page.prepare(&self.status_page)?; self.status_page.hide(); self.flap.show();