| 7166 | } |
| 7167 | |
| 7168 | void MainWindow::toggleAetherialStrip() |
| 7169 | { |
| 7170 | if (!m_aetherialStrip) { |
| 7171 | m_aetherialStrip = new AetherialAudioStrip(m_audio, this); |
| 7172 | // Override the parent-window relationship so the strip behaves as |
| 7173 | // an independent window (own taskbar entry, raisable separately). |
| 7174 | m_aetherialStrip->setWindowFlag(Qt::Window, true); |
| 7175 | // Secondary window — must not gate quitOnLastWindowClosed on Windows. |
| 7176 | m_aetherialStrip->setAttribute(Qt::WA_QuitOnClose, false); |
| 7177 | // Seed the embedded EQ with the current TX filter cutoff values |
| 7178 | // so the dashed yellow guide lines render immediately rather than |
| 7179 | // waiting for the next txFilterCutoffChanged signal. |
| 7180 | const auto& tx = m_radioModel.transmitModel(); |
| 7181 | m_aetherialStrip->setTxFilterCutoffs(tx.txFilterLow(), tx.txFilterHigh()); |
| 7182 | // Drag-to-adjust on the strip's EQ cutoff lines → same handler |
| 7183 | // the floating ClientEqEditor uses, so dragging in the strip |
| 7184 | // writes the same TX filter command to the radio. |
| 7185 | connect(m_aetherialStrip, &AetherialAudioStrip::cutoffsDragRequested, |
| 7186 | this, &MainWindow::onEqCutoffsDragRequested); |
| 7187 | // Wire the strip's RX ADSP widget through the same parameter- |
| 7188 | // change handlers the Settings dialog and docked applet use. |
| 7189 | // Without this, NR2/NR4/DFNR/BNR/MNR controls in the strip |
| 7190 | // emit signals that nothing receives. |
| 7191 | if (auto* adsp = m_aetherialStrip->adspWidget()) |
| 7192 | wireAetherDspWidget(adsp); |
| 7193 | // Stage bypass via the strip's chain tiles → same handler the |
| 7194 | // docked Chain applet's signal connects to, so both chain |
| 7195 | // widgets repaint and the matching applet refreshes. |
| 7196 | connect(m_aetherialStrip, &AetherialAudioStrip::stageEnabledChanged, |
| 7197 | this, &MainWindow::onTxChainStageEnabledChanged); |
| 7198 | |
| 7199 | // RX chain wiring — sibling of the TX hookups above (#2425). |
| 7200 | // Stage bypass on an RX tile fans out to: docked chain applet |
| 7201 | // (so its painted tile repaints), and per-stage RX applets so |
| 7202 | // their Enable toggles stay aligned with the engine state. |
| 7203 | connect(m_aetherialStrip, &AetherialAudioStrip::rxStageEnabledChanged, |
| 7204 | this, [this](AudioEngine::RxChainStage stage, bool /*enabled*/) { |
| 7205 | if (auto* dockedChain = m_appletPanel |
| 7206 | ? m_appletPanel->clientChainApplet() : nullptr) { |
| 7207 | dockedChain->refreshFromEngine(); |
| 7208 | } |
| 7209 | if (!m_appletPanel) return; |
| 7210 | switch (stage) { |
| 7211 | case AudioEngine::RxChainStage::Eq: |
| 7212 | if (m_appletPanel->clientEqRxApplet()) |
| 7213 | m_appletPanel->clientEqRxApplet()->refreshEnableFromEngine(); |
| 7214 | break; |
| 7215 | case AudioEngine::RxChainStage::Gate: |
| 7216 | if (m_appletPanel->clientGateRxApplet()) |
| 7217 | m_appletPanel->clientGateRxApplet()->refreshEnableFromEngine(); |
| 7218 | break; |
| 7219 | case AudioEngine::RxChainStage::Comp: |
| 7220 | if (m_appletPanel->clientCompRxApplet()) |
| 7221 | m_appletPanel->clientCompRxApplet()->refreshEnableFromEngine(); |
| 7222 | break; |
| 7223 | case AudioEngine::RxChainStage::Tube: |
| 7224 | if (m_appletPanel->clientTubeRxApplet()) |
| 7225 | m_appletPanel->clientTubeRxApplet()->refreshEnableFromEngine(); |
nothing calls this directly
no test coverage detected