mirror of
https://github.com/an-anime-team/an-anime-game-launcher.git
synced 2024-11-25 06:16:18 +03:00
feat(ui): added initial installation migration window support
This commit is contained in:
parent
5a4eeb5636
commit
7e20abf991
6 changed files with 101 additions and 5 deletions
|
@ -19,6 +19,8 @@ glib-build-tools = "0.17"
|
||||||
git = "https://github.com/an-anime-team/anime-launcher-sdk"
|
git = "https://github.com/an-anime-team/anime-launcher-sdk"
|
||||||
tag = "0.5.7"
|
tag = "0.5.7"
|
||||||
|
|
||||||
|
# path = "../anime-launcher-sdk" # ! for dev purposes only
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
relm4 = { version = "0.6.0-alpha.2", features = ["macros", "libadwaita"] }
|
relm4 = { version = "0.6.0-alpha.2", features = ["macros", "libadwaita"] }
|
||||||
gtk = { package = "gtk4", version = "0.6", features = ["v4_8"] }
|
gtk = { package = "gtk4", version = "0.6", features = ["v4_8"] }
|
||||||
|
|
|
@ -17,7 +17,7 @@ use super::select_voiceovers::*;
|
||||||
use super::download_components::*;
|
use super::download_components::*;
|
||||||
use super::finish::*;
|
use super::finish::*;
|
||||||
|
|
||||||
pub static mut MAIN_WINDOW: Option<adw::Window> = None;
|
pub static mut MAIN_WINDOW: Option<adw::ApplicationWindow> = None;
|
||||||
|
|
||||||
// TODO: add special page for launcher style selection
|
// TODO: add special page for launcher style selection
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ impl SimpleComponent for FirstRunApp {
|
||||||
type Output = ();
|
type Output = ();
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
window = adw::Window {
|
window = adw::ApplicationWindow {
|
||||||
set_default_size: (780, 560),
|
set_default_size: (780, 560),
|
||||||
|
|
||||||
#[watch]
|
#[watch]
|
||||||
|
|
|
@ -38,9 +38,9 @@ relm4::new_stateless_action!(WishUrl, WindowActionGroup, "wish_url");
|
||||||
|
|
||||||
relm4::new_stateless_action!(About, WindowActionGroup, "about");
|
relm4::new_stateless_action!(About, WindowActionGroup, "about");
|
||||||
|
|
||||||
static mut MAIN_WINDOW: Option<adw::ApplicationWindow> = None;
|
pub static mut MAIN_WINDOW: Option<adw::ApplicationWindow> = None;
|
||||||
static mut PREFERENCES_WINDOW: Option<AsyncController<PreferencesApp>> = None;
|
pub static mut PREFERENCES_WINDOW: Option<AsyncController<PreferencesApp>> = None;
|
||||||
static mut ABOUT_DIALOG: Option<Controller<AboutDialog>> = None;
|
pub static mut ABOUT_DIALOG: Option<Controller<AboutDialog>> = None;
|
||||||
|
|
||||||
pub struct App {
|
pub struct App {
|
||||||
progress_bar: AsyncController<ProgressBar>,
|
progress_bar: AsyncController<ProgressBar>,
|
||||||
|
|
71
src/ui/migrate_installation.rs
Normal file
71
src/ui/migrate_installation.rs
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
use relm4::prelude::*;
|
||||||
|
use relm4::component::*;
|
||||||
|
|
||||||
|
use gtk::prelude::*;
|
||||||
|
use adw::prelude::*;
|
||||||
|
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
|
use super::first_run::default_paths::DefaultPathsApp;
|
||||||
|
|
||||||
|
pub struct MigrateInstallationApp {
|
||||||
|
default_paths: AsyncController<DefaultPathsApp>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum MigrateInstallationAppMsg {
|
||||||
|
Migrate
|
||||||
|
}
|
||||||
|
|
||||||
|
#[relm4::component(pub)]
|
||||||
|
impl SimpleComponent for MigrateInstallationApp {
|
||||||
|
type Init = ();
|
||||||
|
type Input = MigrateInstallationAppMsg;
|
||||||
|
type Output = ();
|
||||||
|
|
||||||
|
view! {
|
||||||
|
adw::Window {
|
||||||
|
set_default_size: (780, 560),
|
||||||
|
set_modal: true,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_title: Some("Migrate installation"),
|
||||||
|
|
||||||
|
gtk::Box {
|
||||||
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
|
|
||||||
|
adw::HeaderBar {
|
||||||
|
add_css_class: "flat"
|
||||||
|
},
|
||||||
|
|
||||||
|
append = model.default_paths.widget(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init(
|
||||||
|
_init: Self::Init,
|
||||||
|
root: &Self::Root,
|
||||||
|
sender: ComponentSender<Self>,
|
||||||
|
) -> ComponentParts<Self> {
|
||||||
|
tracing::info!("Initializing migration window");
|
||||||
|
|
||||||
|
let model = Self {
|
||||||
|
default_paths: DefaultPathsApp::builder()
|
||||||
|
.launch(())
|
||||||
|
.detach()
|
||||||
|
};
|
||||||
|
|
||||||
|
let widgets = view_output!();
|
||||||
|
|
||||||
|
ComponentParts { model, widgets }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
|
||||||
|
match msg {
|
||||||
|
MigrateInstallationAppMsg::Migrate => {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,3 +3,4 @@ pub mod about;
|
||||||
pub mod preferences;
|
pub mod preferences;
|
||||||
pub mod components;
|
pub mod components;
|
||||||
pub mod first_run;
|
pub mod first_run;
|
||||||
|
pub mod migrate_installation;
|
||||||
|
|
|
@ -17,6 +17,7 @@ use anime_launcher_sdk::components::wine::WincompatlibWine;
|
||||||
use anime_launcher_sdk::wincompatlib::prelude::*;
|
use anime_launcher_sdk::wincompatlib::prelude::*;
|
||||||
|
|
||||||
use super::main::PreferencesAppMsg;
|
use super::main::PreferencesAppMsg;
|
||||||
|
use crate::ui::migrate_installation::MigrateInstallationApp;
|
||||||
use crate::ui::components;
|
use crate::ui::components;
|
||||||
use crate::ui::components::*;
|
use crate::ui::components::*;
|
||||||
use crate::i18n::*;
|
use crate::i18n::*;
|
||||||
|
@ -102,6 +103,7 @@ impl AsyncFactoryComponent for VoicePackageComponent {
|
||||||
pub struct GeneralApp {
|
pub struct GeneralApp {
|
||||||
voice_packages: AsyncFactoryVecDeque<VoicePackageComponent>,
|
voice_packages: AsyncFactoryVecDeque<VoicePackageComponent>,
|
||||||
|
|
||||||
|
migrate_installation: Controller<MigrateInstallationApp>,
|
||||||
wine_components: AsyncController<ComponentsList<GeneralAppMsg>>,
|
wine_components: AsyncController<ComponentsList<GeneralAppMsg>>,
|
||||||
dxvk_components: AsyncController<ComponentsList<GeneralAppMsg>>,
|
dxvk_components: AsyncController<ComponentsList<GeneralAppMsg>>,
|
||||||
|
|
||||||
|
@ -145,6 +147,7 @@ pub enum GeneralAppMsg {
|
||||||
RemoveVoicePackage(DynamicIndex),
|
RemoveVoicePackage(DynamicIndex),
|
||||||
SetVoicePackageSensitivity(DynamicIndex, bool),
|
SetVoicePackageSensitivity(DynamicIndex, bool),
|
||||||
|
|
||||||
|
OpenMigrateInstallation,
|
||||||
RepairGame,
|
RepairGame,
|
||||||
|
|
||||||
UpdateLauncherStyle(LauncherStyle),
|
UpdateLauncherStyle(LauncherStyle),
|
||||||
|
@ -307,6 +310,13 @@ impl SimpleAsyncComponent for GeneralApp {
|
||||||
set_spacing: 8,
|
set_spacing: 8,
|
||||||
set_margin_top: 16,
|
set_margin_top: 16,
|
||||||
|
|
||||||
|
gtk::Button {
|
||||||
|
set_label: "Migrate installation",
|
||||||
|
set_tooltip_text: Some("Open special window where you can change your game installation folder"),
|
||||||
|
|
||||||
|
connect_clicked => GeneralAppMsg::OpenMigrateInstallation
|
||||||
|
},
|
||||||
|
|
||||||
gtk::Button {
|
gtk::Button {
|
||||||
set_label: &tr("repair-game"),
|
set_label: &tr("repair-game"),
|
||||||
|
|
||||||
|
@ -674,6 +684,10 @@ impl SimpleAsyncComponent for GeneralApp {
|
||||||
let mut model = Self {
|
let mut model = Self {
|
||||||
voice_packages: AsyncFactoryVecDeque::new(adw::ExpanderRow::new(), sender.input_sender()),
|
voice_packages: AsyncFactoryVecDeque::new(adw::ExpanderRow::new(), sender.input_sender()),
|
||||||
|
|
||||||
|
migrate_installation: MigrateInstallationApp::builder()
|
||||||
|
.launch(())
|
||||||
|
.detach(),
|
||||||
|
|
||||||
wine_components: ComponentsList::builder()
|
wine_components: ComponentsList::builder()
|
||||||
.launch(ComponentsListInit {
|
.launch(ComponentsListInit {
|
||||||
pattern: ComponentsListPattern {
|
pattern: ComponentsListPattern {
|
||||||
|
@ -839,6 +853,14 @@ impl SimpleAsyncComponent for GeneralApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GeneralAppMsg::OpenMigrateInstallation => unsafe {
|
||||||
|
if let Some(window) = crate::ui::main::PREFERENCES_WINDOW.as_ref() {
|
||||||
|
self.migrate_installation.widget().set_transient_for(Some(window.widget()));
|
||||||
|
}
|
||||||
|
|
||||||
|
self.migrate_installation.widget().show();
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(unused_must_use)]
|
#[allow(unused_must_use)]
|
||||||
GeneralAppMsg::RepairGame => {
|
GeneralAppMsg::RepairGame => {
|
||||||
sender.output(Self::Output::RepairGame);
|
sender.output(Self::Output::RepairGame);
|
||||||
|
|
Loading…
Reference in a new issue