General settings: added wine/dxvk selection skeleton

This commit is contained in:
Observer KRypt0n_ 2023-01-22 11:24:15 +02:00
parent d38d098882
commit 48d7f0fc06
No known key found for this signature in database
GPG key ID: 844DA47BA25FE1E2
7 changed files with 291 additions and 17 deletions

View file

@ -0,0 +1,54 @@
use relm4::prelude::*;
use adw::prelude::*;
pub struct ComponentGroup {
pub title: String
}
#[derive(Debug)]
pub enum AppMsg {
Install,
Remove
}
#[relm4::component(pub)]
impl SimpleComponent for ComponentGroup {
type Init = super::ComponentsListGroup;
type Input = AppMsg;
type Output = ();
view! {
group = adw::ExpanderRow {
set_title: &model.title
}
}
fn init(
init: Self::Init,
root: &Self::Root,
_sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = ComponentGroup {
title: init.title
};
let widgets = view_output!();
for version in init.versions {
let version = super::ComponentVersion::builder()
.launch(version)
.detach();
widgets.group.add_row(version.widget());
}
ComponentParts { model, widgets }
}
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
tracing::debug!("Called about dialog event: {:?}", msg);
// todo
}
}

52
src/ui/components/list.rs Normal file
View file

@ -0,0 +1,52 @@
use relm4::prelude::*;
use adw::prelude::*;
pub struct ComponentsList {
_download_folder: String
}
#[derive(Debug)]
pub enum AppMsg {
Install,
Remove
}
#[relm4::component(pub)]
impl SimpleComponent for ComponentsList {
type Init = super::ComponentsListPattern;
type Input = AppMsg;
type Output = ();
view! {
group = adw::PreferencesGroup {}
}
fn init(
init: Self::Init,
root: &Self::Root,
_sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = ComponentsList {
_download_folder: init.download_folder
};
let widgets = view_output!();
for group in init.groups {
let group = super::ComponentGroup::builder()
.launch(group)
.detach();
widgets.group.add(group.widget());
}
ComponentParts { model, widgets }
}
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
tracing::debug!("Called about dialog event: {:?}", msg);
// todo
}
}

25
src/ui/components/mod.rs Normal file
View file

@ -0,0 +1,25 @@
pub mod list;
pub mod group;
pub mod version;
pub use list::*;
pub use group::*;
pub use version::*;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ComponentsListPattern {
pub download_folder: String,
pub groups: Vec<ComponentsListGroup>
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ComponentsListGroup {
pub title: String,
pub versions: Vec<ComponentsListVersion>
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ComponentsListVersion {
pub title: String,
pub url: String
}

View file

@ -0,0 +1,46 @@
use relm4::prelude::*;
use adw::prelude::*;
pub struct ComponentVersion {
pub title: String
}
#[derive(Debug)]
pub enum AppMsg {
Install,
Remove
}
#[relm4::component(pub)]
impl SimpleComponent for ComponentVersion {
type Init = super::ComponentsListVersion;
type Input = AppMsg;
type Output = ();
view! {
row = adw::ActionRow {
set_title: &model.title
}
}
fn init(
init: Self::Init,
root: &Self::Root,
_sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = ComponentVersion {
title: init.title
};
let widgets = view_output!();
ComponentParts { model, widgets }
}
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
tracing::debug!("Called about dialog event: {:?}", msg);
// todo
}
}

View file

@ -1,4 +1,4 @@
pub mod main;
pub mod about;
pub mod preferences;
pub mod components;

View file

@ -148,6 +148,9 @@ impl WidgetTemplate for General {
}
},
#[name(wine_versions)]
add = &adw::PreferencesGroup {},
add = &adw::PreferencesGroup {
set_title: &tr("dxvk-version"),
@ -164,6 +167,9 @@ impl WidgetTemplate for General {
}
}
},
#[name(dxvk_versions)]
add = &adw::PreferencesGroup {},
}
}
}

View file

@ -3,19 +3,19 @@ use relm4::prelude::*;
use gtk::prelude::*;
use adw::prelude::*;
use crate::ui::components::*;
use crate::i18n::tr;
pub struct App;
#[derive(Debug)]
pub enum AppMsg {
Test
pub struct App {
wine_components: Controller<ComponentsList>,
dxvk_components: Controller<ComponentsList>
}
#[relm4::component(pub)]
impl SimpleComponent for App {
type Init = gtk::Window;
type Input = AppMsg;
type Input = ();
type Output = ();
view! {
@ -26,7 +26,21 @@ impl SimpleComponent for App {
set_modal: true,
#[template]
add = &super::general::General,
add = &super::general::General {
// Here technically it's AdwPreferencesGroup inside of AdwPreferencesGroup
// but I have no idea how to do it other way
// There're no graphical glitches so don't care
#[template_child]
wine_versions {
add = model.wine_components.widget(),
},
#[template_child]
dxvk_versions {
add = model.dxvk_components.widget(),
}
},
#[template]
add = &super::enhancements::Enhancements,
@ -44,19 +58,96 @@ impl SimpleComponent for App {
root: &Self::Root,
_sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = App;
let model = App {
wine_components: ComponentsList::builder()
.launch(ComponentsListPattern {
download_folder: String::from("/tmp"),
groups: vec![
ComponentsListGroup {
title: String::from("Test group 1"),
versions: vec![
ComponentsListVersion {
title: String::from("Test version 1"),
url: String::from("/")
},
ComponentsListVersion {
title: String::from("Test version 2"),
url: String::from("/")
},
ComponentsListVersion {
title: String::from("Test version 3"),
url: String::from("/")
}
]
},
ComponentsListGroup {
title: String::from("Test group 2"),
versions: vec![
ComponentsListVersion {
title: String::from("Test version 1"),
url: String::from("/")
},
ComponentsListVersion {
title: String::from("Test version 2"),
url: String::from("/")
},
ComponentsListVersion {
title: String::from("Test version 3"),
url: String::from("/")
}
]
}
]
})
.detach(),
dxvk_components: ComponentsList::builder()
.launch(ComponentsListPattern {
download_folder: String::from("/tmp"),
groups: vec![
ComponentsListGroup {
title: String::from("Test group 1"),
versions: vec![
ComponentsListVersion {
title: String::from("Test version 1"),
url: String::from("/")
},
ComponentsListVersion {
title: String::from("Test version 2"),
url: String::from("/")
},
ComponentsListVersion {
title: String::from("Test version 3"),
url: String::from("/")
}
]
},
ComponentsListGroup {
title: String::from("Test group 2"),
versions: vec![
ComponentsListVersion {
title: String::from("Test version 1"),
url: String::from("/")
},
ComponentsListVersion {
title: String::from("Test version 2"),
url: String::from("/")
},
ComponentsListVersion {
title: String::from("Test version 3"),
url: String::from("/")
}
]
}
]
})
.detach(),
};
let widgets = view_output!();
widgets.preferences_window.set_transient_for(Some(&parent));
ComponentParts { model, widgets }
}
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
match msg {
AppMsg::Test => {
println!("sus");
}
}
}
}