mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
Phase 3 (slice): event-driven UI plumbing + Mute through controller
Vertical slice to establish the Phase 3 pattern before replicating it across all commands: logic moves into controller commands, the UI becomes event-driven, and frontends call commands instead of poking widgets. - TRadioController.SetMute now carries the real logic (state + FDSPEngine. SetMute), then fires OnStateChanged(rfMute). - MainForm subscribes via OnControllerState (controller -> UI). It restyles BtnMute from controller state. FSyncingFromController guards against re-entrancy when a programmatic widget change would retrigger OnChange. - BtnMuteClick -> FController.ToggleMute; SyncWebMute -> FController.SetMute. The button/web no longer own the mute logic or the restyle. Proves the command/event/refresh loop end-to-end (UI click and web both route through the controller). Remaining commands follow this pattern. Builds clean (cocoa); behavior unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
2cf01036a3
commit
b577a0d67a
+5
-1
@@ -397,7 +397,11 @@ procedure TRadioController.VolumeBy(Delta: Integer);
|
||||
begin SetVolume(FVolume + Delta); end;
|
||||
|
||||
procedure TRadioController.SetMute(On_: Boolean);
|
||||
begin FMuted := On_; Changed(rfMute); { TODO wiring } end;
|
||||
begin
|
||||
FMuted := On_;
|
||||
if FWDSPReady and Assigned(FDSPEngine) then FDSPEngine.SetMute(FMuted);
|
||||
Changed(rfMute);
|
||||
end;
|
||||
|
||||
procedure TRadioController.ToggleMute;
|
||||
begin SetMute(not FMuted); end;
|
||||
|
||||
Reference in New Issue
Block a user