summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-05-02 00:09:59 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-05-11 12:06:19 -0700
commita35d1bd0e79e83b5ef49b76087e7cfe5a38d829c (patch)
treedcacd763679c0fe2c9ce267f3c21dadc9c99393f
parent446dfed6e72971ed91df9378bd5b7b34c90b690a (diff)
downloadsubsurface-a35d1bd0e79e83b5ef49b76087e7cfe5a38d829c.tar.gz
Map: show multiple selected dive sites
If multiple dives are selected, highlight all corresponding sites. For that, replace the MapLocationModel::m_selectedDs pointer by a QVector<>. Fill the vector in MapLocationModel::reload() and add a isSelected() member function. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--map-widget/qml/MapWidget.qml12
-rw-r--r--qt-models/maplocationmodel.cpp21
-rw-r--r--qt-models/maplocationmodel.h8
3 files changed, 23 insertions, 18 deletions
diff --git a/map-widget/qml/MapWidget.qml b/map-widget/qml/MapWidget.qml
index 77fd2141c..88e9d95a6 100644
--- a/map-widget/qml/MapWidget.qml
+++ b/map-widget/qml/MapWidget.qml
@@ -56,17 +56,17 @@ Item {
anchorPoint.x: 0
anchorPoint.y: mapItemImage.height
coordinate: model.coordinate
- z: mapHelper.model.selectedDs === model.divesite ? mapHelper.model.count - 1 : 0
+ z: mapHelper.model.isSelected(model.divesite) ? mapHelper.model.count - 1 : 0
sourceItem: Image {
id: mapItemImage
- source: "qrc:///dive-location-marker" + (mapHelper.model.selectedDs === model.divesite ? "-selected" : (mapHelper.editMode ? "-inactive" : "")) + "-icon"
+ source: "qrc:///dive-location-marker" + (mapHelper.model.isSelected(model.divesite) ? "-selected" : (mapHelper.editMode ? "-inactive" : "")) + "-icon"
SequentialAnimation {
id: mapItemImageAnimation
PropertyAnimation { target: mapItemImage; property: "scale"; from: 1.0; to: 0.7; duration: 120 }
PropertyAnimation { target: mapItemImage; property: "scale"; from: 0.7; to: 1.0; duration: 80 }
}
MouseArea {
- drag.target: (mapHelper.editMode && mapHelper.model.selectedDs === model.divesite) ? mapItem : undefined
+ drag.target: (mapHelper.editMode && mapHelper.model.isSelected(model.divesite)) ? mapItem : undefined
anchors.fill: parent
onClicked: {
if (!mapHelper.editMode)
@@ -74,8 +74,8 @@ Item {
}
onDoubleClicked: map.doubleClickHandler(mapItem.coordinate)
onReleased: {
- if (mapHelper.editMode && mapHelper.model.selectedDs === model.divesite) {
- mapHelper.updateCurrentDiveSiteCoordinatesFromMap(mapHelper.model.selectedDs, mapItem.coordinate)
+ if (mapHelper.editMode && mapHelper.model.isSelected(model.divesite)) {
+ mapHelper.updateCurrentDiveSiteCoordinatesFromMap(model.divesite, mapItem.coordinate)
}
}
}
@@ -94,7 +94,7 @@ Item {
id: mapItemText
text: model.name
font.pointSize: 11.0
- color: mapHelper.model.selectedDs === model.divesite ? "white" : "lightgrey"
+ color: mapHelper.model.isSelected(model.divesite) ? "white" : "lightgrey"
}
}
}
diff --git a/qt-models/maplocationmodel.cpp b/qt-models/maplocationmodel.cpp
index 85c106ff1..90d7209f7 100644
--- a/qt-models/maplocationmodel.cpp
+++ b/qt-models/maplocationmodel.cpp
@@ -61,8 +61,7 @@ QVariant MapLocation::divesiteVariant()
return QVariant::fromValue(m_ds);
}
-MapLocationModel::MapLocationModel(QObject *parent) : QAbstractListModel(parent),
- m_selectedDs(nullptr)
+MapLocationModel::MapLocationModel(QObject *parent) : QAbstractListModel(parent)
{
m_roles[MapLocation::Roles::RoleDivesite] = MapLocation::PROPERTY_NAME_DIVESITE;
m_roles[MapLocation::Roles::RoleCoordinate] = MapLocation::PROPERTY_NAME_COORDINATE;
@@ -120,6 +119,7 @@ void MapLocationModel::reload()
qDeleteAll(m_mapLocations);
m_mapLocations.clear();
+ m_selectedDs.clear();
QMap<QString, MapLocation *> locationNameMap;
MapLocation *location;
@@ -140,7 +140,11 @@ void MapLocationModel::reload()
if (!diveSiteMode && dive->hidden_by_filter && dive != current_dive)
continue;
struct dive_site *ds = get_dive_site_for_dive(dive);
- if (!dive_site_has_gps_location(ds) || locations.contains(ds))
+ if (!dive_site_has_gps_location(ds))
+ continue;
+ if (dive->selected && !m_selectedDs.contains(ds))
+ m_selectedDs.append(ds);
+ if (locations.contains(ds))
continue;
latitude = ds->location.lat.udeg * 0.000001;
longitude = ds->location.lon.udeg * 0.000001;
@@ -165,15 +169,16 @@ void MapLocationModel::reload()
void MapLocationModel::setSelected(struct dive_site *ds, bool fromClick)
{
- m_selectedDs = ds;
- emit selectedDsChanged();
+ m_selectedDs.clear();
+ m_selectedDs.append(ds);
if (fromClick)
- emit selectedLocationChanged(getMapLocation(m_selectedDs));
+ emit selectedLocationChanged(getMapLocation(ds));
}
-QVariant MapLocationModel::selectedDs()
+bool MapLocationModel::isSelected(const QVariant &dsVariant) const
{
- return QVariant::fromValue(m_selectedDs);
+ dive_site *ds = dsVariant.value<dive_site *>();
+ return ds && m_selectedDs.contains(ds);
}
MapLocation *MapLocationModel::getMapLocation(const struct dive_site *ds)
diff --git a/qt-models/maplocationmodel.h b/qt-models/maplocationmodel.h
index 6c28c6c99..6f075cc84 100644
--- a/qt-models/maplocationmodel.h
+++ b/qt-models/maplocationmodel.h
@@ -50,7 +50,6 @@ class MapLocationModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(int count READ count NOTIFY countChanged)
- Q_PROPERTY(QVariant selectedDs READ selectedDs NOTIFY selectedDsChanged)
public:
MapLocationModel(QObject *parent = NULL);
@@ -65,7 +64,9 @@ public:
MapLocation *getMapLocation(const struct dive_site *ds);
void updateMapLocationCoordinates(const struct dive_site *ds, QGeoCoordinate coord);
Q_INVOKABLE void setSelected(struct dive_site *ds, bool fromClick = true);
- QVariant selectedDs();
+ // The dive site is passed as a QVariant, because a null-QVariant is not automatically
+ // transformed into a null pointer and warning messages are spewed onto the console.
+ Q_INVOKABLE bool isSelected(const QVariant &ds) const;
protected:
QHash<int, QByteArray> roleNames() const override;
@@ -73,11 +74,10 @@ protected:
private:
QVector<MapLocation *> m_mapLocations;
QHash<int, QByteArray> m_roles;
- struct dive_site *m_selectedDs;
+ QVector<dive_site *> m_selectedDs;
signals:
void countChanged(int c);
- void selectedDsChanged();
void selectedLocationChanged(MapLocation *);
};