From 9d673af29178509726beff74bf6823905b10eff7 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 17 Dec 2023 22:04:28 -0600 Subject: [PATCH] Mark favorites in radar site dialog - No effect currently - Does not persist through application restart --- .../res/icons/font-awesome-6/star-solid.svg | 1 + scwx-qt/scwx-qt.qrc | 1 + .../source/scwx/qt/model/radar_site_model.cpp | 112 +++++++++++++----- .../source/scwx/qt/model/radar_site_model.hpp | 14 +++ .../source/scwx/qt/ui/radar_site_dialog.cpp | 15 ++- .../source/scwx/qt/ui/radar_site_dialog.ui | 5 +- 6 files changed, 114 insertions(+), 34 deletions(-) create mode 100644 scwx-qt/res/icons/font-awesome-6/star-solid.svg diff --git a/scwx-qt/res/icons/font-awesome-6/star-solid.svg b/scwx-qt/res/icons/font-awesome-6/star-solid.svg new file mode 100644 index 00000000..fd180e80 --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/star-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index 45e79044..b9155f08 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -45,6 +45,7 @@ res/icons/font-awesome-6/square-caret-right-regular.svg res/icons/font-awesome-6/square-minus-regular.svg res/icons/font-awesome-6/square-plus-regular.svg + res/icons/font-awesome-6/star-solid.svg res/icons/font-awesome-6/stop-solid.svg res/icons/font-awesome-6/volume-high-solid.svg res/palettes/wct/CC.pal diff --git a/scwx-qt/source/scwx/qt/model/radar_site_model.cpp b/scwx-qt/source/scwx/qt/model/radar_site_model.cpp index ffca3638..0aed2a31 100644 --- a/scwx-qt/source/scwx/qt/model/radar_site_model.cpp +++ b/scwx-qt/source/scwx/qt/model/radar_site_model.cpp @@ -5,6 +5,8 @@ #include #include +#include + namespace scwx { namespace qt @@ -15,15 +17,11 @@ namespace model static const std::string logPrefix_ = "scwx::qt::model::radar_site_model"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); -static constexpr size_t kColumnSiteId = 0u; -static constexpr size_t kColumnPlace = 1u; -static constexpr size_t kColumnState = 2u; -static constexpr size_t kColumnCountry = 3u; -static constexpr size_t kColumnLatitude = 4u; -static constexpr size_t kColumnLongitude = 5u; -static constexpr size_t kColumnType = 6u; -static constexpr size_t kColumnDistance = 7u; -static constexpr size_t kNumColumns = 8u; +static constexpr int kFirstColumn = + static_cast(RadarSiteModel::Column::SiteId); +static constexpr int kLastColumn = + static_cast(RadarSiteModel::Column::Favorite); +static constexpr int kNumColumns = kLastColumn - kFirstColumn + 1; class RadarSiteModelImpl { @@ -32,12 +30,15 @@ public: ~RadarSiteModelImpl() = default; QList> radarSites_; + std::vector favorites_; const GeographicLib::Geodesic& geodesic_; std::unordered_map distanceMap_; scwx::common::DistanceType distanceDisplay_; scwx::common::Coordinate previousPosition_; + + QIcon starIcon_ {":/res/icons/font-awesome-6/star-solid.svg"}; }; RadarSiteModel::RadarSiteModel(QObject* parent) : @@ -53,28 +54,32 @@ int RadarSiteModel::rowCount(const QModelIndex& parent) const int RadarSiteModel::columnCount(const QModelIndex& parent) const { - return parent.isValid() ? 0 : static_cast(kNumColumns); + return parent.isValid() ? 0 : kNumColumns; } QVariant RadarSiteModel::data(const QModelIndex& index, int role) const { - if (index.isValid() && index.row() >= 0 && - index.row() < p->radarSites_.size() && - (role == Qt::DisplayRole || role == types::SortRole)) + if (!index.isValid() || index.row() < 0 || + index.row() >= p->radarSites_.size()) { - const auto& site = p->radarSites_.at(index.row()); + return QVariant(); + } + const auto& site = p->radarSites_.at(index.row()); + + if (role == Qt::DisplayRole || role == types::SortRole) + { switch (index.column()) { - case kColumnSiteId: + case static_cast(Column::SiteId): return QString::fromStdString(site->id()); - case kColumnPlace: + case static_cast(Column::Place): return QString::fromStdString(site->place()); - case kColumnState: + case static_cast(Column::State): return QString::fromStdString(site->state()); - case kColumnCountry: + case static_cast(Column::Country): return QString::fromStdString(site->country()); - case kColumnLatitude: + case static_cast(Column::Latitude): if (role == Qt::DisplayRole) { return QString::fromStdString( @@ -84,7 +89,7 @@ QVariant RadarSiteModel::data(const QModelIndex& index, int role) const { return site->latitude(); } - case kColumnLongitude: + case static_cast(Column::Longitude): if (role == Qt::DisplayRole) { return QString::fromStdString( @@ -94,9 +99,9 @@ QVariant RadarSiteModel::data(const QModelIndex& index, int role) const { return site->longitude(); } - case kColumnType: + case static_cast(Column::Type): return QString::fromStdString(site->type_name()); - case kColumnDistance: + case static_cast(Column::Distance): if (role == Qt::DisplayRole) { if (p->distanceDisplay_ == scwx::common::DistanceType::Miles) @@ -116,6 +121,26 @@ QVariant RadarSiteModel::data(const QModelIndex& index, int role) const { return p->distanceMap_.at(site->id()); } + case static_cast(Column::Favorite): + if (role == types::SortRole) + { + return QVariant(p->favorites_.at(index.row())); + } + break; + default: + break; + } + } + else if (role == Qt::DecorationRole) + { + switch (index.column()) + { + case static_cast(Column::Favorite): + if (p->favorites_.at(index.row())) + { + return p->starIcon_; + } + break; default: break; } @@ -134,27 +159,40 @@ QVariant RadarSiteModel::headerData(int section, { switch (section) { - case kColumnSiteId: + case static_cast(Column::SiteId): return tr("Site ID"); - case kColumnPlace: + case static_cast(Column::Place): return tr("Place"); - case kColumnState: + case static_cast(Column::State): return tr("State"); - case kColumnCountry: + case static_cast(Column::Country): return tr("Country"); - case kColumnLatitude: + case static_cast(Column::Latitude): return tr("Latitude"); - case kColumnLongitude: + case static_cast(Column::Longitude): return tr("Longitude"); - case kColumnType: + case static_cast(Column::Type): return tr("Type"); - case kColumnDistance: + case static_cast(Column::Distance): return tr("Distance"); default: break; } } } + else if (role == Qt::DecorationRole) + { + if (orientation == Qt::Horizontal) + { + switch (section) + { + case static_cast(Column::Favorite): + return p->starIcon_; + default: + break; + } + } + } return QVariant(); } @@ -175,12 +213,21 @@ void RadarSiteModel::HandleMapUpdate(double latitude, double longitude) p->distanceMap_[site->id()] = distanceInMeters; } - QModelIndex topLeft = createIndex(0, kColumnDistance); - QModelIndex bottomRight = createIndex(rowCount() - 1, kColumnDistance); + QModelIndex topLeft = createIndex(0, static_cast(Column::Distance)); + QModelIndex bottomRight = + createIndex(rowCount() - 1, static_cast(Column::Distance)); Q_EMIT dataChanged(topLeft, bottomRight); } +void RadarSiteModel::ToggleFavorite(int row) +{ + if (row >= 0 && row < p->favorites_.size()) + { + p->favorites_.at(row) = !p->favorites_.at(row); + } +} + RadarSiteModelImpl::RadarSiteModelImpl() : radarSites_ {}, geodesic_(util::GeographicLib::DefaultGeodesic()), @@ -197,6 +244,7 @@ RadarSiteModelImpl::RadarSiteModelImpl() : { distanceMap_[site->id()] = 0.0; radarSites_.emplace_back(std::move(site)); + favorites_.emplace_back(false); } } diff --git a/scwx-qt/source/scwx/qt/model/radar_site_model.hpp b/scwx-qt/source/scwx/qt/model/radar_site_model.hpp index 520be1b7..7a50f016 100644 --- a/scwx-qt/source/scwx/qt/model/radar_site_model.hpp +++ b/scwx-qt/source/scwx/qt/model/radar_site_model.hpp @@ -16,6 +16,19 @@ class RadarSiteModelImpl; class RadarSiteModel : public QAbstractTableModel { public: + enum class Column : int + { + SiteId = 0, + Place = 1, + State = 2, + Country = 3, + Latitude = 4, + Longitude = 5, + Type = 6, + Distance = 7, + Favorite = 8 + }; + explicit RadarSiteModel(QObject* parent = nullptr); ~RadarSiteModel(); @@ -29,6 +42,7 @@ public: int role = Qt::DisplayRole) const override; void HandleMapUpdate(double latitude, double longitude); + void ToggleFavorite(int row); private: std::unique_ptr p; diff --git a/scwx-qt/source/scwx/qt/ui/radar_site_dialog.cpp b/scwx-qt/source/scwx/qt/ui/radar_site_dialog.cpp index c7275b06..b35743cc 100644 --- a/scwx-qt/source/scwx/qt/ui/radar_site_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/radar_site_dialog.cpp @@ -70,9 +70,22 @@ RadarSiteDialog::RadarSiteDialog(QWidget* parent) : p->proxyModel_, &QSortFilterProxyModel::setFilterWildcard); connect(ui->radarSiteView, - &QTreeView::doubleClicked, + &QAbstractItemView::doubleClicked, this, [this]() { Q_EMIT accept(); }); + connect(ui->radarSiteView, + &QAbstractItemView::pressed, + this, + [this](const QModelIndex& index) + { + QModelIndex selectedIndex = p->proxyModel_->mapToSource(index); + + if (selectedIndex.column() == + static_cast(model::RadarSiteModel::Column::Favorite)) + { + p->radarSiteModel_->ToggleFavorite(selectedIndex.row()); + } + }); connect( ui->radarSiteView->selectionModel(), &QItemSelectionModel::selectionChanged, diff --git a/scwx-qt/source/scwx/qt/ui/radar_site_dialog.ui b/scwx-qt/source/scwx/qt/ui/radar_site_dialog.ui index c923054a..74eae33b 100644 --- a/scwx-qt/source/scwx/qt/ui/radar_site_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/radar_site_dialog.ui @@ -6,7 +6,7 @@ 0 0 - 576 + 627 550 @@ -16,6 +16,9 @@ + + QAbstractItemView::CurrentChanged|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked + true