refactor: use helper methods for component launch (#1041)

This commit is contained in:
Ilya Zlobintsev
2026-05-25 23:13:13 +03:00
committed by GitHub
parent b3b007e2da
commit 60e81fdb30
5 changed files with 49 additions and 43 deletions
+17 -25
View File
@@ -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")
+18 -3
View File
@@ -21,15 +21,30 @@ impl FlowBoxExt for FlowBox {
.unwrap()
}
}
pub trait RelmDefaultLauchable: Component {
fn detach_default() -> relm4::Controller<Self>;
pub trait RelmLaunchable: Component {
fn launch(init: <Self as Component>::Init) -> relm4::component::Connector<Self>;
fn detach(init: <Self as Component>::Init) -> relm4::Controller<Self> {
Self::launch(init).detach()
}
}
impl<T: Component> RelmLaunchable for T {
fn launch(init: <Self as Component>::Init) -> relm4::component::Connector<Self> {
Self::builder().launch(init)
}
}
pub trait RelmDefaultLauchable: RelmLaunchable {
fn launch_default() -> relm4::component::Connector<Self>;
fn detach_default() -> relm4::Controller<Self>;
}
impl<S: Default, T: Component<Init = S>> RelmDefaultLauchable for T {
fn detach_default() -> relm4::Controller<Self> {
Self::builder().launch(S::default()).detach()
Self::detach(S::default())
}
fn launch_default() -> relm4::component::Connector<Self> {
+2 -1
View File
@@ -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,
@@ -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<Self>,
) -> ComponentParts<Self> {
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);
+2 -1
View File
@@ -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::<gtk::Widget>(),
};
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 {