Settings: added wine/dxvk applying on one's selection
This commit is contained in:
parent
82fdb7b2a2
commit
036beac9d8
1 changed files with 117 additions and 6 deletions
|
@ -4,10 +4,13 @@ use relm4::component::*;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
|
|
||||||
|
use anime_launcher_sdk::config;
|
||||||
use anime_launcher_sdk::components::*;
|
use anime_launcher_sdk::components::*;
|
||||||
|
use anime_launcher_sdk::wincompatlib::prelude::*;
|
||||||
|
|
||||||
use crate::ui::components::{self, *};
|
use crate::ui::components::{self, *};
|
||||||
use crate::i18n::tr;
|
use crate::i18n::tr;
|
||||||
|
use crate::is_ready;
|
||||||
|
|
||||||
use crate::CONFIG;
|
use crate::CONFIG;
|
||||||
|
|
||||||
|
@ -19,7 +22,10 @@ pub struct App {
|
||||||
downloaded_dxvk_versions: Vec<dxvk::Version>,
|
downloaded_dxvk_versions: Vec<dxvk::Version>,
|
||||||
|
|
||||||
selected_wine_version: u32,
|
selected_wine_version: u32,
|
||||||
selected_dxvk_version: u32
|
selected_dxvk_version: u32,
|
||||||
|
|
||||||
|
selecting_wine_version: bool,
|
||||||
|
selecting_dxvk_version: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
@ -27,7 +33,11 @@ pub enum AppMsg {
|
||||||
WineRecommendedOnly(bool),
|
WineRecommendedOnly(bool),
|
||||||
DxvkRecommendedOnly(bool),
|
DxvkRecommendedOnly(bool),
|
||||||
UpdateDownloadedWine,
|
UpdateDownloadedWine,
|
||||||
UpdateDownloadedDxvk
|
UpdateDownloadedDxvk,
|
||||||
|
SelectWine(usize),
|
||||||
|
SelectDxvk(usize),
|
||||||
|
ResetWineSelection(usize),
|
||||||
|
ResetDxvkSelection(usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[relm4::component(async, pub)]
|
#[relm4::component(async, pub)]
|
||||||
|
@ -58,10 +68,28 @@ impl SimpleAsyncComponent for App {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
wine_version_selector {
|
wine_version_selector {
|
||||||
#[watch]
|
#[watch]
|
||||||
|
#[block_signal(wine_selected_notify)]
|
||||||
set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|version| version.title.as_str()).collect::<Vec<&str>>())),
|
set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|version| version.title.as_str()).collect::<Vec<&str>>())),
|
||||||
|
|
||||||
#[watch]
|
#[watch]
|
||||||
set_selected: model.selected_wine_version
|
#[block_signal(wine_selected_notify)]
|
||||||
|
set_selected: model.selected_wine_version,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_activatable: !model.selecting_wine_version,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_icon_name: if model.selecting_wine_version {
|
||||||
|
Some("process-working")
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
},
|
||||||
|
|
||||||
|
connect_selected_notify[sender] => move |row| {
|
||||||
|
if is_ready() {
|
||||||
|
sender.input(AppMsg::SelectWine(row.selected() as usize));
|
||||||
|
}
|
||||||
|
} @wine_selected_notify
|
||||||
},
|
},
|
||||||
|
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
@ -79,10 +107,28 @@ impl SimpleAsyncComponent for App {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
dxvk_version_selector {
|
dxvk_version_selector {
|
||||||
#[watch]
|
#[watch]
|
||||||
|
#[block_signal(dxvk_selected_notify)]
|
||||||
set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::<Vec<&str>>())),
|
set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::<Vec<&str>>())),
|
||||||
|
|
||||||
#[watch]
|
#[watch]
|
||||||
set_selected: model.selected_dxvk_version
|
#[block_signal(dxvk_selected_notify)]
|
||||||
|
set_selected: model.selected_dxvk_version,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_activatable: !model.selecting_dxvk_version,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_icon_name: if model.selecting_dxvk_version {
|
||||||
|
Some("process-working")
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
},
|
||||||
|
|
||||||
|
connect_selected_notify[sender] => move |row| {
|
||||||
|
if is_ready() {
|
||||||
|
sender.input(AppMsg::SelectDxvk(row.selected() as usize));
|
||||||
|
}
|
||||||
|
} @dxvk_selected_notify
|
||||||
},
|
},
|
||||||
|
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
@ -139,7 +185,10 @@ impl SimpleAsyncComponent for App {
|
||||||
downloaded_dxvk_versions: vec![],
|
downloaded_dxvk_versions: vec![],
|
||||||
|
|
||||||
selected_wine_version: 0,
|
selected_wine_version: 0,
|
||||||
selected_dxvk_version: 0
|
selected_dxvk_version: 0,
|
||||||
|
|
||||||
|
selecting_wine_version: false,
|
||||||
|
selecting_dxvk_version: false
|
||||||
};
|
};
|
||||||
|
|
||||||
let widgets = view_output!();
|
let widgets = view_output!();
|
||||||
|
@ -152,7 +201,7 @@ impl SimpleAsyncComponent for App {
|
||||||
AsyncComponentParts { model, widgets }
|
AsyncComponentParts { model, widgets }
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn update(&mut self, msg: Self::Input, _sender: AsyncComponentSender<Self>) {
|
async fn update(&mut self, msg: Self::Input, sender: AsyncComponentSender<Self>) {
|
||||||
tracing::debug!("Called preferences window event: {:?}", msg);
|
tracing::debug!("Called preferences window event: {:?}", msg);
|
||||||
|
|
||||||
match msg {
|
match msg {
|
||||||
|
@ -209,6 +258,68 @@ impl SimpleAsyncComponent for App {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AppMsg::SelectWine(index) => {
|
||||||
|
if let Ok(mut config) = config::get() {
|
||||||
|
if let Some(version) = self.downloaded_wine_versions.get(index) {
|
||||||
|
if config.game.wine.selected.as_ref().unwrap_or(&String::new()) != &version.title {
|
||||||
|
self.selecting_wine_version = true;
|
||||||
|
|
||||||
|
let wine = version.to_wine(Some(config.game.wine.builds.join(&version.name)));
|
||||||
|
let wine_name = version.name.to_string();
|
||||||
|
|
||||||
|
std::thread::spawn(move || {
|
||||||
|
wine.update_prefix(&config.game.wine.prefix)
|
||||||
|
.expect("Failed to update wine prefix");
|
||||||
|
|
||||||
|
config.game.wine.selected = Some(wine_name);
|
||||||
|
|
||||||
|
config::update(config);
|
||||||
|
|
||||||
|
sender.input(AppMsg::ResetWineSelection(index));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AppMsg::ResetWineSelection(index) => {
|
||||||
|
self.selecting_wine_version = false;
|
||||||
|
self.selected_wine_version = index as u32;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppMsg::SelectDxvk(index) => {
|
||||||
|
if let Ok(config) = config::get() {
|
||||||
|
if let Some(version) = self.downloaded_dxvk_versions.get(index) {
|
||||||
|
if let Ok(selected) = config.try_get_selected_dxvk_info() {
|
||||||
|
if selected.is_none() || selected.unwrap().name != version.name {
|
||||||
|
self.selecting_dxvk_version = true;
|
||||||
|
|
||||||
|
let mut wine = match config.try_get_selected_wine_info() {
|
||||||
|
Some(version) => version.to_wine(Some(config.game.wine.builds.join(&version.name))),
|
||||||
|
None => Wine::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
wine = wine.with_prefix(config.game.wine.prefix);
|
||||||
|
|
||||||
|
let dxvk_folder = config.game.dxvk.builds.join(&version.name);
|
||||||
|
|
||||||
|
std::thread::spawn(move || {
|
||||||
|
Dxvk::install(&wine, dxvk_folder, InstallParams::default())
|
||||||
|
.expect("Failed to install dxvk");
|
||||||
|
|
||||||
|
sender.input(AppMsg::ResetDxvkSelection(index));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AppMsg::ResetDxvkSelection(index) => {
|
||||||
|
self.selecting_dxvk_version = false;
|
||||||
|
self.selected_dxvk_version = index as u32;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue