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"