6 #include "RouteRelationModel.h"
8 #include "MarbleColors.h"
9 #include "MarbleDirs.h"
10 #include "osm/OsmPlacemarkData.h"
11 #include "GeoDataColorStyle.h"
16 RouteRelationModel::RouteRelationModel(
QObject *parent) :
19 m_networks[QStringLiteral(
"iwn")] =
tr(
"International walking route");
20 m_networks[QStringLiteral(
"nwn")] =
tr(
"National walking route");
21 m_networks[QStringLiteral(
"rwn")] =
tr(
"Regional walking route");
22 m_networks[QStringLiteral(
"lwn")] =
tr(
"Local walking route");
23 m_networks[QStringLiteral(
"icn")] =
tr(
"International cycling route");
24 m_networks[QStringLiteral(
"ncn")] =
tr(
"National cycling route");
25 m_networks[QStringLiteral(
"rcn")] =
tr(
"Regional cycling route");
26 m_networks[QStringLiteral(
"lcn")] =
tr(
"Local cycling route");
27 m_networks[QStringLiteral(
"US:TX:FM")] =
tr(
"Farm to Market Road",
"State or county road in Texas, USA");
28 m_networks[QStringLiteral(
"regional")] =
tr(
"Regional route");
29 m_networks[QStringLiteral(
"national")] =
tr(
"National route");
30 m_networks[QStringLiteral(
"municipal")] =
tr(
"Municipal route");
31 m_networks[QStringLiteral(
"territorial")] =
tr(
"Territorial route");
32 m_networks[QStringLiteral(
"local")] =
tr(
"Local route");
33 m_networks[QStringLiteral(
"prefectural")] =
tr(
"Prefectural route");
34 m_networks[QStringLiteral(
"US")] =
tr(
"United States route");
39 if (!m_relations.isEmpty()) {
40 beginRemoveRows(
QModelIndex(), 0, m_relations.count() - 1);
47 m_relations.reserve(relations.
size());
48 for (
auto relation: relations) {
49 if (relation->relationType() >= GeoDataRelation::RouteRoad && relation->relationType() <= GeoDataRelation::RouteSled) {
50 m_relations <<
new GeoDataRelation(*relation);
53 std::sort(m_relations.begin(), m_relations.end(),
54 [](
const GeoDataRelation * a,
const GeoDataRelation * b) {
61 int RouteRelationModel::rowCount(
const QModelIndex & parent)
const
63 return parent.
isValid() ? 0 : m_relations.count();
68 if (!index.
isValid() || index.
row() < 0 || index.
row() >= m_relations.count()) {
73 return m_relations.at(index.
row())->name();
74 }
else if (role == IconSource) {
75 switch (m_relations.at(index.
row())->relationType()) {
76 case GeoDataRelation::RouteRoad:
return QStringLiteral(
"material/directions-car.svg");
77 case GeoDataRelation::RouteDetour:
return QStringLiteral(
"material/directions-car.svg");
78 case GeoDataRelation::RouteFerry:
return QStringLiteral(
"material/directions-boat.svg");
79 case GeoDataRelation::RouteTrain:
return QStringLiteral(
"material/directions-railway.svg");
80 case GeoDataRelation::RouteSubway:
return QStringLiteral(
"material/directions-subway.svg");
81 case GeoDataRelation::RouteTram:
return QStringLiteral(
"material/directions-tram.svg");
82 case GeoDataRelation::RouteBus:
return QStringLiteral(
"material/directions-bus.svg");
83 case GeoDataRelation::RouteTrolleyBus:
return QStringLiteral(
"material/directions-bus.svg");
84 case GeoDataRelation::RouteBicycle:
return QStringLiteral(
"material/directions-bike.svg");
85 case GeoDataRelation::RouteMountainbike:
return QStringLiteral(
"material/directions-bike.svg");
86 case GeoDataRelation::RouteFoot:
return QStringLiteral(
"material/directions-walk.svg");
87 case GeoDataRelation::RouteHiking:
return QStringLiteral(
"thenounproject/204712-hiker.svg");
88 case GeoDataRelation::RouteHorse:
return QStringLiteral(
"thenounproject/78374-horse-riding.svg");
89 case GeoDataRelation::RouteInlineSkates:
return QStringLiteral(
"thenounproject/101965-inline-skater.svg");
90 case GeoDataRelation::RouteSkiDownhill:
return QStringLiteral(
"thenounproject/2412-skiing-downhill.svg");
91 case GeoDataRelation::RouteSkiNordic:
return QStringLiteral(
"thenounproject/30231-skiing-cross-country.svg");
92 case GeoDataRelation::RouteSkitour:
return QStringLiteral(
"thenounproject/29366-skitour.svg");
93 case GeoDataRelation::RouteSled:
return QStringLiteral(
"thenounproject/365217-sled.svg");
96 }
else if (role == Description) {
97 return m_relations.at(index.
row())->osmData().tagValue(QStringLiteral(
"description"));
98 }
else if (role == Network) {
99 auto const network = m_relations.at(index.
row())->osmData().tagValue(QStringLiteral(
"network"));
100 auto iter = m_networks.find(network);
101 if (iter != m_networks.end()) {
105 for (
auto const &field: fields) {
106 auto iter = m_networks.find(field);
107 if (iter != m_networks.end()) {
112 }
else if (role == RouteColor) {
113 auto const color = m_relations.at(index.
row())->osmData().tagValue(QStringLiteral(
"colour"));
114 return color.isEmpty() ? QStringLiteral(
"white") : color;
115 }
else if (role == TextColor) {
116 auto const colorValue = m_relations.at(index.
row())->osmData().tagValue(QStringLiteral(
"colour"));
117 auto const color =
QColor(colorValue.isEmpty() ? QStringLiteral(
"white") : colorValue);
119 }
else if (role == RouteFrom) {
120 return m_relations.at(index.
row())->osmData().tagValue(QStringLiteral(
"from"));
121 }
else if (role == RouteTo) {
122 return m_relations.at(index.
row())->osmData().tagValue(QStringLiteral(
"to"));
123 }
else if (role == RouteRef) {
124 auto const ref = m_relations.at(index.
row())->osmData().tagValue(QStringLiteral(
"ref"));
125 return ref.isEmpty() ? m_relations.at(index.
row())->name() :
ref;
126 }
else if (role == RouteVia) {
127 auto const viaValue = m_relations.at(index.
row())->osmData().tagValue(QStringLiteral(
"via"));
129 for (
auto &via: viaList) {
133 }
else if (role == OsmId) {
134 return m_relations.at(index.
row())->osmData().oid();
135 }
else if (role == RouteVisible) {
136 return m_relations.at(index.
row())->isVisible();
146 roles[IconSource] =
"iconSource";
148 roles[Network] =
"network";
149 roles[RouteColor] =
"routeColor";
150 roles[TextColor] =
"textColor";
151 roles[RouteFrom] =
"routeFrom";
152 roles[RouteTo] =
"routeTo";
153 roles[RouteRef] =
"routeRef";
154 roles[RouteVia] =
"routeVia";
155 roles[OsmId] =
"oid";
156 roles[RouteVisible] =
"routeVisible";
163 return MarbleDirs::path(QStringLiteral(
"svg/%1").arg(path));
165 return QStringLiteral(
"file:///") + MarbleDirs::path(QStringLiteral(
"svg/%1").arg(path));