diff --git a/lact-gui/src/app.rs b/lact-gui/src/app.rs index 15fb2d80..255cf5fe 100644 --- a/lact-gui/src/app.rs +++ b/lact-gui/src/app.rs @@ -21,6 +21,7 @@ use crate::{ APP_ID, CONFIG, GUI_VERSION, I18N, app::{ about_dialog::{AboutDialog, AboutDialogMsg}, + ext::RelmLaunchable as _, gpu_selector::GpuSelector, info_dialog::{ InfoDialog, InfoDialogConfirmation, InfoDialogData, InfoDialogId, InfoDialogMsg, @@ -436,31 +437,23 @@ impl AsyncComponent for AppModel { let info_page = InformationPage::detach_default(); - let oc_page = OcPage::builder() - .launch(settings_changed.clone()) - .forward(sender.input_sender(), |msg| msg); - let thermals_page = ThermalsPage::builder().launch(()).detach(); + let oc_page = + OcPage::launch(settings_changed.clone()).forward(sender.input_sender(), |msg| msg); + let thermals_page = ThermalsPage::detach_default(); - let software_page = SoftwarePage::builder() - .launch((system_info.clone(), daemon_client.embedded)) - .detach(); + let software_page = SoftwarePage::detach((system_info.clone(), daemon_client.embedded)); - let crash_page = CrashPage::builder() - .launch(String::new()) - .forward(sender.input_sender(), |msg| msg); + let crash_page = CrashPage::launch_default().forward(sender.input_sender(), |msg| msg); - let overdrive_dialog = OverdriveDialog::builder() - .launch((system_info.clone(), root.clone().upcast())) - .detach(); + let overdrive_dialog = + OverdriveDialog::detach((system_info.clone(), root.clone().upcast())); - let preferences_dialog = PreferencesDialog::builder() - .launch((system_info.clone(), root.clone())) - .detach(); + let preferences_dialog = PreferencesDialog::detach((system_info.clone(), root.clone())); - let about_dialog = AboutDialog::builder().launch(root.clone()).detach(); - let info_dialog = InfoDialog::builder() - .launch(root.clone()) - .forward(sender.input_sender(), |msg| msg); + let about_dialog = AboutDialog::detach(root.clone()); + + let info_dialog = + InfoDialog::launch(root.clone()).forward(sender.input_sender(), |msg| msg); let graphs_window = GraphsWindow::detach_default(); let process_monitor_window = ProcessMonitorWindow::detach_default(); @@ -469,9 +462,8 @@ impl AsyncComponent for AppModel { .launch((devices, initial_gpu_id.clone())) .forward(sender.input_sender(), AppMsg::SelectGpu); - let profile_selector = ProfileSelector::builder() - .launch(()) - .forward(sender.input_sender(), |msg| msg); + let profile_selector = + ProfileSelector::launch_default().forward(sender.input_sender(), |msg| msg); // create action group and actions for app menu // action group and actions are declared at the bottom of the file @@ -736,7 +728,7 @@ impl AppModel { filters: vec![json_filter], ..Default::default() }; - let file_picker = OpenDialog::builder().launch(settings); + let file_picker = OpenDialog::launch(settings); file_picker.emit(OpenDialogMsg::Open); let stream = file_picker.into_stream(); @@ -755,7 +747,7 @@ impl AppModel { is_modal: true, ..Default::default() }; - let diag = SaveDialog::builder().launch(settings); + let diag = SaveDialog::launch(settings); diag.emit(SaveDialogMsg::SaveAs(format!( "LACT-profile-{}.json", name.as_deref().unwrap_or("default") diff --git a/lact-gui/src/app/ext.rs b/lact-gui/src/app/ext.rs index 09dc93c0..97ea2420 100644 --- a/lact-gui/src/app/ext.rs +++ b/lact-gui/src/app/ext.rs @@ -21,15 +21,30 @@ impl FlowBoxExt for FlowBox { .unwrap() } } -pub trait RelmDefaultLauchable: Component { - fn detach_default() -> relm4::Controller; +pub trait RelmLaunchable: Component { + fn launch(init: ::Init) -> relm4::component::Connector; + + fn detach(init: ::Init) -> relm4::Controller { + Self::launch(init).detach() + } +} + +impl RelmLaunchable for T { + fn launch(init: ::Init) -> relm4::component::Connector { + Self::builder().launch(init) + } +} + +pub trait RelmDefaultLauchable: RelmLaunchable { fn launch_default() -> relm4::component::Connector; + + fn detach_default() -> relm4::Controller; } impl> RelmDefaultLauchable for T { fn detach_default() -> relm4::Controller { - Self::builder().launch(S::default()).detach() + Self::detach(S::default()) } fn launch_default() -> relm4::component::Connector { diff --git a/lact-gui/src/app/pages/oc_page.rs b/lact-gui/src/app/pages/oc_page.rs index 71e762fe..c383540e 100644 --- a/lact-gui/src/app/pages/oc_page.rs +++ b/lact-gui/src/app/pages/oc_page.rs @@ -6,6 +6,7 @@ mod power_states; mod vf_curve; use super::PageUpdate; +use crate::app::ext::RelmLaunchable as _; use crate::app::pages::oc_page::gpu_stats_section::GpuStatsSectionMsg; use crate::app::pages::oc_page::vf_curve::{VfCurveEditor, VfCurveEditorMsg}; use crate::app::{ext::RelmDefaultLauchable, msg::AppMsg}; @@ -88,7 +89,7 @@ impl relm4::Component for OcPage { let performance_frame = PerformanceFrame::launch_default().forward(sender.input_sender(), |msg| msg); - let vf_curve_editor = VfCurveEditor::builder().launch(settings_changed).detach(); + let vf_curve_editor = VfCurveEditor::detach(settings_changed); let model = Self { stats_section, diff --git a/lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs b/lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs index f6122fc4..a3bb888d 100644 --- a/lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs +++ b/lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs @@ -2,6 +2,7 @@ use super::power_states_list::PowerStatesList; use crate::{ APP_BROKER, I18N, app::{ + ext::RelmLaunchable as _, msg::AppMsg, page_section_expander::PageSectionExpander, pages::oc_page::power_states::power_states_list::{ @@ -18,7 +19,7 @@ use i18n_embed_fl::fl; use indexmap::IndexMap; use lact_schema::{DeviceStats, PowerStates}; use relm4::{ - Component, ComponentController, ComponentParts, ComponentSender, RelmObjectExt, + ComponentController, ComponentParts, ComponentSender, RelmObjectExt, binding::{Binding, BoolBinding}, css, }; @@ -101,18 +102,14 @@ impl relm4::SimpleComponent for PowerStatesFrame { root: Self::Root, sender: ComponentSender, ) -> ComponentParts { - let core_states_list = PowerStatesList::builder() - .launch(PowerStatesListOptions { - title: fl!(I18N, "gpu-pstates"), - value_suffix: fl!(I18N, "mhz"), - }) - .detach(); - let vram_states_list = PowerStatesList::builder() - .launch(PowerStatesListOptions { - title: fl!(I18N, "vram-pstates"), - value_suffix: fl!(I18N, "mhz"), - }) - .detach(); + let core_states_list = PowerStatesList::detach(PowerStatesListOptions { + title: fl!(I18N, "gpu-pstates"), + value_suffix: fl!(I18N, "mhz"), + }); + let vram_states_list = PowerStatesList::detach(PowerStatesListOptions { + title: fl!(I18N, "vram-pstates"), + value_suffix: fl!(I18N, "mhz"), + }); let states_configured = BoolBinding::new(false); diff --git a/lact-gui/src/app/profiles.rs b/lact-gui/src/app/profiles.rs index 15e335ff..91712811 100644 --- a/lact-gui/src/app/profiles.rs +++ b/lact-gui/src/app/profiles.rs @@ -4,6 +4,7 @@ mod profile_row; pub mod profile_rule_window; use crate::I18N; +use crate::app::ext::RelmLaunchable as _; use crate::app::msg::AppMsg; use crate::app::profiles::new_profile_dialog::NewProfileDialog; use crate::app::profiles::profile_rename_dialog::ProfileRenameDialog; @@ -299,7 +300,7 @@ impl Component for ProfileSelector { auto_switch: *auto, parent: root.clone().upcast::(), }; - let rule_window = ProfileRuleWindow::builder().launch(params).into_stream(); + let rule_window = ProfileRuleWindow::launch(params).into_stream(); sender.clone().oneshot_command(async move { if let Some((name, rule, hooks)) = rule_window.recv_one().await {