diff --git a/src/ui/preferences/general.rs b/src/ui/preferences/general.rs index 2c22d09..ca55707 100644 --- a/src/ui/preferences/general.rs +++ b/src/ui/preferences/general.rs @@ -221,6 +221,7 @@ impl WidgetTemplate for General { add = &adw::PreferencesGroup { set_title: &tr("wine-version"), + #[name(wine_version_selector)] adw::ComboRow { set_title: &tr("selected-version") }, @@ -243,6 +244,7 @@ impl WidgetTemplate for General { add = &adw::PreferencesGroup { set_title: &tr("dxvk-version"), + #[name(dxvk_version_selector)] adw::ComboRow { set_title: &tr("selected-version") }, diff --git a/src/ui/preferences/main.rs b/src/ui/preferences/main.rs index 7264275..7b99ae1 100644 --- a/src/ui/preferences/main.rs +++ b/src/ui/preferences/main.rs @@ -12,13 +12,21 @@ use crate::CONFIG; pub struct App { wine_components: Controller, - dxvk_components: Controller + dxvk_components: Controller, + + downloaded_wine_versions: Vec, + downloaded_dxvk_versions: Vec, + + selected_wine_version: u32, + selected_dxvk_version: u32 } #[derive(Debug)] pub enum AppMsg { WineRecommendedOnly(bool), - DxvkRecommendedOnly(bool) + DxvkRecommendedOnly(bool), + UpdateDownloadedWine, + UpdateDownloadedDxvk } #[relm4::component(pub)] @@ -45,6 +53,15 @@ impl SimpleComponent for App { add = model.wine_components.widget(), }, + #[template_child] + wine_version_selector { + #[watch] + set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|version| version.title.as_str()).collect::>())), + + #[watch] + set_selected: model.selected_wine_version + }, + #[template_child] wine_recommended_only { connect_state_notify[sender] => move |switch| { @@ -57,6 +74,15 @@ impl SimpleComponent for App { add = model.dxvk_components.widget(), }, + #[template_child] + dxvk_version_selector { + #[watch] + set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::>())), + + #[watch] + set_selected: model.selected_dxvk_version + }, + #[template_child] dxvk_recommended_only { connect_state_notify[sender] => move |switch| { @@ -97,12 +123,21 @@ impl SimpleComponent for App { groups: dxvk::get_groups().into_iter().map(|group| group.into()).collect() }) .detach(), + + downloaded_wine_versions: vec![], + downloaded_dxvk_versions: vec![], + + selected_wine_version: 0, + selected_dxvk_version: 0 }; let widgets = view_output!(); widgets.preferences_window.set_transient_for(Some(&parent)); + sender.input(AppMsg::UpdateDownloadedWine); + sender.input(AppMsg::UpdateDownloadedDxvk); + ComponentParts { model, widgets } } @@ -119,6 +154,50 @@ impl SimpleComponent for App { // todo self.dxvk_components.sender().send(components::list::AppMsg::ShowRecommendedOnly(state)).unwrap(); } + + AppMsg::UpdateDownloadedWine => { + self.downloaded_wine_versions = wine::get_downloaded(&CONFIG.game.wine.builds).unwrap_or_default(); + + self.selected_wine_version = if let Some(selected) = &CONFIG.game.wine.selected { + let mut index = 0; + + for (i, version) in self.downloaded_wine_versions.iter().enumerate() { + if &version.name == selected { + index = i; + + break; + } + } + + index as u32 + } + + else { + 0 + }; + } + + AppMsg::UpdateDownloadedDxvk => { + self.downloaded_dxvk_versions = dxvk::get_downloaded(&CONFIG.game.dxvk.builds).unwrap_or_default(); + + self.selected_dxvk_version = if let Ok(Some(selected)) = CONFIG.try_get_selected_dxvk_info() { + let mut index = 0; + + for (i, version) in self.downloaded_dxvk_versions.iter().enumerate() { + if version.name == selected.name { + index = i; + + break; + } + } + + index as u32 + } + + else { + 0 + }; + } } } }