mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-11-01 00:10:04 +00:00
Mark favorites in radar site dialog
- No effect currently - Does not persist through application restart
This commit is contained in:
parent
e721633629
commit
9d673af291
6 changed files with 114 additions and 34 deletions
1
scwx-qt/res/icons/font-awesome-6/star-solid.svg
Normal file
1
scwx-qt/res/icons/font-awesome-6/star-solid.svg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="18" viewBox="0 0 576 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2023 Fonticons, Inc.--><path opacity="1" fill="#000000" d="M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z"/></svg>
|
||||||
|
After Width: | Height: | Size: 615 B |
|
|
@ -45,6 +45,7 @@
|
||||||
<file>res/icons/font-awesome-6/square-caret-right-regular.svg</file>
|
<file>res/icons/font-awesome-6/square-caret-right-regular.svg</file>
|
||||||
<file>res/icons/font-awesome-6/square-minus-regular.svg</file>
|
<file>res/icons/font-awesome-6/square-minus-regular.svg</file>
|
||||||
<file>res/icons/font-awesome-6/square-plus-regular.svg</file>
|
<file>res/icons/font-awesome-6/square-plus-regular.svg</file>
|
||||||
|
<file>res/icons/font-awesome-6/star-solid.svg</file>
|
||||||
<file>res/icons/font-awesome-6/stop-solid.svg</file>
|
<file>res/icons/font-awesome-6/stop-solid.svg</file>
|
||||||
<file>res/icons/font-awesome-6/volume-high-solid.svg</file>
|
<file>res/icons/font-awesome-6/volume-high-solid.svg</file>
|
||||||
<file>res/palettes/wct/CC.pal</file>
|
<file>res/palettes/wct/CC.pal</file>
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@
|
||||||
#include <scwx/common/geographic.hpp>
|
#include <scwx/common/geographic.hpp>
|
||||||
#include <scwx/util/logger.hpp>
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
||||||
|
#include <QIcon>
|
||||||
|
|
||||||
namespace scwx
|
namespace scwx
|
||||||
{
|
{
|
||||||
namespace qt
|
namespace qt
|
||||||
|
|
@ -15,15 +17,11 @@ namespace model
|
||||||
static const std::string logPrefix_ = "scwx::qt::model::radar_site_model";
|
static const std::string logPrefix_ = "scwx::qt::model::radar_site_model";
|
||||||
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||||
|
|
||||||
static constexpr size_t kColumnSiteId = 0u;
|
static constexpr int kFirstColumn =
|
||||||
static constexpr size_t kColumnPlace = 1u;
|
static_cast<int>(RadarSiteModel::Column::SiteId);
|
||||||
static constexpr size_t kColumnState = 2u;
|
static constexpr int kLastColumn =
|
||||||
static constexpr size_t kColumnCountry = 3u;
|
static_cast<int>(RadarSiteModel::Column::Favorite);
|
||||||
static constexpr size_t kColumnLatitude = 4u;
|
static constexpr int kNumColumns = kLastColumn - kFirstColumn + 1;
|
||||||
static constexpr size_t kColumnLongitude = 5u;
|
|
||||||
static constexpr size_t kColumnType = 6u;
|
|
||||||
static constexpr size_t kColumnDistance = 7u;
|
|
||||||
static constexpr size_t kNumColumns = 8u;
|
|
||||||
|
|
||||||
class RadarSiteModelImpl
|
class RadarSiteModelImpl
|
||||||
{
|
{
|
||||||
|
|
@ -32,12 +30,15 @@ public:
|
||||||
~RadarSiteModelImpl() = default;
|
~RadarSiteModelImpl() = default;
|
||||||
|
|
||||||
QList<std::shared_ptr<config::RadarSite>> radarSites_;
|
QList<std::shared_ptr<config::RadarSite>> radarSites_;
|
||||||
|
std::vector<bool> favorites_;
|
||||||
|
|
||||||
const GeographicLib::Geodesic& geodesic_;
|
const GeographicLib::Geodesic& geodesic_;
|
||||||
|
|
||||||
std::unordered_map<std::string, double> distanceMap_;
|
std::unordered_map<std::string, double> distanceMap_;
|
||||||
scwx::common::DistanceType distanceDisplay_;
|
scwx::common::DistanceType distanceDisplay_;
|
||||||
scwx::common::Coordinate previousPosition_;
|
scwx::common::Coordinate previousPosition_;
|
||||||
|
|
||||||
|
QIcon starIcon_ {":/res/icons/font-awesome-6/star-solid.svg"};
|
||||||
};
|
};
|
||||||
|
|
||||||
RadarSiteModel::RadarSiteModel(QObject* parent) :
|
RadarSiteModel::RadarSiteModel(QObject* parent) :
|
||||||
|
|
@ -53,28 +54,32 @@ int RadarSiteModel::rowCount(const QModelIndex& parent) const
|
||||||
|
|
||||||
int RadarSiteModel::columnCount(const QModelIndex& parent) const
|
int RadarSiteModel::columnCount(const QModelIndex& parent) const
|
||||||
{
|
{
|
||||||
return parent.isValid() ? 0 : static_cast<int>(kNumColumns);
|
return parent.isValid() ? 0 : kNumColumns;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant RadarSiteModel::data(const QModelIndex& index, int role) const
|
QVariant RadarSiteModel::data(const QModelIndex& index, int role) const
|
||||||
{
|
{
|
||||||
if (index.isValid() && index.row() >= 0 &&
|
if (!index.isValid() || index.row() < 0 ||
|
||||||
index.row() < p->radarSites_.size() &&
|
index.row() >= p->radarSites_.size())
|
||||||
(role == Qt::DisplayRole || role == types::SortRole))
|
|
||||||
{
|
{
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
const auto& site = p->radarSites_.at(index.row());
|
const auto& site = p->radarSites_.at(index.row());
|
||||||
|
|
||||||
|
if (role == Qt::DisplayRole || role == types::SortRole)
|
||||||
|
{
|
||||||
switch (index.column())
|
switch (index.column())
|
||||||
{
|
{
|
||||||
case kColumnSiteId:
|
case static_cast<int>(Column::SiteId):
|
||||||
return QString::fromStdString(site->id());
|
return QString::fromStdString(site->id());
|
||||||
case kColumnPlace:
|
case static_cast<int>(Column::Place):
|
||||||
return QString::fromStdString(site->place());
|
return QString::fromStdString(site->place());
|
||||||
case kColumnState:
|
case static_cast<int>(Column::State):
|
||||||
return QString::fromStdString(site->state());
|
return QString::fromStdString(site->state());
|
||||||
case kColumnCountry:
|
case static_cast<int>(Column::Country):
|
||||||
return QString::fromStdString(site->country());
|
return QString::fromStdString(site->country());
|
||||||
case kColumnLatitude:
|
case static_cast<int>(Column::Latitude):
|
||||||
if (role == Qt::DisplayRole)
|
if (role == Qt::DisplayRole)
|
||||||
{
|
{
|
||||||
return QString::fromStdString(
|
return QString::fromStdString(
|
||||||
|
|
@ -84,7 +89,7 @@ QVariant RadarSiteModel::data(const QModelIndex& index, int role) const
|
||||||
{
|
{
|
||||||
return site->latitude();
|
return site->latitude();
|
||||||
}
|
}
|
||||||
case kColumnLongitude:
|
case static_cast<int>(Column::Longitude):
|
||||||
if (role == Qt::DisplayRole)
|
if (role == Qt::DisplayRole)
|
||||||
{
|
{
|
||||||
return QString::fromStdString(
|
return QString::fromStdString(
|
||||||
|
|
@ -94,9 +99,9 @@ QVariant RadarSiteModel::data(const QModelIndex& index, int role) const
|
||||||
{
|
{
|
||||||
return site->longitude();
|
return site->longitude();
|
||||||
}
|
}
|
||||||
case kColumnType:
|
case static_cast<int>(Column::Type):
|
||||||
return QString::fromStdString(site->type_name());
|
return QString::fromStdString(site->type_name());
|
||||||
case kColumnDistance:
|
case static_cast<int>(Column::Distance):
|
||||||
if (role == Qt::DisplayRole)
|
if (role == Qt::DisplayRole)
|
||||||
{
|
{
|
||||||
if (p->distanceDisplay_ == scwx::common::DistanceType::Miles)
|
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());
|
return p->distanceMap_.at(site->id());
|
||||||
}
|
}
|
||||||
|
case static_cast<int>(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<int>(Column::Favorite):
|
||||||
|
if (p->favorites_.at(index.row()))
|
||||||
|
{
|
||||||
|
return p->starIcon_;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -134,27 +159,40 @@ QVariant RadarSiteModel::headerData(int section,
|
||||||
{
|
{
|
||||||
switch (section)
|
switch (section)
|
||||||
{
|
{
|
||||||
case kColumnSiteId:
|
case static_cast<int>(Column::SiteId):
|
||||||
return tr("Site ID");
|
return tr("Site ID");
|
||||||
case kColumnPlace:
|
case static_cast<int>(Column::Place):
|
||||||
return tr("Place");
|
return tr("Place");
|
||||||
case kColumnState:
|
case static_cast<int>(Column::State):
|
||||||
return tr("State");
|
return tr("State");
|
||||||
case kColumnCountry:
|
case static_cast<int>(Column::Country):
|
||||||
return tr("Country");
|
return tr("Country");
|
||||||
case kColumnLatitude:
|
case static_cast<int>(Column::Latitude):
|
||||||
return tr("Latitude");
|
return tr("Latitude");
|
||||||
case kColumnLongitude:
|
case static_cast<int>(Column::Longitude):
|
||||||
return tr("Longitude");
|
return tr("Longitude");
|
||||||
case kColumnType:
|
case static_cast<int>(Column::Type):
|
||||||
return tr("Type");
|
return tr("Type");
|
||||||
case kColumnDistance:
|
case static_cast<int>(Column::Distance):
|
||||||
return tr("Distance");
|
return tr("Distance");
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (role == Qt::DecorationRole)
|
||||||
|
{
|
||||||
|
if (orientation == Qt::Horizontal)
|
||||||
|
{
|
||||||
|
switch (section)
|
||||||
|
{
|
||||||
|
case static_cast<int>(Column::Favorite):
|
||||||
|
return p->starIcon_;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
@ -175,12 +213,21 @@ void RadarSiteModel::HandleMapUpdate(double latitude, double longitude)
|
||||||
p->distanceMap_[site->id()] = distanceInMeters;
|
p->distanceMap_[site->id()] = distanceInMeters;
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex topLeft = createIndex(0, kColumnDistance);
|
QModelIndex topLeft = createIndex(0, static_cast<int>(Column::Distance));
|
||||||
QModelIndex bottomRight = createIndex(rowCount() - 1, kColumnDistance);
|
QModelIndex bottomRight =
|
||||||
|
createIndex(rowCount() - 1, static_cast<int>(Column::Distance));
|
||||||
|
|
||||||
Q_EMIT dataChanged(topLeft, bottomRight);
|
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() :
|
RadarSiteModelImpl::RadarSiteModelImpl() :
|
||||||
radarSites_ {},
|
radarSites_ {},
|
||||||
geodesic_(util::GeographicLib::DefaultGeodesic()),
|
geodesic_(util::GeographicLib::DefaultGeodesic()),
|
||||||
|
|
@ -197,6 +244,7 @@ RadarSiteModelImpl::RadarSiteModelImpl() :
|
||||||
{
|
{
|
||||||
distanceMap_[site->id()] = 0.0;
|
distanceMap_[site->id()] = 0.0;
|
||||||
radarSites_.emplace_back(std::move(site));
|
radarSites_.emplace_back(std::move(site));
|
||||||
|
favorites_.emplace_back(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,19 @@ class RadarSiteModelImpl;
|
||||||
class RadarSiteModel : public QAbstractTableModel
|
class RadarSiteModel : public QAbstractTableModel
|
||||||
{
|
{
|
||||||
public:
|
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);
|
explicit RadarSiteModel(QObject* parent = nullptr);
|
||||||
~RadarSiteModel();
|
~RadarSiteModel();
|
||||||
|
|
||||||
|
|
@ -29,6 +42,7 @@ public:
|
||||||
int role = Qt::DisplayRole) const override;
|
int role = Qt::DisplayRole) const override;
|
||||||
|
|
||||||
void HandleMapUpdate(double latitude, double longitude);
|
void HandleMapUpdate(double latitude, double longitude);
|
||||||
|
void ToggleFavorite(int row);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<RadarSiteModelImpl> p;
|
std::unique_ptr<RadarSiteModelImpl> p;
|
||||||
|
|
|
||||||
|
|
@ -70,9 +70,22 @@ RadarSiteDialog::RadarSiteDialog(QWidget* parent) :
|
||||||
p->proxyModel_,
|
p->proxyModel_,
|
||||||
&QSortFilterProxyModel::setFilterWildcard);
|
&QSortFilterProxyModel::setFilterWildcard);
|
||||||
connect(ui->radarSiteView,
|
connect(ui->radarSiteView,
|
||||||
&QTreeView::doubleClicked,
|
&QAbstractItemView::doubleClicked,
|
||||||
this,
|
this,
|
||||||
[this]() { Q_EMIT accept(); });
|
[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<int>(model::RadarSiteModel::Column::Favorite))
|
||||||
|
{
|
||||||
|
p->radarSiteModel_->ToggleFavorite(selectedIndex.row());
|
||||||
|
}
|
||||||
|
});
|
||||||
connect(
|
connect(
|
||||||
ui->radarSiteView->selectionModel(),
|
ui->radarSiteView->selectionModel(),
|
||||||
&QItemSelectionModel::selectionChanged,
|
&QItemSelectionModel::selectionChanged,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>576</width>
|
<width>627</width>
|
||||||
<height>550</height>
|
<height>550</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
|
@ -16,6 +16,9 @@
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTreeView" name="radarSiteView">
|
<widget class="QTreeView" name="radarSiteView">
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::CurrentChanged|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set>
|
||||||
|
</property>
|
||||||
<property name="alternatingRowColors">
|
<property name="alternatingRowColors">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue