Refactor Alert Dock Widget to its own class

This commit is contained in:
Dan Paulat 2022-10-16 00:16:35 -05:00
parent 1c5e0d51b7
commit f8021b00bf
6 changed files with 323 additions and 132 deletions

View file

@ -106,17 +106,20 @@ 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/flow_layout.hpp
set(HDR_UI 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/flow_layout.cpp
set(SRC_UI 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/radar_site_dialog.ui)
set(UI_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
source/scwx/qt/util/json.hpp

View file

@ -7,9 +7,8 @@
#include <scwx/qt/manager/settings_manager.hpp>
#include <scwx/qt/manager/text_event_manager.hpp>
#include <scwx/qt/map/map_widget.hpp>
#include <scwx/qt/model/alert_model.hpp>
#include <scwx/qt/model/radar_product_model.hpp>
#include <scwx/qt/types/qt_types.hpp>
#include <scwx/qt/ui/alert_dock_widget.hpp>
#include <scwx/qt/ui/flow_layout.hpp>
#include <scwx/qt/ui/level2_products_widget.hpp>
#include <scwx/qt/ui/level2_settings_widget.hpp>
@ -22,7 +21,6 @@
#include <QFileDialog>
#include <QMessageBox>
#include <QSortFilterProxyModel>
#include <QSplitter>
#include <QStandardPaths>
#include <QToolButton>
@ -48,9 +46,8 @@ public:
activeMap_ {nullptr},
level2ProductsWidget_ {nullptr},
level2SettingsWidget_ {nullptr},
alertDockWidget_ {nullptr},
radarSiteDialog_ {nullptr},
alertModel_ {std::make_unique<model::AlertModel>()},
alertProxyModel_ {std::make_unique<QSortFilterProxyModel>()},
radarProductModel_ {nullptr},
maps_ {},
elevationCuts_ {},
@ -79,15 +76,11 @@ public:
settings_.setApiKey(QString {mapboxApiKey.c_str()});
settings_.setCacheDatabasePath(QString {cacheDbPath.c_str()});
settings_.setCacheDatabaseMaximumSize(20 * 1024 * 1024);
alertProxyModel_->setSourceModel(alertModel_.get());
alertProxyModel_->setSortRole(types::SortRole);
alertProxyModel_->setFilterCaseSensitivity(Qt::CaseInsensitive);
alertProxyModel_->setFilterKeyColumn(-1);
}
~MainWindowImpl() = default;
void ConfigureMapLayout();
void ConnectAlertSignals();
void ConnectMapSignals();
void ConnectOtherSignals();
void HandleFocusChange(QWidget* focused);
@ -114,10 +107,9 @@ public:
ui::Level3ProductsWidget* level3ProductsWidget_;
ui::AlertDockWidget* alertDockWidget_;
ui::RadarSiteDialog* radarSiteDialog_;
std::unique_ptr<model::AlertModel> alertModel_;
std::unique_ptr<QSortFilterProxyModel> alertProxyModel_;
std::unique_ptr<model::RadarProductModel> radarProductModel_;
std::vector<map::MapWidget*> maps_;
@ -148,6 +140,11 @@ MainWindow::MainWindow(QWidget* parent) :
ui->vcpValueLabel->setVisible(false);
ui->vcpDescriptionLabel->setVisible(false);
// Configure Alert Dock
p->alertDockWidget_ = new ui::AlertDockWidget(this);
p->alertDockWidget_->setVisible(false);
addDockWidget(Qt::BottomDockWidgetArea, p->alertDockWidget_);
// Configure Menu
ui->menuView->insertAction(ui->actionRadarToolbox,
ui->radarToolboxDock->toggleViewAction());
@ -161,8 +158,8 @@ MainWindow::MainWindow(QWidget* parent) :
ui->actionResourceExplorer->setVisible(false);
ui->menuView->insertAction(ui->actionAlerts,
ui->alertDock->toggleViewAction());
ui->alertDock->toggleViewAction()->setText(tr("&Alerts"));
p->alertDockWidget_->toggleViewAction());
p->alertDockWidget_->toggleViewAction()->setText(tr("&Alerts"));
ui->actionAlerts->setVisible(false);
// Configure Resource Explorer Dock
@ -171,13 +168,6 @@ MainWindow::MainWindow(QWidget* parent) :
p->radarProductModel_ = std::make_unique<model::RadarProductModel>();
ui->resourceTreeView->setModel(p->radarProductModel_->model());
// Configure Alert Dock
ui->alertDock->setVisible(false);
ui->alertView->setModel(p->alertProxyModel_.get());
ui->alertSettings->addAction(ui->actionActiveAlerts);
// Configure Map
p->ConfigureMapLayout();
@ -475,19 +465,10 @@ void MainWindowImpl::ConnectOtherSignals()
&ui::Level2SettingsWidget::ElevationSelected,
mainWindow_,
[&](float elevation) { SelectElevation(activeMap_, elevation); });
connect(mainWindow_->ui->alertFilter,
&QLineEdit::textChanged,
alertProxyModel_.get(),
&QSortFilterProxyModel::setFilterWildcard);
connect(mainWindow_,
&MainWindow::ActiveMapMoved,
alertModel_.get(),
&model::AlertModel::HandleMapUpdate,
Qt::QueuedConnection);
connect(&manager::TextEventManager::Instance(),
&manager::TextEventManager::AlertUpdated,
alertModel_.get(),
&model::AlertModel::HandleAlert,
alertDockWidget_,
&ui::AlertDockWidget::HandleMapUpdate,
Qt::QueuedConnection);
connect(mainWindow_,
&MainWindow::ActiveMapMoved,

View file

@ -307,95 +307,6 @@
</layout>
</widget>
</widget>
<widget class="QDockWidget" name="alertDock">
<property name="windowTitle">
<string>Alerts</string>
</property>
<attribute name="dockWidgetArea">
<number>8</number>
</attribute>
<widget class="QWidget" name="radarDockContents">
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QTreeView" name="alertView">
<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_2">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<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="QLineEdit" name="alertFilter">
<property name="placeholderText">
<string>Filter</string>
</property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="alertSettings">
<property name="toolTip">
<string>Settings</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/sliders-solid.svg</normaloff>:/res/icons/font-awesome-6/sliders-solid.svg</iconset>
</property>
<property name="popupMode">
<enum>QToolButton::InstantPopup</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
<action name="actionExit">
<property name="text">
<string>E&amp;xit</string>
@ -431,14 +342,6 @@
<string>&amp;Alerts</string>
</property>
</action>
<action name="actionActiveAlerts">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Active Alerts</string>
</property>
</action>
</widget>
<resources>
<include location="../../../../scwx-qt.qrc"/>

View file

@ -0,0 +1,139 @@
#include "alert_dock_widget.hpp"
#include "ui_alert_dock_widget.h"
#include <scwx/qt/manager/text_event_manager.hpp>
#include <scwx/qt/model/alert_model.hpp>
#include <scwx/qt/types/qt_types.hpp>
#include <scwx/util/logger.hpp>
#include <QSortFilterProxyModel>
namespace scwx
{
namespace qt
{
namespace ui
{
static const std::string logPrefix_ = "scwx::qt::ui::alert_dock_widget";
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
class AlertDockWidgetImpl : QObject
{
Q_OBJECT
public:
explicit AlertDockWidgetImpl(AlertDockWidget* self) :
self_ {self},
alertModel_ {std::make_unique<model::AlertModel>()},
proxyModel_ {std::make_unique<QSortFilterProxyModel>()},
mapPosition_ {},
mapUpdateDeferred_ {false}
{
proxyModel_->setSourceModel(alertModel_.get());
proxyModel_->setSortRole(types::SortRole);
proxyModel_->setFilterCaseSensitivity(Qt::CaseInsensitive);
proxyModel_->setFilterKeyColumn(-1);
}
~AlertDockWidgetImpl() = default;
void ConnectSignals();
AlertDockWidget* self_;
std::unique_ptr<model::AlertModel> alertModel_;
std::unique_ptr<QSortFilterProxyModel> proxyModel_;
scwx::common::Coordinate mapPosition_;
bool mapUpdateDeferred_;
};
AlertDockWidget::AlertDockWidget(QWidget* parent) :
QDockWidget(parent),
p {std::make_unique<AlertDockWidgetImpl>(this)},
ui(new Ui::AlertDockWidget)
{
ui->setupUi(this);
ui->alertView->setModel(p->proxyModel_.get());
ui->alertSettings->addAction(ui->actionActiveAlerts);
p->ConnectSignals();
}
AlertDockWidget::~AlertDockWidget()
{
delete ui;
}
void AlertDockWidget::showEvent(QShowEvent* event)
{
if (p->mapUpdateDeferred_)
{
p->alertModel_->HandleMapUpdate(p->mapPosition_.latitude_,
p->mapPosition_.longitude_);
p->mapUpdateDeferred_ = false;
}
QDockWidget::showEvent(event);
}
void AlertDockWidget::HandleMapUpdate(double latitude, double longitude)
{
p->mapPosition_ = {latitude, longitude};
if (isVisible())
{
p->alertModel_->HandleMapUpdate(latitude, longitude);
}
else
{
p->mapUpdateDeferred_ = true;
}
}
void AlertDockWidgetImpl::ConnectSignals()
{
connect(self_->ui->alertFilter,
&QLineEdit::textChanged,
proxyModel_.get(),
&QSortFilterProxyModel::setFilterWildcard);
connect(&manager::TextEventManager::Instance(),
&manager::TextEventManager::AlertUpdated,
alertModel_.get(),
&model::AlertModel::HandleAlert,
Qt::QueuedConnection);
connect(self_->ui->alertView->selectionModel(),
&QItemSelectionModel::selectionChanged,
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;
}
});
connect(self_->ui->alertViewButton,
&QPushButton::clicked,
this,
[]()
{
// TODO: View alert
});
connect(self_->ui->alertGoButton,
&QPushButton::clicked,
this,
[]()
{
// TODO: Go to alert
});
}
#include "alert_dock_widget.moc"
} // namespace ui
} // namespace qt
} // namespace scwx

View file

@ -0,0 +1,41 @@
#pragma once
#include <QDockWidget>
namespace Ui
{
class AlertDockWidget;
}
namespace scwx
{
namespace qt
{
namespace ui
{
class AlertDockWidgetImpl;
class AlertDockWidget : public QDockWidget
{
Q_OBJECT
public:
explicit AlertDockWidget(QWidget* parent = nullptr);
~AlertDockWidget();
protected:
void showEvent(QShowEvent*) override;
public slots:
void HandleMapUpdate(double latitude, double longitude);
private:
friend class AlertDockWidgetImpl;
std::unique_ptr<AlertDockWidgetImpl> p;
Ui::AlertDockWidget* ui;
};
} // namespace ui
} // namespace qt
} // namespace scwx

View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AlertDockWidget</class>
<widget class="QDockWidget" name="AlertDockWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Alerts</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTreeView" name="alertView">
<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_2">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<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="QLineEdit" name="alertFilter">
<property name="placeholderText">
<string>Filter</string>
</property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="alertSettings">
<property name="toolTip">
<string>Settings</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/sliders-solid.svg</normaloff>:/res/icons/font-awesome-6/sliders-solid.svg</iconset>
</property>
<property name="popupMode">
<enum>QToolButton::InstantPopup</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="alertViewButton">
<property name="text">
<string>&amp;View</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="alertGoButton">
<property name="text">
<string>&amp;Go</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<action name="actionActiveAlerts">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Active Alerts</string>
</property>
</action>
</widget>
<resources>
<include location="../../../../scwx-qt.qrc"/>
</resources>
<connections/>
</ui>