| 256 | // ── DxClusterDialog ───────────────────────────────────────────────────────── |
| 257 | |
| 258 | DxClusterDialog::DxClusterDialog(DxClusterClient* clusterClient, DxClusterClient* rbnClient, |
| 259 | WsjtxClient* wsjtxClient, SpotCollectorClient* spotCollectorClient, |
| 260 | PotaClient* potaClient, |
| 261 | #ifdef HAVE_WEBSOCKETS |
| 262 | FreeDvClient* freedvClient, |
| 263 | #endif |
| 264 | RadioModel* radioModel, |
| 265 | DxccColorProvider* dxccProvider, |
| 266 | QWidget* parent) |
| 267 | : PersistentDialog("SpotHub", "DxClusterDialogGeometry", parent), |
| 268 | m_client(clusterClient), m_rbnClient(rbnClient), |
| 269 | m_wsjtxClient(wsjtxClient), m_spotCollectorClient(spotCollectorClient), |
| 270 | m_potaClient(potaClient), |
| 271 | #ifdef HAVE_WEBSOCKETS |
| 272 | m_freedvClient(freedvClient), |
| 273 | #endif |
| 274 | m_radioModel(radioModel), m_dxccProvider(dxccProvider) |
| 275 | { |
| 276 | theme::setContainer(this, QStringLiteral("dialog/dxCluster")); |
| 277 | setMinimumSize(680, 560); |
| 278 | resize(760, 640); |
| 279 | |
| 280 | // Capture source log paths up front so the per-tab Clear handlers (built |
| 281 | // below) can zero them on click. (#2022) |
| 282 | m_clusterLogPath = clusterClient->logFilePath(); |
| 283 | m_rbnLogPath = rbnClient->logFilePath(); |
| 284 | m_wsjtxLogPath = wsjtxClient->logFilePath(); |
| 285 | m_potaLogPath = potaClient->logFilePath(); |
| 286 | m_scLogPath = spotCollectorClient->logFilePath(); |
| 287 | #ifdef HAVE_WEBSOCKETS |
| 288 | m_freedvLogPath = freedvClient->logFilePath(); |
| 289 | #endif |
| 290 | |
| 291 | auto* root = new QVBoxLayout(bodyWidget()); |
| 292 | root->setSpacing(0); |
| 293 | root->setContentsMargins(4, 4, 4, 4); |
| 294 | |
| 295 | auto* tabs = new QTabWidget; |
| 296 | AetherSDR::ThemeManager::instance().applyStyleSheet(tabs, "QTabWidget::pane { border: 1px solid {{color.background.1}}; }" |
| 297 | "QTabBar::tab { background: {{color.background.0}}; color: #808890; border: 1px solid {{color.background.1}}; " |
| 298 | " padding: 6px 16px; margin-right: 2px; }" |
| 299 | "QTabBar::tab:selected { background: {{color.background.0}}; color: {{color.accent}}; border-bottom: none; }"); |
| 300 | |
| 301 | buildClusterTab(tabs); |
| 302 | buildRbnTab(tabs); |
| 303 | buildWsjtxTab(tabs); |
| 304 | buildSpotCollectorTab(tabs); |
| 305 | buildPotaTab(tabs); |
| 306 | #ifdef HAVE_WEBSOCKETS |
| 307 | buildFreeDvTab(tabs); |
| 308 | #endif |
| 309 | buildSpotListTab(tabs); |
| 310 | buildDisplayTab(tabs); |
| 311 | |
| 312 | root->addWidget(tabs); |
| 313 | |
| 314 | // ── Spot batch timer (1/sec flush) ────────────────────────────────── |
| 315 | m_spotBatchTimer = new QTimer(this); |
nothing calls this directly
no test coverage detected