diff --git a/src/ui/components/group.rs b/src/ui/components/group.rs new file mode 100644 index 0000000..81d2f94 --- /dev/null +++ b/src/ui/components/group.rs @@ -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, + ) -> ComponentParts { + 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) { + tracing::debug!("Called about dialog event: {:?}", msg); + + // todo + } +} diff --git a/src/ui/components/list.rs b/src/ui/components/list.rs new file mode 100644 index 0000000..716ac11 --- /dev/null +++ b/src/ui/components/list.rs @@ -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, + ) -> ComponentParts { + 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) { + tracing::debug!("Called about dialog event: {:?}", msg); + + // todo + } +} diff --git a/src/ui/components/mod.rs b/src/ui/components/mod.rs new file mode 100644 index 0000000..0ee9164 --- /dev/null +++ b/src/ui/components/mod.rs @@ -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 +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ComponentsListGroup { + pub title: String, + pub versions: Vec +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ComponentsListVersion { + pub title: String, + pub url: String +} diff --git a/src/ui/components/version.rs b/src/ui/components/version.rs new file mode 100644 index 0000000..a173cc1 --- /dev/null +++ b/src/ui/components/version.rs @@ -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, + ) -> ComponentParts { + let model = ComponentVersion { + title: init.title + }; + + let widgets = view_output!(); + + ComponentParts { model, widgets } + } + + fn update(&mut self, msg: Self::Input, _sender: ComponentSender) { + tracing::debug!("Called about dialog event: {:?}", msg); + + // todo + } +} diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 0b6f1ef..099de29 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,4 +1,4 @@ pub mod main; pub mod about; - pub mod preferences; +pub mod components; diff --git a/src/ui/preferences/general.rs b/src/ui/preferences/general.rs index 1105a69..f1b4cfd 100644 --- a/src/ui/preferences/general.rs +++ b/src/ui/preferences/general.rs @@ -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 {}, } } } diff --git a/src/ui/preferences/main.rs b/src/ui/preferences/main.rs index 7f35973..89b88ed 100644 --- a/src/ui/preferences/main.rs +++ b/src/ui/preferences/main.rs @@ -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, + dxvk_components: Controller } #[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, ) -> ComponentParts { - 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) { - match msg { - AppMsg::Test => { - println!("sus"); - } - } - } }