2023-01-18 16:37:53 +00:00
|
|
|
use relm4::prelude::*;
|
2022-06-28 21:59:20 +00:00
|
|
|
|
2023-01-18 16:37:53 +00:00
|
|
|
use anime_launcher_sdk::config;
|
2023-01-29 13:11:13 +00:00
|
|
|
use anime_launcher_sdk::anime_game_core::prelude::*;
|
|
|
|
use anime_launcher_sdk::anime_game_core::genshin::prelude::*;
|
2022-07-27 15:37:52 +00:00
|
|
|
|
2023-01-18 16:37:53 +00:00
|
|
|
pub mod i18n;
|
2022-06-29 07:11:19 +00:00
|
|
|
pub mod ui;
|
2022-06-28 21:59:20 +00:00
|
|
|
|
2023-01-22 12:37:19 +00:00
|
|
|
mod prettify_bytes;
|
|
|
|
|
|
|
|
pub use prettify_bytes::prettify_bytes;
|
|
|
|
|
2023-01-19 11:45:03 +00:00
|
|
|
pub const APP_ID: &str = "moe.launcher.an-anime-game-launcher-gtk";
|
|
|
|
pub const APP_VERSION: &str = env!("CARGO_PKG_VERSION");
|
|
|
|
|
2023-01-29 13:11:13 +00:00
|
|
|
/// Sets to `true` when the `App` component is ready (fully initialized)
|
|
|
|
pub static mut READY: bool = false;
|
|
|
|
|
|
|
|
// TODO: get rid of using this function in all the components' events
|
|
|
|
// e.g. by converting preferences pages into Relm4 Components
|
|
|
|
pub fn is_ready() -> bool {
|
|
|
|
unsafe { READY }
|
|
|
|
}
|
|
|
|
|
|
|
|
lazy_static::lazy_static! {
|
2023-02-03 15:23:17 +00:00
|
|
|
pub static ref APP_DEBUG: bool = cfg!(debug_assertions) || std::env::args().any(|arg| &arg == "--debug");
|
|
|
|
|
2023-01-29 13:11:13 +00:00
|
|
|
/// Config loaded on the app's start. Use `config::get()` to get up to date config instead.
|
|
|
|
/// This one is used to prepare some launcher UI components on start
|
|
|
|
pub static ref CONFIG: config::Config = config::get().expect("Failed to load config");
|
|
|
|
|
|
|
|
pub static ref GAME: Game = Game::new(&CONFIG.game.path);
|
|
|
|
|
|
|
|
// TODO: add loading screen for heavy tasks like this
|
|
|
|
// UPD: tried once. The problem is that I use this variable, as well as ones above,
|
|
|
|
// in the view! macro, which makes it times harder to make the main window load
|
|
|
|
// faster than this variable calculates its value to show StatusPage with loader.
|
|
|
|
// As for now I have no idea how to fix this
|
|
|
|
pub static ref GAME_DIFF: Option<VersionDiff> = match GAME.try_get_diff() {
|
|
|
|
Ok(diff) => Some(diff),
|
|
|
|
Err(err) => {
|
|
|
|
tracing::error!("Failed to get game diff {err}");
|
|
|
|
|
|
|
|
None
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
pub static ref PATCH: Option<Patch> = match Patch::try_fetch(&CONFIG.patch.servers, None) {
|
|
|
|
Ok(patch) => Some(patch),
|
|
|
|
Err(err) => {
|
|
|
|
tracing::error!("Failed to fetch patch info {err}");
|
|
|
|
|
|
|
|
None
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2023-01-18 16:37:53 +00:00
|
|
|
fn main() {
|
|
|
|
tracing_subscriber::fmt()
|
|
|
|
.with_span_events(tracing_subscriber::fmt::format::FmtSpan::FULL)
|
2023-02-03 15:23:17 +00:00
|
|
|
.with_max_level(if *APP_DEBUG {
|
2023-01-22 10:55:27 +00:00
|
|
|
tracing::Level::TRACE
|
|
|
|
} else {
|
2023-02-03 15:23:17 +00:00
|
|
|
tracing::Level::WARN
|
2023-01-22 10:55:27 +00:00
|
|
|
})
|
2023-01-18 16:37:53 +00:00
|
|
|
.init();
|
2022-06-28 21:59:20 +00:00
|
|
|
|
2023-01-18 16:37:53 +00:00
|
|
|
tracing::info!("Starting application");
|
2022-07-26 08:57:12 +00:00
|
|
|
|
2022-09-24 14:52:31 +00:00
|
|
|
adw::init().expect("Libadwaita initialization failed");
|
2022-06-28 21:59:20 +00:00
|
|
|
|
2022-07-24 12:02:14 +00:00
|
|
|
// Register and include resources
|
2023-01-18 16:37:53 +00:00
|
|
|
gtk::gio::resources_register_include!("resources.gresource")
|
2022-07-24 12:02:14 +00:00
|
|
|
.expect("Failed to register resources");
|
|
|
|
|
2022-07-26 15:34:46 +00:00
|
|
|
// Set application's title
|
2023-01-18 16:37:53 +00:00
|
|
|
gtk::glib::set_application_name("An Anime Game Launcher");
|
|
|
|
gtk::glib::set_program_name(Some("An Anime Game Launcher"));
|
2022-10-31 13:53:30 +00:00
|
|
|
|
2023-01-18 16:37:53 +00:00
|
|
|
// Set UI language
|
|
|
|
unsafe {
|
|
|
|
i18n::LANG = config::get().unwrap().launcher.language.parse().unwrap();
|
2023-01-19 11:50:54 +00:00
|
|
|
|
|
|
|
tracing::info!("Set UI language to {}", i18n::LANG);
|
2023-01-18 16:37:53 +00:00
|
|
|
}
|
2022-06-28 21:59:20 +00:00
|
|
|
|
2023-01-22 12:37:19 +00:00
|
|
|
// Create the app
|
2023-01-18 16:37:53 +00:00
|
|
|
let app = RelmApp::new("moe.launcher.an-anime-game-launcher");
|
2022-07-24 13:01:59 +00:00
|
|
|
|
2023-01-22 12:37:19 +00:00
|
|
|
// Set global css
|
|
|
|
relm4::set_global_css("
|
|
|
|
progressbar > text {
|
|
|
|
margin-bottom: 4px;
|
|
|
|
}
|
|
|
|
");
|
|
|
|
|
|
|
|
// Run the app
|
2023-01-18 16:37:53 +00:00
|
|
|
app.run::<ui::main::App>(());
|
2022-06-28 21:59:20 +00:00
|
|
|
}
|