add WFO dialog to make selecting a WFO easier, mostly coppied from counties dialog

This commit is contained in:
AdenKoperczak 2024-09-09 08:58:47 -04:00
parent ed00cec4cc
commit 4ab29fd8f3
6 changed files with 336 additions and 10 deletions

View file

@ -23,6 +23,7 @@
#include <scwx/qt/types/time_types.hpp>
#include <scwx/qt/types/unit_types.hpp>
#include <scwx/qt/ui/county_dialog.hpp>
#include <scwx/qt/ui/wfo_dialog.hpp>
#include <scwx/qt/ui/radar_site_dialog.hpp>
#include <scwx/qt/ui/serial_port_dialog.hpp>
#include <scwx/qt/ui/settings/hotkey_settings_widget.hpp>
@ -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<settings::SettingsInterfaceBase*> {
@ -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);
}

View file

@ -951,9 +951,6 @@
</property>
</widget>
</item>
<item row="8" column="1" colspan="2">
<widget class="QComboBox" name="alertAudioWFOComboBox"/>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_29">
<property name="text">
@ -972,6 +969,23 @@
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLineEdit" name="alertAudioWFOLineEdit"/>
</item>
<item row="8" column="2">
<widget class="QLabel" name="alertAudioWFOLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="8" column="3">
<widget class="QToolButton" name="alertAudioWFOSelectButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View file

@ -0,0 +1,142 @@
#include "wfo_dialog.hpp"
#include "ui_wfo_dialog.h"
#include <scwx/qt/config/county_database.hpp>
#include <scwx/util/logger.hpp>
#include <QPushButton>
#include <QSortFilterProxyModel>
#include <QStandardItemModel>
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<Impl>(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

View file

@ -0,0 +1,34 @@
#pragma once
#include <QDialog>
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<Impl> p;
Ui::WFODialog* ui;
};
} // namespace ui
} // namespace qt
} // namespace scwx

View file

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WFODialog</class>
<widget class="QDialog" name="WFODialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>400</height>
</rect>
</property>
<property name="windowTitle">
<string>Select WFO</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTreeView" name="wfoView">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="indentation">
<number>0</number>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>WFODialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>WFODialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>