From dabcf1114e18a220643772ac631973a296f72f7b Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 12 Nov 2022 22:48:15 -0600 Subject: [PATCH] Alert model cleanup, and size hints for columns --- scwx-qt/source/scwx/qt/model/alert_model.cpp | 103 +++++++++++++----- scwx-qt/source/scwx/qt/model/alert_model.hpp | 2 - .../source/scwx/qt/ui/alert_dock_widget.cpp | 2 + 3 files changed, 77 insertions(+), 30 deletions(-) diff --git a/scwx-qt/source/scwx/qt/model/alert_model.cpp b/scwx-qt/source/scwx/qt/model/alert_model.cpp index be31348f..a2213988 100644 --- a/scwx-qt/source/scwx/qt/model/alert_model.cpp +++ b/scwx-qt/source/scwx/qt/model/alert_model.cpp @@ -10,6 +10,8 @@ #include #include +#include +#include namespace scwx { @@ -24,7 +26,7 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_); static constexpr int kFirstColumn = static_cast(AlertModel::Column::Etn); static constexpr int kLastColumn = static_cast(AlertModel::Column::Distance); -static const int kNumColumns = 9; +static constexpr int kNumColumns = kLastColumn - kFirstColumn + 1; class AlertModelImpl { @@ -96,15 +98,17 @@ int AlertModel::columnCount(const QModelIndex& parent) const QVariant AlertModel::data(const QModelIndex& index, int role) const { - if (index.isValid() && index.row() >= 0 && - index.row() < p->textEventKeys_.size() && - (role == Qt::DisplayRole || role == types::SortRole || - (role == types::TimePointRole && - (index.column() == static_cast(Column::StartTime) || - index.column() == static_cast(Column::EndTime))))) + if (!index.isValid() || index.row() < 0 || + index.row() >= p->textEventKeys_.size()) { - const auto& textEventKey = p->textEventKeys_.at(index.row()); + return QVariant(); + } + const auto& textEventKey = p->textEventKeys_.at(index.row()); + + if (role == Qt::ItemDataRole::DisplayRole || + role == types::ItemDataRole::SortRole) + { switch (index.column()) { case static_cast(Column::Etn): @@ -129,28 +133,12 @@ QVariant AlertModel::data(const QModelIndex& index, int role) const AlertModelImpl::GetCounties(textEventKey)); case static_cast(Column::StartTime): - if (role == types::TimePointRole) - { - return QVariant::fromValue( - AlertModelImpl::GetStartTime(textEventKey)); - } - else - { - return QString::fromStdString( - AlertModelImpl::GetStartTimeString(textEventKey)); - } + return QString::fromStdString( + AlertModelImpl::GetStartTimeString(textEventKey)); case static_cast(Column::EndTime): - if (role == types::TimePointRole) - { - return QVariant::fromValue( - AlertModelImpl::GetEndTime(textEventKey)); - } - else - { - return QString::fromStdString( - AlertModelImpl::GetEndTimeString(textEventKey)); - } + return QString::fromStdString( + AlertModelImpl::GetEndTimeString(textEventKey)); case static_cast(Column::Distance): if (role == Qt::DisplayRole) @@ -177,6 +165,20 @@ QVariant AlertModel::data(const QModelIndex& index, int role) const break; } } + else if (role == types::ItemDataRole::TimePointRole) + { + switch (index.column()) + { + case static_cast(Column::StartTime): + return QVariant::fromValue(AlertModelImpl::GetStartTime(textEventKey)); + + case static_cast(Column::EndTime): + return QVariant::fromValue(AlertModelImpl::GetEndTime(textEventKey)); + + default: + break; + } + } return QVariant(); } @@ -222,6 +224,51 @@ AlertModel::headerData(int section, Qt::Orientation orientation, int role) const } } } + else if (role == Qt::ItemDataRole::SizeHintRole) + { + static const QFontMetrics fontMetrics(QApplication::font()); + + QSize contentsSize {}; + + switch (section) + { + case static_cast(Column::Etn): + contentsSize = fontMetrics.size(0, "0000"); // 24x16 + break; + + case static_cast(Column::Phenomenon): + contentsSize = fontMetrics.size(0, QString(10, 'W')); + break; + + case static_cast(Column::State): + contentsSize = fontMetrics.size(0, "WW, WW"); + break; + + case static_cast(Column::Counties): + contentsSize = fontMetrics.size(0, QString(15, 'W')); + break; + + case static_cast(Column::StartTime): + case static_cast(Column::EndTime): + contentsSize = fontMetrics.size(0, "0000-00-00 00:00:00"); + break; + + case static_cast(Column::Distance): + contentsSize = fontMetrics.size(0, "00000 km"); + break; + + default: + break; + } + + if (contentsSize != QSize {}) + { + // Add padding + // TODO: Ideally, derived using the current style, but how? + contentsSize += QSize(12, 8); + return QVariant(contentsSize); + } + } return QVariant(); } diff --git a/scwx-qt/source/scwx/qt/model/alert_model.hpp b/scwx-qt/source/scwx/qt/model/alert_model.hpp index 52fd5e1a..76bddf9d 100644 --- a/scwx-qt/source/scwx/qt/model/alert_model.hpp +++ b/scwx-qt/source/scwx/qt/model/alert_model.hpp @@ -2,7 +2,6 @@ #include #include -#include #include @@ -32,7 +31,6 @@ public: EndTime = 7, Distance = 8 }; - typedef util::Iterator ColumnIterator; explicit AlertModel(QObject* parent = nullptr); ~AlertModel(); 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 20a910b7..7d7b84d6 100644 --- a/scwx-qt/source/scwx/qt/ui/alert_dock_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/alert_dock_widget.cpp @@ -67,6 +67,8 @@ AlertDockWidget::AlertDockWidget(QWidget* parent) : ui->alertView->header()->setSortIndicator( static_cast(model::AlertModel::Column::Distance), Qt::AscendingOrder); + ui->alertView->header()->resizeSections( + QHeaderView::ResizeMode::ResizeToContents); ui->alertSettings->addAction(ui->actionActiveAlerts);