Skip to content

Commit d6c8329

Browse files
authoredJan 29, 2025··
refactor: make OcPage a relm component (#456)
* wip * fix: avoid showing apply button * fix: reconnect signals after setting power states
1 parent 0eea61c commit d6c8329

File tree

6 files changed

+306
-273
lines changed

6 files changed

+306
-273
lines changed
 

‎lact-gui/src/app.rs

+44-47
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,18 @@ use header::{
2525
profile_rule_window::ProfileRuleWindowMsg, Header, HeaderMsg, PROFILE_RULE_WINDOW_BROKER,
2626
};
2727
use lact_client::{ConnectionStatusMsg, DaemonClient};
28-
use lact_daemon::MODULE_CONF_PATH;
2928
use lact_schema::{
3029
args::GuiArgs,
3130
request::{ConfirmCommand, SetClocksCommand},
3231
FanOptions, GIT_COMMIT,
3332
};
3433
use msg::AppMsg;
3534
use pages::{
36-
info_page::InformationPage, oc_page::OcPage, software_page::SoftwarePage,
37-
thermals_page::ThermalsPage, PageUpdate,
35+
info_page::InformationPage,
36+
oc_page::{OcPage, OcPageMsg},
37+
software_page::SoftwarePage,
38+
thermals_page::ThermalsPage,
39+
PageUpdate,
3840
};
3941
use relm4::{
4042
actions::{RelmAction, RelmActionGroup},
@@ -62,7 +64,7 @@ pub struct AppModel {
6264
graphs_window: relm4::Controller<GraphsWindow>,
6365

6466
info_page: relm4::Controller<InformationPage>,
65-
oc_page: OcPage,
67+
oc_page: relm4::Controller<OcPage>,
6668
thermals_page: ThermalsPage,
6769
software_page: relm4::Controller<SoftwarePage>,
6870

@@ -101,7 +103,7 @@ impl AsyncComponent for AppModel {
101103
set_margin_end: 30,
102104

103105
add_titled[Some("info_page"), "Information"] = model.info_page.widget(),
104-
add_titled[Some("oc_page"), "OC"] = &model.oc_page.container.clone(),
106+
add_titled[Some("oc_page"), "OC"] = model.oc_page.widget(),
105107
add_titled[Some("thermals_page"), "Thermals"] = &model.thermals_page.container.clone(),
106108
add_titled[Some("software_page"), "Software"] = model.software_page.widget(),
107109
},
@@ -165,6 +167,7 @@ impl AsyncComponent for AppModel {
165167
.get_system_info()
166168
.await
167169
.expect("Could not fetch system info");
170+
let system_info = Rc::new(system_info);
168171

169172
let devices = daemon_client
170173
.list_devices()
@@ -178,7 +181,9 @@ impl AsyncComponent for AppModel {
178181

179182
let info_page = InformationPage::builder().launch(()).detach();
180183

181-
let oc_page = OcPage::new(&system_info);
184+
let oc_page = OcPage::builder()
185+
.launch(system_info.clone())
186+
.forward(sender.input_sender(), |msg| msg);
182187
let thermals_page = ThermalsPage::new(&system_info);
183188

184189
let software_page = SoftwarePage::builder()
@@ -193,13 +198,6 @@ impl AsyncComponent for AppModel {
193198
.launch(())
194199
.forward(sender.input_sender(), |msg| msg);
195200

196-
oc_page.clocks_frame.connect_clocks_reset(clone!(
197-
#[strong]
198-
sender,
199-
move || {
200-
sender.input(AppMsg::ResetClocks);
201-
}
202-
));
203201
thermals_page.connect_reset_pmfw(clone!(
204202
#[strong]
205203
sender,
@@ -208,21 +206,6 @@ impl AsyncComponent for AppModel {
208206
}
209207
));
210208

211-
if let Some(ref button) = oc_page.enable_overclocking_button {
212-
button.connect_clicked(clone!(
213-
#[strong]
214-
sender,
215-
move |_| {
216-
sender.input(AppMsg::ask_confirmation(
217-
AppMsg::EnableOverdrive,
218-
"Enable Overclocking",
219-
format!("This will enable the overdrive feature of the amdgpu driver by creating a file at <b>{MODULE_CONF_PATH}</b> and updating the initramfs. Are you sure you want to do this?"),
220-
gtk::ButtonsType::OkCancel,
221-
));
222-
}
223-
));
224-
}
225-
226209
let graphs_window = GraphsWindow::builder().launch(()).detach();
227210

228211
let model = AppModel {
@@ -281,6 +264,9 @@ impl AppModel {
281264
) -> Result<(), Arc<anyhow::Error>> {
282265
match msg {
283266
AppMsg::Error(err) => return Err(err),
267+
AppMsg::SettingsChanged => {
268+
self.apply_revealer.emit(ApplyRevealerMsg::Show);
269+
}
284270
AppMsg::ReloadProfiles { include_state } => {
285271
self.reload_profiles(include_state).await?;
286272
sender.input(AppMsg::ReloadData { full: false });
@@ -329,10 +315,14 @@ impl AppModel {
329315
});
330316
}
331317
AppMsg::Stats(stats) => {
332-
self.info_page.emit(PageUpdate::Stats(stats.clone()));
318+
let update = PageUpdate::Stats(stats.clone());
319+
self.info_page.emit(update.clone());
320+
self.oc_page.emit(OcPageMsg::Update {
321+
update,
322+
initial: false,
323+
});
333324

334325
self.thermals_page.set_stats(&stats, false);
335-
self.oc_page.set_stats(&stats, false);
336326

337327
self.graphs_window.emit(GraphsWindowMsg::Stats(stats));
338328
}
@@ -454,9 +444,12 @@ impl AppModel {
454444
sender.input(AppMsg::Error(Arc::new(anyhow!("Nvidia driver detected, but the management library could not be loaded. Check lact service status for more information."))));
455445
}
456446

457-
self.info_page.emit(PageUpdate::Info(info.clone()));
458-
459-
self.oc_page.set_info(&info);
447+
let update = PageUpdate::Info(info.clone());
448+
self.info_page.emit(update.clone());
449+
self.oc_page.emit(OcPageMsg::Update {
450+
update,
451+
initial: true,
452+
});
460453

461454
let vram_clock_ratio = info
462455
.drm_info
@@ -493,10 +486,14 @@ impl AppModel {
493486
.context("Could not fetch stats")?;
494487
let stats = Arc::new(stats);
495488

496-
self.oc_page.set_stats(&stats, true);
497489
self.thermals_page.set_stats(&stats, true);
498490

499-
self.info_page.emit(PageUpdate::Stats(stats));
491+
let update = PageUpdate::Stats(stats.clone());
492+
self.info_page.emit(update.clone());
493+
self.oc_page.emit(OcPageMsg::Update {
494+
update,
495+
initial: true,
496+
});
500497

501498
let maybe_clocks_table = match self.daemon_client.get_device_clocks_info(&gpu_id).await {
502499
Ok(info) => info.table,
@@ -505,7 +502,8 @@ impl AppModel {
505502
None
506503
}
507504
};
508-
self.oc_page.set_clocks_table(maybe_clocks_table);
505+
self.oc_page
506+
.emit(OcPageMsg::ClocksTable(maybe_clocks_table));
509507

510508
let maybe_modes_table = match self
511509
.daemon_client
@@ -519,14 +517,11 @@ impl AppModel {
519517
}
520518
};
521519
self.oc_page
522-
.performance_frame
523-
.set_power_profile_modes(maybe_modes_table);
520+
.emit(OcPageMsg::ProfileModesTable(maybe_modes_table));
524521

525522
match self.daemon_client.get_power_states(&gpu_id).await {
526523
Ok(power_states) => {
527-
self.oc_page
528-
.power_states_frame
529-
.set_power_states(power_states);
524+
self.oc_page.emit(OcPageMsg::PowerStates(power_states));
530525
}
531526
Err(err) => warn!("could not get power states: {err:?}"),
532527
}
@@ -544,8 +539,6 @@ impl AppModel {
544539
self.thermals_page
545540
.connect_settings_changed(show_revealer.clone());
546541

547-
self.oc_page.connect_settings_changed(show_revealer);
548-
549542
self.apply_revealer
550543
.sender()
551544
.send(ApplyRevealerMsg::Hide)
@@ -571,7 +564,8 @@ impl AppModel {
571564

572565
debug!("applying settings on gpu {gpu_id}");
573566

574-
if let Some(cap) = self.oc_page.get_power_cap() {
567+
let cap = self.oc_page.model().get_power_cap();
568+
if let Some(cap) = cap {
575569
self.daemon_client
576570
.set_power_cap(&gpu_id, Some(cap))
577571
.await
@@ -593,7 +587,8 @@ impl AppModel {
593587
.await
594588
.context("Could not commit config")?;
595589

596-
if let Some(level) = self.oc_page.get_performance_level() {
590+
let performance_level = self.oc_page.model().get_performance_level();
591+
if let Some(level) = performance_level {
597592
self.daemon_client
598593
.set_performance_level(&gpu_id, level)
599594
.await
@@ -605,10 +600,12 @@ impl AppModel {
605600

606601
let mode_index = self
607602
.oc_page
603+
.model()
608604
.performance_frame
609605
.get_selected_power_profile_mode();
610606
let custom_heuristics = self
611607
.oc_page
608+
.model()
612609
.performance_frame
613610
.get_power_profile_mode_custom_heuristics();
614611

@@ -645,11 +642,11 @@ impl AppModel {
645642
.context("Could not commit config")?;
646643
}
647644

648-
let clocks_commands = self.oc_page.clocks_frame.get_commands();
645+
let clocks_commands = self.oc_page.model().get_clocks_commands();
649646

650647
debug!("applying clocks commands {clocks_commands:#?}");
651648

652-
let enabled_power_states = self.oc_page.get_enabled_power_states();
649+
let enabled_power_states = self.oc_page.model().get_enabled_power_states();
653650

654651
for (kind, states) in enabled_power_states {
655652
if !states.is_empty() {

‎lact-gui/src/app/msg.rs

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub enum AppMsg {
1212
Stats(Arc<DeviceStats>),
1313
ApplyChanges,
1414
RevertChanges,
15+
SettingsChanged,
1516
ResetClocks,
1617
ResetPmfw,
1718
ShowGraphsWindow,

‎lact-gui/src/app/pages.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use gtk::{prelude::*, *};
88
use lact_schema::{DeviceInfo, DeviceStats};
99
use std::sync::Arc;
1010

11-
#[derive(Debug)]
11+
#[derive(Debug, Clone)]
1212
pub enum PageUpdate {
1313
Info(Arc<DeviceInfo>),
1414
Stats(Arc<DeviceStats>),

0 commit comments

Comments
 (0)
Please sign in to comment.