From b24acb7642c67ea2ea42684cfa86c5415273464f Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 16 Oct 2022 12:49:54 -0500 Subject: [PATCH] Alert dialog initial commit --- .../icons/font-awesome-6/angle-left-solid.svg | 1 + .../font-awesome-6/angle-right-solid.svg | 1 + .../font-awesome-6/backward-step-solid.svg | 1 + .../font-awesome-6/forward-step-solid.svg | 1 + scwx-qt/scwx-qt.cmake | 9 +- scwx-qt/scwx-qt.qrc | 4 + scwx-qt/source/scwx/qt/ui/alert_dialog.cpp | 110 +++++++++++ scwx-qt/source/scwx/qt/ui/alert_dialog.hpp | 44 +++++ scwx-qt/source/scwx/qt/ui/alert_dialog.ui | 173 ++++++++++++++++++ .../source/scwx/qt/ui/alert_dock_widget.cpp | 13 +- 10 files changed, 352 insertions(+), 5 deletions(-) create mode 100644 scwx-qt/res/icons/font-awesome-6/angle-left-solid.svg create mode 100644 scwx-qt/res/icons/font-awesome-6/angle-right-solid.svg create mode 100644 scwx-qt/res/icons/font-awesome-6/backward-step-solid.svg create mode 100644 scwx-qt/res/icons/font-awesome-6/forward-step-solid.svg create mode 100644 scwx-qt/source/scwx/qt/ui/alert_dialog.cpp create mode 100644 scwx-qt/source/scwx/qt/ui/alert_dialog.hpp create mode 100644 scwx-qt/source/scwx/qt/ui/alert_dialog.ui diff --git a/scwx-qt/res/icons/font-awesome-6/angle-left-solid.svg b/scwx-qt/res/icons/font-awesome-6/angle-left-solid.svg new file mode 100644 index 00000000..35ed12a7 --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/angle-left-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scwx-qt/res/icons/font-awesome-6/angle-right-solid.svg b/scwx-qt/res/icons/font-awesome-6/angle-right-solid.svg new file mode 100644 index 00000000..363831b7 --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/angle-right-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scwx-qt/res/icons/font-awesome-6/backward-step-solid.svg b/scwx-qt/res/icons/font-awesome-6/backward-step-solid.svg new file mode 100644 index 00000000..2bed472f --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/backward-step-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scwx-qt/res/icons/font-awesome-6/forward-step-solid.svg b/scwx-qt/res/icons/font-awesome-6/forward-step-solid.svg new file mode 100644 index 00000000..28470063 --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/forward-step-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 1f2577bb..4373e6fb 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -106,19 +106,22 @@ set(HDR_TYPES source/scwx/qt/types/qt_types.hpp source/scwx/qt/types/text_event_key.hpp) set(SRC_TYPES source/scwx/qt/types/radar_product_record.cpp source/scwx/qt/types/text_event_key.cpp) -set(HDR_UI source/scwx/qt/ui/alert_dock_widget.hpp +set(HDR_UI source/scwx/qt/ui/alert_dialog.hpp + source/scwx/qt/ui/alert_dock_widget.hpp source/scwx/qt/ui/flow_layout.hpp source/scwx/qt/ui/level2_products_widget.hpp source/scwx/qt/ui/level2_settings_widget.hpp source/scwx/qt/ui/level3_products_widget.hpp source/scwx/qt/ui/radar_site_dialog.hpp) -set(SRC_UI source/scwx/qt/ui/alert_dock_widget.cpp +set(SRC_UI source/scwx/qt/ui/alert_dialog.cpp + source/scwx/qt/ui/alert_dock_widget.cpp source/scwx/qt/ui/flow_layout.cpp source/scwx/qt/ui/level2_products_widget.cpp source/scwx/qt/ui/level2_settings_widget.cpp source/scwx/qt/ui/level3_products_widget.cpp source/scwx/qt/ui/radar_site_dialog.cpp) -set(UI_UI source/scwx/qt/ui/alert_dock_widget.ui +set(UI_UI source/scwx/qt/ui/alert_dialog.ui + source/scwx/qt/ui/alert_dock_widget.ui source/scwx/qt/ui/radar_site_dialog.ui) set(HDR_UTIL source/scwx/qt/util/font.hpp source/scwx/qt/util/font_buffer.hpp diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index 87539432..c99d8b8f 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -13,6 +13,10 @@ res/config/radar_sites.json res/fonts/din1451alt.ttf res/fonts/din1451alt_g.ttf + res/icons/font-awesome-6/angle-left-solid.svg + res/icons/font-awesome-6/angle-right-solid.svg + res/icons/font-awesome-6/backward-step-solid.svg + res/icons/font-awesome-6/forward-step-solid.svg res/icons/font-awesome-6/sliders-solid.svg res/icons/font-awesome-6/square-minus-regular.svg res/icons/font-awesome-6/square-plus-regular.svg diff --git a/scwx-qt/source/scwx/qt/ui/alert_dialog.cpp b/scwx-qt/source/scwx/qt/ui/alert_dialog.cpp new file mode 100644 index 00000000..57e6800b --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/alert_dialog.cpp @@ -0,0 +1,110 @@ +#include "alert_dialog.hpp" +#include "ui_alert_dialog.h" + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +static const std::string logPrefix_ = "scwx::qt::ui::alert_dialog"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + +class AlertDialogImpl +{ +public: + explicit AlertDialogImpl(AlertDialog* self) : + self_ {self}, key_ {}, coordinate_ {}, currentIndex_ {0u} + { + } + ~AlertDialogImpl() = default; + + void ConnectSignals(); + void SelectIndex(size_t newIndex); + + AlertDialog* self_; + types::TextEventKey key_; + common::Coordinate coordinate_; + size_t currentIndex_; +}; + +AlertDialog::AlertDialog(QWidget* parent) : + QDialog(parent), + p {std::make_unique(this)}, + ui(new Ui::AlertDialog) +{ + ui->setupUi(this); + + // Set monospace font for alert view + QFont monospaceFont("?"); + monospaceFont.setStyleHint(QFont::TypeWriter); + ui->alertText->setFont(monospaceFont); + + // Add Go button to button box + ui->buttonBox->addButton("&Go", QDialogButtonBox::ActionRole); + + p->ConnectSignals(); +} + +AlertDialog::~AlertDialog() +{ + delete ui; +} + +void AlertDialogImpl::ConnectSignals() {} + +bool AlertDialog::SelectAlert(const types::TextEventKey& key, + const common::Coordinate& coordinate) +{ + p->key_ = key; + p->coordinate_ = coordinate; + + setWindowTitle(QString::fromStdString(key.ToFullString())); + + auto messages = manager::TextEventManager::Instance().message_list(key); + if (messages.empty()) + { + return false; + } + + p->SelectIndex(messages.size() - 1); + + return true; +} + +void AlertDialogImpl::SelectIndex(size_t newIndex) +{ + size_t messageCount = + manager::TextEventManager::Instance().message_count(key_); + + if (newIndex >= messageCount) + { + return; + } + + auto messages = manager::TextEventManager::Instance().message_list(key_); + + currentIndex_ = newIndex; + + self_->ui->alertText->setText( + QString::fromStdString(messages[currentIndex_]->message_content())); + self_->ui->messageCountLabel->setText( + QObject::tr("%1 of %2").arg(currentIndex_ + 1).arg(messageCount)); + + bool firstSelected = (currentIndex_ == 0); + bool lastSelected = (currentIndex_ == messages.size() - 1); + + self_->ui->firstButton->setEnabled(!firstSelected); + self_->ui->previousButton->setEnabled(!firstSelected); + + self_->ui->nextButton->setEnabled(!lastSelected); + self_->ui->lastButton->setEnabled(!lastSelected); +} + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/alert_dialog.hpp b/scwx-qt/source/scwx/qt/ui/alert_dialog.hpp new file mode 100644 index 00000000..6768beea --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/alert_dialog.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include + +#include +#include + +namespace Ui +{ +class AlertDialog; +} + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +class AlertDialogImpl; + +class AlertDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AlertDialog(QWidget* parent = nullptr); + ~AlertDialog(); + + bool SelectAlert(const types::TextEventKey& key, + const common::Coordinate& coordinate); + +signals: + void MoveMap(double latitude, double longitude); + +private: + friend class AlertDialogImpl; + std::unique_ptr p; + Ui::AlertDialog* ui; +}; + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/alert_dialog.ui b/scwx-qt/source/scwx/qt/ui/alert_dialog.ui new file mode 100644 index 00000000..55686925 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/alert_dialog.ui @@ -0,0 +1,173 @@ + + + AlertDialog + + + + 0 + 0 + 540 + 600 + + + + Dialog + + + + + + QTextEdit::NoWrap + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + First + + + ... + + + + :/res/icons/font-awesome-6/backward-step-solid.svg:/res/icons/font-awesome-6/backward-step-solid.svg + + + + + + + Previous + + + ... + + + + :/res/icons/font-awesome-6/angle-left-solid.svg:/res/icons/font-awesome-6/angle-left-solid.svg + + + + + + + Next + + + ... + + + + :/res/icons/font-awesome-6/angle-right-solid.svg:/res/icons/font-awesome-6/angle-right-solid.svg + + + + + + + Last + + + ... + + + + :/res/icons/font-awesome-6/forward-step-solid.svg:/res/icons/font-awesome-6/forward-step-solid.svg + + + + + + + # of # + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + + + + + + buttonBox + accepted() + AlertDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AlertDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/scwx-qt/source/scwx/qt/ui/alert_dock_widget.cpp b/scwx-qt/source/scwx/qt/ui/alert_dock_widget.cpp index 2102691f..69350fdf 100644 --- a/scwx-qt/source/scwx/qt/ui/alert_dock_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/alert_dock_widget.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,7 @@ public: self_ {self}, alertModel_ {std::make_unique()}, proxyModel_ {std::make_unique()}, + alertDialog_ {new AlertDialog(self)}, mapPosition_ {}, mapUpdateDeferred_ {false}, selectedAlertKey_ {}, @@ -44,6 +46,8 @@ public: std::unique_ptr alertModel_; std::unique_ptr proxyModel_; + AlertDialog* alertDialog_; + scwx::common::Coordinate mapPosition_; bool mapUpdateDeferred_; @@ -151,9 +155,12 @@ void AlertDockWidgetImpl::ConnectSignals() connect(self_->ui->alertViewButton, &QPushButton::clicked, this, - []() + [=]() { - // TODO: View alert + // View alert + alertDialog_->SelectAlert(selectedAlertKey_, + selectedAlertCentroid_); + alertDialog_->show(); }); connect(self_->ui->alertGoButton, &QPushButton::clicked, @@ -163,6 +170,8 @@ void AlertDockWidgetImpl::ConnectSignals() emit self_->MoveMap(selectedAlertCentroid_.latitude_, selectedAlertCentroid_.longitude_); }); + connect( + alertDialog_, &AlertDialog::MoveMap, self_, &AlertDockWidget::MoveMap); } #include "alert_dock_widget.moc"