diff --git a/src/apps/marble-maps/PlacemarkDialog.qml b/src/apps/marble-maps/PlacemarkDialog.qml --- a/src/apps/marble-maps/PlacemarkDialog.qml +++ b/src/apps/marble-maps/PlacemarkDialog.qml @@ -130,6 +130,12 @@ } ListView { + width: parent.width + model: placemark ? placemark.relationModel : undefined + delegate: Text { text: name } + } + + ListView { id: tagsView visible: false width: parent.width diff --git a/src/lib/marble/declarative/CMakeLists.txt b/src/lib/marble/declarative/CMakeLists.txt --- a/src/lib/marble/declarative/CMakeLists.txt +++ b/src/lib/marble/declarative/CMakeLists.txt @@ -27,6 +27,7 @@ OfflineDataModel.cpp RouteRequestModel.cpp Settings.cpp + RouteRelationModel.cpp ) generate_export_header(marbledeclarative BASE_NAME marble_declarative) diff --git a/src/lib/marble/declarative/MarbleQuickItem.cpp b/src/lib/marble/declarative/MarbleQuickItem.cpp --- a/src/lib/marble/declarative/MarbleQuickItem.cpp +++ b/src/lib/marble/declarative/MarbleQuickItem.cpp @@ -610,16 +610,17 @@ d->m_placemark = new Placemark(this); d->m_placemark->setGeoDataPlacemark(*placemark); if (placemark->parent() && placemark->parent()->nodeType() == GeoDataTypes::GeoDataDocumentType) { + QVector relations; auto const document = static_cast(placemark->parent()); for (auto feature: document->featureList()) { if (feature->nodeType() == GeoDataTypes::GeoDataRelationType) { - auto const relation = static_cast(feature); + auto relation = static_cast(feature); if (relation->memberIds().contains(placemark->osmData().oid())) { - // @TODO Can be used to present relations to the user, e.g. - // selecting a hiking route for highlighting + relations.push_back(relation); } } } + d->m_placemark->setRelations(relations); } } delete d->m_placemarkItem; diff --git a/src/lib/marble/declarative/Placemark.h b/src/lib/marble/declarative/Placemark.h --- a/src/lib/marble/declarative/Placemark.h +++ b/src/lib/marble/declarative/Placemark.h @@ -12,6 +12,7 @@ #define MARBLE_DECLARATIVE_PLACEMARK_H #include "GeoDataPlacemark.h" +#include "RouteRelationModel.h" #include #include @@ -39,6 +40,8 @@ Q_PROPERTY(double latitude READ latitude NOTIFY coordinatesChanged) Q_PROPERTY(QStringList tags READ tags NOTIFY tagsChanged) + Q_PROPERTY(RouteRelationModel relationModel READ relationModel NOTIFY relationModelChanged) + public: /** Constructor */ explicit Placemark( QObject *parent = 0 ); @@ -61,6 +64,9 @@ double latitude() const; const QStringList & tags() const; + void setRelations(const QVector &relations); + RouteRelationModel relationModel() const; + public Q_SLOTS: void setName(const QString &name); @@ -76,6 +82,8 @@ void wifiAvailabilityChanged(); void tagsChanged(); + void relationModelChanged(); + private: bool addTagValue(QString &target, const QString &key, const QString &format=QString(), const QString separator = QStringLiteral(" ยท ")) const; void addFirstTagValueOf(QString &target, const QStringList &keys) const; @@ -94,6 +102,8 @@ mutable QString m_wheelchairInfo; mutable QString m_wifiAvailable; QStringList m_tags; + + RouteRelationModel m_relationModel; }; } diff --git a/src/lib/marble/declarative/Placemark.cpp b/src/lib/marble/declarative/Placemark.cpp --- a/src/lib/marble/declarative/Placemark.cpp +++ b/src/lib/marble/declarative/Placemark.cpp @@ -576,6 +576,17 @@ emit nameChanged(); } +void Placemark::setRelations(const QVector &relations) +{ + m_relationModel.setRelations(relations); + emit relationModelChanged(); +} + +RouteRelationModel Placemark::relationModel() const +{ + return m_relationModel; +} + double Placemark::longitude() const { return m_placemark.coordinate().longitude(GeoDataCoordinates::Degree);