diff --git a/src/lib/marble/declarative/RouteRelationModel.cpp b/src/lib/marble/declarative/RouteRelationModel.cpp index 21b3513ea..f058c3e12 100644 --- a/src/lib/marble/declarative/RouteRelationModel.cpp +++ b/src/lib/marble/declarative/RouteRelationModel.cpp @@ -1,105 +1,113 @@ // // This file is part of the Marble Virtual Globe. // // This program is free software licensed under the GNU LGPL. You can // find a copy of this license in LICENSE.txt in the top directory of // the source code. // // Copyright 2017 Sergey Popov // #include "RouteRelationModel.h" #include "MarbleDirs.h" #include "osm/OsmPlacemarkData.h" namespace Marble { RouteRelationModel::RouteRelationModel(QObject *parent) : QAbstractListModel(parent) { // nothing to do } void RouteRelationModel::setRelations(const QSet &relations) { if (!m_relations.isEmpty()) { beginRemoveRows(QModelIndex(), 0, m_relations.count() - 1); m_relations.clear(); endRemoveRows(); } if (!relations.isEmpty()) { beginInsertRows(QModelIndex(), 0, relations.count() - 1); m_relations.reserve(relations.size()); std::copy_if(relations.begin(), relations.end(), std::back_inserter(m_relations), [](const GeoDataRelation * relation) { return relation->relationType() >= GeoDataRelation::RouteRoad && relation->relationType() <= GeoDataRelation::RouteSled; }); std::sort(m_relations.begin(), m_relations.end(), [](const GeoDataRelation * a, const GeoDataRelation * b) { + if (a->relationType() == b->relationType()) { + auto const refA = a->osmData().tagValue(QStringLiteral("ref")); + auto const refB = b->osmData().tagValue(QStringLiteral("ref")); + if (refA == refB) { + return a->name() < b->name(); + } + return refA < refB; + } return a->relationType() < b->relationType(); }); endInsertRows(); } } int RouteRelationModel::rowCount(const QModelIndex & parent) const { return parent.isValid() ? 0 : m_relations.count(); } QVariant RouteRelationModel::data(const QModelIndex & index, int role) const { if (!index.isValid() || index.row() < 0 || index.row() >= m_relations.count()) { return QVariant(); } if (role == Qt::DisplayRole) { return m_relations.at(index.row())->name(); } else if (role == IconSource) { switch (m_relations.at(index.row())->relationType()) { case GeoDataRelation::RouteRoad: return svgFile("material/maps/ic_directions_car_48px.svg"); case GeoDataRelation::RouteDetour: return svgFile("material/maps/ic_directions_car_48px.svg"); case GeoDataRelation::RouteFerry: return svgFile("material/maps/ic_directions_boat_48px.svg"); case GeoDataRelation::RouteTrain: return svgFile("material/maps/ic_directions_railway_48px.svg"); case GeoDataRelation::RouteSubway: return svgFile("material/maps/ic_directions_subway_48px.svg"); case GeoDataRelation::RouteTram: return svgFile("material/maps/ic_tram_48px.svg"); case GeoDataRelation::RouteBus: return svgFile("material/maps/ic_directions_bus_48px.svg"); case GeoDataRelation::RouteTrolleyBus: return svgFile("material/maps/ic_directions_bus_48px.svg"); case GeoDataRelation::RouteBicycle: return svgFile("material/maps/ic_directions_bike_48px.svg"); case GeoDataRelation::RouteMountainbike: return svgFile("material/maps/ic_directions_bike_48px.svg"); case GeoDataRelation::RouteFoot: return svgFile("material/maps/ic_directions_walk_48px.svg"); case GeoDataRelation::RouteHiking: return svgFile("thenounproject/204712-hiker.svg"); case GeoDataRelation::RouteHorse: return svgFile("thenounproject/78374-horse-riding.svg"); case GeoDataRelation::RouteInlineSkates: return svgFile("thenounproject/101965-inline-skater.svg"); case GeoDataRelation::RouteSkiDownhill: return svgFile("thenounproject/2412-skiing-downhill.svg"); case GeoDataRelation::RouteSkiNordic: return svgFile("thenounproject/30231-skiing-cross-country.svg"); case GeoDataRelation::RouteSkitour: return svgFile("thenounproject/29366-skitour.svg"); case GeoDataRelation::RouteSled: return svgFile("thenounproject/365217-sled.svg"); case GeoDataRelation::UnknownType: return QVariant(QString()); } } return QVariant(); } QHash RouteRelationModel::roleNames() const { QHash roles; roles[Qt::DisplayRole] = "display"; roles[IconSource] = "iconSource"; return roles; } QString RouteRelationModel::svgFile(const QString &path) const { #ifdef Q_OS_ANDROID return MarbleDirs::path(QStringLiteral("svg/%1").arg(path)); #else return QStringLiteral("file:///") + MarbleDirs::path(QStringLiteral("svg/%1").arg(path)); #endif } }