mirror of
https://github.com/an-anime-team/sleepy-launcher.git
synced 2024-11-24 13:49:34 +03:00
commit
70255512c7
5 changed files with 391 additions and 455 deletions
|
@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added 5.1.0 voiceovers sizes
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed Discord RPC support
|
||||||
|
|
||||||
## [3.12.1] - 02.09.2024
|
## [3.12.1] - 02.09.2024
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
606
Cargo.lock
generated
606
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -19,7 +19,7 @@ glib-build-tools = "0.20"
|
||||||
|
|
||||||
[dependencies.anime-launcher-sdk]
|
[dependencies.anime-launcher-sdk]
|
||||||
git = "https://github.com/an-anime-team/anime-launcher-sdk"
|
git = "https://github.com/an-anime-team/anime-launcher-sdk"
|
||||||
tag = "1.20.3"
|
tag = "1.22.0"
|
||||||
features = ["all", "genshin"]
|
features = ["all", "genshin"]
|
||||||
|
|
||||||
# path = "../anime-launcher-sdk" # ! for dev purposes only
|
# path = "../anime-launcher-sdk" # ! for dev purposes only
|
||||||
|
@ -29,7 +29,7 @@ relm4 = { version = "0.9.0", features = ["macros", "libadwaita"] }
|
||||||
gtk = { package = "gtk4", version = "0.9.0", features = ["v4_12"] }
|
gtk = { package = "gtk4", version = "0.9.0", features = ["v4_12"] }
|
||||||
adw = { package = "libadwaita", version = "0.7.0", features = ["v1_4"] }
|
adw = { package = "libadwaita", version = "0.7.0", features = ["v1_4"] }
|
||||||
|
|
||||||
rfd = { version = "0.14.1", features = ["xdg-portal", "tokio"], default-features = false }
|
rfd = { version = "0.15.0", features = ["xdg-portal", "tokio"], default-features = false }
|
||||||
open = "5.3.0"
|
open = "5.3.0"
|
||||||
whatadistro = "0.1.0"
|
whatadistro = "0.1.0"
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ enum-ordinalize = "4.3"
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
tracing-subscriber = "0.3"
|
tracing-subscriber = "0.3"
|
||||||
|
|
||||||
fluent-templates = "0.10"
|
fluent-templates = "0.11"
|
||||||
unic-langid = "0.9"
|
unic-langid = "0.9"
|
||||||
|
|
||||||
human-panic = "2.0.1"
|
human-panic = "2.0.1"
|
||||||
|
|
|
@ -95,10 +95,16 @@ impl SimpleComponent for AboutDialog {
|
||||||
|
|
||||||
set_release_notes_version: &APP_VERSION,
|
set_release_notes_version: &APP_VERSION,
|
||||||
set_release_notes: &[
|
set_release_notes: &[
|
||||||
"<p>Fixed</p>",
|
"<p>Added</p>",
|
||||||
|
|
||||||
"<ul>",
|
"<ul>",
|
||||||
"<li>Fixed gamescope config file layout</li>",
|
"<li>Added 5.1.0 voiceovers sizes</li>",
|
||||||
|
"</ul>",
|
||||||
|
|
||||||
|
"<p>Removed</p>",
|
||||||
|
|
||||||
|
"<ul>",
|
||||||
|
"<li>Removed Discord RPC support</li>",
|
||||||
"</ul>"
|
"</ul>"
|
||||||
].join("\n"),
|
].join("\n"),
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,10 @@
|
||||||
use relm4::prelude::*;
|
use relm4::prelude::*;
|
||||||
|
|
||||||
use relm4::factory::{
|
|
||||||
AsyncFactoryComponent,
|
|
||||||
AsyncFactorySender,
|
|
||||||
AsyncFactoryVecDeque
|
|
||||||
};
|
|
||||||
|
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
|
|
||||||
use anime_launcher_sdk::config::ConfigExt;
|
use anime_launcher_sdk::config::ConfigExt;
|
||||||
use anime_launcher_sdk::genshin::config::Config;
|
use anime_launcher_sdk::genshin::config::Config;
|
||||||
use anime_launcher_sdk::config::schema_blanks::prelude::*;
|
use anime_launcher_sdk::config::schema_blanks::prelude::*;
|
||||||
|
|
||||||
use anime_launcher_sdk::anime_game_core::installer::downloader::Downloader;
|
|
||||||
|
|
||||||
use anime_launcher_sdk::discord_rpc::DiscordRpc;
|
|
||||||
use anime_launcher_sdk::is_available;
|
use anime_launcher_sdk::is_available;
|
||||||
|
|
||||||
use enum_ordinalize::Ordinalize;
|
use enum_ordinalize::Ordinalize;
|
||||||
|
@ -32,64 +22,7 @@ use crate::*;
|
||||||
use super::gamescope::*;
|
use super::gamescope::*;
|
||||||
use super::main::PreferencesAppMsg;
|
use super::main::PreferencesAppMsg;
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
struct DiscordRpcIcon {
|
|
||||||
pub check_button: gtk::CheckButton,
|
|
||||||
|
|
||||||
pub name: String,
|
|
||||||
pub path: PathBuf
|
|
||||||
}
|
|
||||||
|
|
||||||
#[relm4::factory(async)]
|
|
||||||
impl AsyncFactoryComponent for DiscordRpcIcon {
|
|
||||||
type Init = Self;
|
|
||||||
type Input = EnhancementsAppMsg;
|
|
||||||
type Output = EnhancementsAppMsg;
|
|
||||||
type CommandOutput = ();
|
|
||||||
type ParentWidget = adw::ExpanderRow;
|
|
||||||
|
|
||||||
view! {
|
|
||||||
root = adw::ActionRow {
|
|
||||||
set_title: &self.name,
|
|
||||||
// set_subtitle: &self.name,
|
|
||||||
|
|
||||||
// Don't even try to understand
|
|
||||||
add_prefix = &self.check_button.clone(),
|
|
||||||
|
|
||||||
add_suffix = >k::Picture {
|
|
||||||
set_margin_start: 4,
|
|
||||||
set_margin_top: 4,
|
|
||||||
set_margin_end: 4,
|
|
||||||
set_margin_bottom: 4,
|
|
||||||
|
|
||||||
add_css_class: "round-bin",
|
|
||||||
|
|
||||||
set_filename: Some(&self.path)
|
|
||||||
},
|
|
||||||
|
|
||||||
set_activatable: true,
|
|
||||||
|
|
||||||
connect_activated[sender, index] => move |_| {
|
|
||||||
sender.output(EnhancementsAppMsg::SetDiscordRpcIcon(index.clone()))
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
async fn init_model(
|
|
||||||
init: Self::Init,
|
|
||||||
_index: &DynamicIndex,
|
|
||||||
_sender: AsyncFactorySender<Self>,
|
|
||||||
) -> Self {
|
|
||||||
init
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct EnhancementsApp {
|
pub struct EnhancementsApp {
|
||||||
discord_rpc_icons: AsyncFactoryVecDeque<DiscordRpcIcon>,
|
|
||||||
discord_rpc_root_check_button: gtk::CheckButton,
|
|
||||||
|
|
||||||
gamescope: AsyncController<GamescopeApp>,
|
gamescope: AsyncController<GamescopeApp>,
|
||||||
game_page: AsyncController<GamePage>,
|
game_page: AsyncController<GamePage>,
|
||||||
sandbox_page: AsyncController<SandboxPage>,
|
sandbox_page: AsyncController<SandboxPage>,
|
||||||
|
@ -99,9 +32,6 @@ pub struct EnhancementsApp {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum EnhancementsAppMsg {
|
pub enum EnhancementsAppMsg {
|
||||||
SetGamescopeParent,
|
SetGamescopeParent,
|
||||||
|
|
||||||
SetDiscordRpcIcon(DynamicIndex),
|
|
||||||
|
|
||||||
OpenGamescope,
|
OpenGamescope,
|
||||||
OpenMainPage,
|
OpenMainPage,
|
||||||
OpenGameSettingsPage,
|
OpenGameSettingsPage,
|
||||||
|
@ -488,65 +418,6 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
set_title: &tr!("discord-rpc"),
|
|
||||||
|
|
||||||
adw::ActionRow {
|
|
||||||
set_title: &tr!("enabled"),
|
|
||||||
set_subtitle: &tr!("discord-rpc-description"),
|
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
set_active: CONFIG.launcher.discord_rpc.enabled,
|
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
|
||||||
if is_ready() {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
config.launcher.discord_rpc.enabled = switch.is_active();
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
#[local_ref]
|
|
||||||
discord_rpc_icons -> adw::ExpanderRow {
|
|
||||||
set_title: &tr!("icon")
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::EntryRow {
|
|
||||||
set_title: &tr!("title"),
|
|
||||||
set_text: &CONFIG.launcher.discord_rpc.title,
|
|
||||||
|
|
||||||
connect_changed: |row| {
|
|
||||||
if is_ready() {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
config.launcher.discord_rpc.title = row.text().to_string();
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::EntryRow {
|
|
||||||
set_title: &tr!("description"),
|
|
||||||
set_text: &CONFIG.launcher.discord_rpc.subtitle,
|
|
||||||
|
|
||||||
connect_changed: |row| {
|
|
||||||
if is_ready() {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
config.launcher.discord_rpc.subtitle = row.text().to_string();
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
add = &adw::PreferencesGroup {
|
||||||
set_title: &tr!("fps-unlocker"),
|
set_title: &tr!("fps-unlocker"),
|
||||||
|
|
||||||
|
@ -646,13 +517,7 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
) -> AsyncComponentParts<Self> {
|
) -> AsyncComponentParts<Self> {
|
||||||
tracing::info!("Initializing enhancements settings");
|
tracing::info!("Initializing enhancements settings");
|
||||||
|
|
||||||
let mut model = Self {
|
let model = Self {
|
||||||
discord_rpc_icons: AsyncFactoryVecDeque::builder()
|
|
||||||
.launch_default()
|
|
||||||
.forward(sender.input_sender(), std::convert::identity),
|
|
||||||
|
|
||||||
discord_rpc_root_check_button: gtk::CheckButton::new(),
|
|
||||||
|
|
||||||
gamescope: GamescopeApp::builder()
|
gamescope: GamescopeApp::builder()
|
||||||
.launch(())
|
.launch(())
|
||||||
.detach(),
|
.detach(),
|
||||||
|
@ -670,73 +535,6 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
.forward(sender.input_sender(), std::convert::identity)
|
.forward(sender.input_sender(), std::convert::identity)
|
||||||
};
|
};
|
||||||
|
|
||||||
match DiscordRpc::get_assets(CONFIG.launcher.discord_rpc.app_id) {
|
|
||||||
Ok(icons) => {
|
|
||||||
for icon in icons {
|
|
||||||
let cache_file = CACHE_FOLDER
|
|
||||||
.join("discord-rpc")
|
|
||||||
.join(&icon.name)
|
|
||||||
.join(&icon.id);
|
|
||||||
|
|
||||||
// let sender = sender.clone();
|
|
||||||
|
|
||||||
// Workaround for old folder structure (pre 3.7.3)
|
|
||||||
let old_path = CACHE_FOLDER.join("discord-rpc").join(&icon.name);
|
|
||||||
|
|
||||||
if old_path.exists() {
|
|
||||||
if let Ok(metadata) = old_path.metadata() {
|
|
||||||
if metadata.is_file() {
|
|
||||||
std::fs::remove_file(old_path).expect("Failed to delete old discord rpc icon");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !cache_file.exists() {
|
|
||||||
std::thread::spawn(move || {
|
|
||||||
Downloader::new(icon.get_uri())
|
|
||||||
.expect("Failed to init Discord RPC icon downloader")
|
|
||||||
.with_continue_downloading(false)
|
|
||||||
.with_free_space_check(false)
|
|
||||||
.download(cache_file, |_, _| {})
|
|
||||||
.expect("Failed to download Discord RPC icon");
|
|
||||||
|
|
||||||
/*if let Err(err) = result {
|
|
||||||
sender.input(EnhancementsAppMsg::Toast {
|
|
||||||
title: tr!("discord-rpc-icon-download-failed"),
|
|
||||||
description: Some(err.to_string())
|
|
||||||
});
|
|
||||||
}*/
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: add icons after thread above finishes its work as well
|
|
||||||
else {
|
|
||||||
let check_button = gtk::CheckButton::new();
|
|
||||||
|
|
||||||
check_button.set_group(Some(&model.discord_rpc_root_check_button));
|
|
||||||
|
|
||||||
if CONFIG.launcher.discord_rpc.icon == icon.name {
|
|
||||||
check_button.set_active(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
model.discord_rpc_icons.guard().push_back(DiscordRpcIcon {
|
|
||||||
check_button,
|
|
||||||
|
|
||||||
name: icon.name.clone(),
|
|
||||||
path: cache_file.clone()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Err(err) => sender.input(EnhancementsAppMsg::Toast {
|
|
||||||
title: tr!("discord-rpc-icons-fetch-failed"),
|
|
||||||
description: Some(err.to_string())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
let discord_rpc_icons = model.discord_rpc_icons.widget();
|
|
||||||
|
|
||||||
let game_page = model.game_page.widget();
|
let game_page = model.game_page.widget();
|
||||||
let sandbox_page = model.sandbox_page.widget();
|
let sandbox_page = model.sandbox_page.widget();
|
||||||
let environment_page = model.environment_page.widget();
|
let environment_page = model.environment_page.widget();
|
||||||
|
@ -752,18 +550,6 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
self.gamescope.widget().set_transient_for(super::main::PREFERENCES_WINDOW.as_ref());
|
self.gamescope.widget().set_transient_for(super::main::PREFERENCES_WINDOW.as_ref());
|
||||||
}
|
}
|
||||||
|
|
||||||
EnhancementsAppMsg::SetDiscordRpcIcon(index) => {
|
|
||||||
if let Some(icon) = self.discord_rpc_icons.guard().get(index.current_index()) {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
config.launcher.discord_rpc.icon.clone_from(&icon.name);
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
|
|
||||||
icon.check_button.set_active(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EnhancementsAppMsg::OpenGamescope => {
|
EnhancementsAppMsg::OpenGamescope => {
|
||||||
self.gamescope.widget().present();
|
self.gamescope.widget().present();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue