General settings: added wine/dxvk selection skeleton
This commit is contained in:
parent
d38d098882
commit
48d7f0fc06
7 changed files with 291 additions and 17 deletions
54
src/ui/components/group.rs
Normal file
54
src/ui/components/group.rs
Normal 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
52
src/ui/components/list.rs
Normal 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
25
src/ui/components/mod.rs
Normal 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
|
||||||
|
}
|
46
src/ui/components/version.rs
Normal file
46
src/ui/components/version.rs
Normal 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
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
pub mod main;
|
pub mod main;
|
||||||
pub mod about;
|
pub mod about;
|
||||||
|
|
||||||
pub mod preferences;
|
pub mod preferences;
|
||||||
|
pub mod components;
|
||||||
|
|
|
@ -148,6 +148,9 @@ impl WidgetTemplate for General {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
#[name(wine_versions)]
|
||||||
|
add = &adw::PreferencesGroup {},
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
add = &adw::PreferencesGroup {
|
||||||
set_title: &tr("dxvk-version"),
|
set_title: &tr("dxvk-version"),
|
||||||
|
|
||||||
|
@ -164,6 +167,9 @@ impl WidgetTemplate for General {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
#[name(dxvk_versions)]
|
||||||
|
add = &adw::PreferencesGroup {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,19 +3,19 @@ use relm4::prelude::*;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
|
|
||||||
|
use crate::ui::components::*;
|
||||||
|
|
||||||
use crate::i18n::tr;
|
use crate::i18n::tr;
|
||||||
|
|
||||||
pub struct App;
|
pub struct App {
|
||||||
|
wine_components: Controller<ComponentsList>,
|
||||||
#[derive(Debug)]
|
dxvk_components: Controller<ComponentsList>
|
||||||
pub enum AppMsg {
|
|
||||||
Test
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[relm4::component(pub)]
|
#[relm4::component(pub)]
|
||||||
impl SimpleComponent for App {
|
impl SimpleComponent for App {
|
||||||
type Init = gtk::Window;
|
type Init = gtk::Window;
|
||||||
type Input = AppMsg;
|
type Input = ();
|
||||||
type Output = ();
|
type Output = ();
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
|
@ -26,7 +26,21 @@ impl SimpleComponent for App {
|
||||||
set_modal: true,
|
set_modal: true,
|
||||||
|
|
||||||
#[template]
|
#[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]
|
#[template]
|
||||||
add = &super::enhancements::Enhancements,
|
add = &super::enhancements::Enhancements,
|
||||||
|
@ -44,19 +58,96 @@ impl SimpleComponent for App {
|
||||||
root: &Self::Root,
|
root: &Self::Root,
|
||||||
_sender: ComponentSender<Self>,
|
_sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<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!();
|
let widgets = view_output!();
|
||||||
|
|
||||||
widgets.preferences_window.set_transient_for(Some(&parent));
|
widgets.preferences_window.set_transient_for(Some(&parent));
|
||||||
|
|
||||||
ComponentParts { model, widgets }
|
ComponentParts { model, widgets }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
|
|
||||||
match msg {
|
|
||||||
AppMsg::Test => {
|
|
||||||
println!("sus");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue