From 4ab29fd8f37950d0f00f64807dc905b9d5738c72 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Mon, 9 Sep 2024 08:58:47 -0400 Subject: [PATCH] add WFO dialog to make selecting a WFO easier, mostly coppied from counties dialog --- scwx-qt/scwx-qt.cmake | 3 + scwx-qt/source/scwx/qt/ui/settings_dialog.cpp | 46 +++++- scwx-qt/source/scwx/qt/ui/settings_dialog.ui | 20 ++- scwx-qt/source/scwx/qt/ui/wfo_dialog.cpp | 142 ++++++++++++++++++ scwx-qt/source/scwx/qt/ui/wfo_dialog.hpp | 34 +++++ scwx-qt/source/scwx/qt/ui/wfo_dialog.ui | 101 +++++++++++++ 6 files changed, 336 insertions(+), 10 deletions(-) create mode 100644 scwx-qt/source/scwx/qt/ui/wfo_dialog.cpp create mode 100644 scwx-qt/source/scwx/qt/ui/wfo_dialog.hpp create mode 100644 scwx-qt/source/scwx/qt/ui/wfo_dialog.ui diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index f9cd67f1..3420900d 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -240,6 +240,7 @@ set(HDR_UI source/scwx/qt/ui/about_dialog.hpp source/scwx/qt/ui/animation_dock_widget.hpp source/scwx/qt/ui/collapsible_group.hpp source/scwx/qt/ui/county_dialog.hpp + source/scwx/qt/ui/wfo_dialog.hpp source/scwx/qt/ui/download_dialog.hpp source/scwx/qt/ui/flow_layout.hpp source/scwx/qt/ui/gps_info_dialog.hpp @@ -265,6 +266,7 @@ set(SRC_UI source/scwx/qt/ui/about_dialog.cpp source/scwx/qt/ui/animation_dock_widget.cpp source/scwx/qt/ui/collapsible_group.cpp source/scwx/qt/ui/county_dialog.cpp + source/scwx/qt/ui/wfo_dialog.cpp source/scwx/qt/ui/download_dialog.cpp source/scwx/qt/ui/flow_layout.cpp source/scwx/qt/ui/gps_info_dialog.cpp @@ -290,6 +292,7 @@ set(UI_UI source/scwx/qt/ui/about_dialog.ui source/scwx/qt/ui/animation_dock_widget.ui source/scwx/qt/ui/collapsible_group.ui source/scwx/qt/ui/county_dialog.ui + source/scwx/qt/ui/wfo_dialog.ui source/scwx/qt/ui/gps_info_dialog.ui source/scwx/qt/ui/imgui_debug_dialog.ui source/scwx/qt/ui/layer_dialog.ui diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index 44b74345..8159fb69 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -108,6 +109,7 @@ public: alertAudioRadarSiteDialog_ {new RadarSiteDialog(self)}, gpsSourceDialog_ {new SerialPortDialog(self)}, countyDialog_ {new CountyDialog(self)}, + wfoDialog_ {new WFODialog(self)}, fontDialog_ {new QFontDialog(self)}, fontCategoryModel_ {new QStandardItemModel(self)}, settings_ {std::initializer_list { @@ -209,6 +211,7 @@ public: RadarSiteDialog* alertAudioRadarSiteDialog_; SerialPortDialog* gpsSourceDialog_; CountyDialog* countyDialog_; + WFODialog* wfoDialog_; QFontDialog* fontDialog_; QStandardItemModel* fontCategoryModel_; @@ -979,7 +982,8 @@ void SettingsDialogImpl::SetupAudioTab() countyEntryEnabled); self_->ui->resetAlertAudioCountyButton->setEnabled(countyEntryEnabled); - self_->ui->alertAudioWFOComboBox->setEnabled(wfoEntryEnabled); + self_->ui->alertAudioWFOLineEdit->setEnabled(wfoEntryEnabled); + self_->ui->alertAudioWFOSelectButton->setEnabled(wfoEntryEnabled); self_->ui->resetAlertAudioWFOButton->setEnabled(wfoEntryEnabled); }); @@ -1202,13 +1206,41 @@ void SettingsDialogImpl::SetupAudioTab() alertAudioCounty_.SetEditWidget(self_->ui->alertAudioCountyLineEdit); alertAudioCounty_.SetResetButton(self_->ui->resetAlertAudioCountyButton); + QObject::connect( + self_->ui->alertAudioWFOSelectButton, + &QAbstractButton::clicked, + self_, + [this]() + { + wfoDialog_->show(); + }); + QObject::connect(wfoDialog_, + &WFODialog::accepted, + self_, + [this]() + { + std::string wfoId = wfoDialog_->wfo_id(); + QString qWFOId = QString::fromStdString(wfoId); + self_->ui->alertAudioWFOLineEdit->setText(qWFOId); + + // setText does not emit the textEdited signal + Q_EMIT self_->ui->alertAudioWFOLineEdit->textEdited( + qWFOId); + }); + QObject::connect(self_->ui->alertAudioWFOLineEdit, + &QLineEdit::textChanged, + self_, + [this](const QString& text) + { + std::string wfoName = + config::CountyDatabase::GetWFOName( + text.toStdString()); + self_->ui->alertAudioWFOLabel->setText( + QString::fromStdString(wfoName)); + }); + alertAudioWFO_.SetSettingsVariable(audioSettings.alert_wfo()); - for (const auto& pair : config::CountyDatabase::GetWFOs()) - { - self_->ui->alertAudioWFOComboBox->addItem( - QString::fromStdString(pair.first)); - } - alertAudioWFO_.SetEditWidget(self_->ui->alertAudioWFOComboBox); + alertAudioWFO_.SetEditWidget(self_->ui->alertAudioWFOLineEdit); alertAudioWFO_.SetResetButton(self_->ui->resetAlertAudioWFOButton); } diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui index 71adfb06..88dacbbc 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui @@ -951,9 +951,6 @@ - - - @@ -972,6 +969,23 @@ + + + + + + + + + + + + + + ... + + + diff --git a/scwx-qt/source/scwx/qt/ui/wfo_dialog.cpp b/scwx-qt/source/scwx/qt/ui/wfo_dialog.cpp new file mode 100644 index 00000000..5c950e38 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/wfo_dialog.cpp @@ -0,0 +1,142 @@ +#include "wfo_dialog.hpp" +#include "ui_wfo_dialog.h" + +#include +#include + +#include +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +static const std::string logPrefix_ = "scwx::qt::ui::wfo_dialog"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + +class WFODialog::Impl +{ +public: + explicit Impl(WFODialog* self) : + self_ {self}, + model_ {new QStandardItemModel(self)}, + proxyModel_ {new QSortFilterProxyModel(self)} + { + } + ~Impl() = default; + + void UpdateModel(); + + WFODialog* self_; + QStandardItemModel* model_; + QSortFilterProxyModel* proxyModel_; + + std::string selectedWFO_ {"?"}; +}; + +WFODialog::WFODialog(QWidget* parent) : + QDialog(parent), p {std::make_unique(this)}, ui(new Ui::WFODialog) +{ + ui->setupUi(this); + + p->proxyModel_->setSourceModel(p->model_); + ui->wfoView->setModel(p->proxyModel_); + ui->wfoView->setEditTriggers( + QAbstractItemView::EditTrigger::NoEditTriggers); + ui->wfoView->sortByColumn(0, Qt::SortOrder::AscendingOrder); + ui->wfoView->header()->setSectionResizeMode( + QHeaderView::ResizeMode::Stretch); + + p->UpdateModel(); + + // Button Box + ui->buttonBox->button(QDialogButtonBox::StandardButton::Ok) + ->setEnabled(false); + + connect(ui->wfoView, + &QTreeView::doubleClicked, + this, + [this]() { Q_EMIT accept(); }); + connect( + ui->wfoView->selectionModel(), + &QItemSelectionModel::selectionChanged, + this, + [this](const QItemSelection& selected, const QItemSelection& deselected) + { + if (selected.size() == 0 && deselected.size() == 0) + { + // Items which stay selected but change their index are not + // included in selected and deselected. Thus, this signal might + // be emitted with both selected and deselected empty, if only + // the indices of selected items change. + return; + } + + ui->buttonBox->button(QDialogButtonBox::Ok) + ->setEnabled(selected.size() > 0); + + if (selected.size() > 0) + { + QModelIndex selectedIndex = + p->proxyModel_->mapToSource(selected[0].indexes()[0]); + selectedIndex = p->model_->index(selectedIndex.row(), 1); + QVariant variantData = p->model_->data(selectedIndex); + if (variantData.typeId() == QMetaType::QString) + { + p->selectedWFO_ = variantData.toString().toStdString(); + } + else + { + logger_->warn("Unexpected selection data type"); + p->selectedWFO_ = std::string {"?"}; + } + } + else + { + p->selectedWFO_ = std::string {"?"}; + } + + logger_->debug("Selected: {}", p->selectedWFO_); + }); +} + +WFODialog::~WFODialog() +{ + delete ui; +} + +std::string WFODialog::wfo_id() +{ + return p->selectedWFO_; +} + +void WFODialog::Impl::UpdateModel() +{ + // Clear existing counties + model_->clear(); + + // Disable OK button + self_->ui->buttonBox->button(QDialogButtonBox::StandardButton::Ok) + ->setEnabled(false); + + // Reset headers + model_->setHorizontalHeaderLabels({tr("State and City"), tr("ID")}); + + QStandardItem* root = model_->invisibleRootItem(); + + // Add each wfo to the model + for (auto& wfo : config::CountyDatabase::GetWFOs()) + { + root->appendRow( + {new QStandardItem(QString::fromStdString(wfo.second)), + new QStandardItem(QString::fromStdString(wfo.first))}); + } +} + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/wfo_dialog.hpp b/scwx-qt/source/scwx/qt/ui/wfo_dialog.hpp new file mode 100644 index 00000000..ff42ea1b --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/wfo_dialog.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include + +namespace Ui +{ +class WFODialog; +} + +namespace scwx +{ +namespace qt +{ +namespace ui +{ +class WFODialog : public QDialog +{ + Q_OBJECT + Q_DISABLE_COPY_MOVE(WFODialog) + +public: + explicit WFODialog(QWidget* parent = nullptr); + ~WFODialog(); + + std::string wfo_id(); + +private: + class Impl; + std::unique_ptr p; + Ui::WFODialog* ui; +}; +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/wfo_dialog.ui b/scwx-qt/source/scwx/qt/ui/wfo_dialog.ui new file mode 100644 index 00000000..26623489 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/wfo_dialog.ui @@ -0,0 +1,101 @@ + + + WFODialog + + + + 0 + 0 + 400 + 400 + + + + Select WFO + + + + + + true + + + 0 + + + true + + + + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + + + + + + + buttonBox + accepted() + WFODialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + WFODialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +