8 import QtQuick.Layouts 1.1
9 import QtQuick.Controls 2.1 as QQC2
10 import Qt.labs.platform 1.0 as QPlatform
11 import org.kde.kirigami 2.6 as
Kirigami
12 import org.kde.kpublictransport 1.0 as PublicTransport
13 import org.kde.kosmindoormap 1.0
14 import org.kde.kosmindoormap.kpublictransport 1.0
16 Kirigami.ApplicationWindow {
17 globalDrawer:
Kirigami.GlobalDrawer {
19 titleIcon:
"map-symbolic"
24 icon.name:
"document-open-symbolic"
25 onTriggered: fileDialog.open()
28 text:
"Open MapCSS Stylesheet"
29 icon.name:
"document-open-symbolic"
30 onTriggered: mapcssDialog.open()
33 text:
"Reload Stylesheet"
34 icon.name:
"view-refresh-symbolic"
36 var s = page.map.styleSheet;
37 page.map.styleSheet =
"";
38 page.map.styleSheet = s;
44 icon.name:
"help-about-symbolic"
45 onTriggered:
function() { applicationWindow().pageStack.push(attributionPage); }
50 icon.name:
"help-about-symbolic"
51 onTriggered:
function() { applicationWindow().pageStack.push(aboutPage); }
55 contextDrawer:
Kirigami.ContextDrawer {
59 QPlatform.FileDialog {
61 title:
"Open OSM File"
62 fileMode: QPlatform.FileDialog.OpenFile
63 nameFilters: [
"o5m file (*.o5m)",
"OSM XML file (*.osm *.xml)",
"PBF file (*.osm.pbf)"]
64 onAccepted: page.map.mapLoader.loadFromFile(fileDialog.file);
66 QPlatform.FileDialog {
68 title:
"Open MapCSS Stylesheet"
69 fileMode: QPlatform.FileDialog.OpenFile
70 nameFilters: [
"MapCSS stylesheet (*.mapcss)"]
71 onAccepted: page.map.styleSheet = mapcssDialog.file
73 PublicTransport.Manager { id: ptMgr }
75 pageStack.initialPage: IndoorMapPage {
77 debug: debugAction.checked
81 text:
"Select Location"
83 onTriggered: locationSheet.sheetOpen =
true
88 onTriggered: page.map.styleSheet =
"breeze-light"
92 onTriggered: page.map.styleSheet =
"breeze-dark"
95 text:
"Diagnostic View"
96 onTriggered: page.map.styleSheet =
"diagnostic"
100 text:
"Debug Info Model"
106 text:
"Find Platform"
107 onTriggered: platformSheet.sheetOpen =
true
108 visible: !platformModel.isEmpty
113 onTriggered: gateSheet.sheetOpen =
true
114 visible: !gateModel.isEmpty
121 mapData: page.map.mapData
127 property var platform: model
129 QQC2.Label { text: platform.lines.length == 0 ? platform.display : (platform.display +
" - "); }
131 model: platform.lines
137 visible: source !=
""
139 switch (platform.mode) {
141 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Train,
true).logo;
143 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Tramway,
true).logo;
144 case Platform.Subway:
145 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Metro,
true).logo;
151 text: modelData +
" "
152 visible: icon.source ==
""
159 page.map.view.floorLevel = model.level
160 page.map.view.centerOnGeoCoordinate(model.coordinate);
161 page.map.view.setZoomLevel(19,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
162 platformSheet.sheetOpen =
false
171 text:
"Find Platform"
177 section.property:
"mode"
178 section.delegate:
Kirigami.Heading {
181 text:
switch(parseInt(section)) {
182 case Platform.Rail:
return "Railway";
183 case Platform.Subway:
return "Subway";
184 case Platform.Tram:
return "Tramway";
185 case Platform.Bus:
return "Bus";
186 default: console.log(section, Platform.Rail);
return section;
189 verticalAlignment:
Qt.AlignBottom
191 section.criteria: ViewSection.FullString
192 section.labelPositioning: ViewSection.CurrentLabelAtStart | ViewSection.InlineLabels
194 delegate: platformDelegate
200 mapData: page.map.mapData
217 page.map.view.floorLevel = model.level
218 page.map.view.centerOnGeoCoordinate(model.coordinate);
219 page.map.view.setZoomLevel(18,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
220 gateSheet.sheetOpen =
false
226 LocationQueryOverlayProxyModel {
228 sourceModel: PublicTransport.LocationQueryModel {
232 mapData: page.map.mapData
235 RealtimeEquipmentModel {
237 mapData: page.map.mapData
238 realtimeModel: locationModel.sourceModel
241 SelectLocationSheet {
243 publicTransportManager: ptMgr
244 onCoordinateSelected:
function() {
245 page.map.mapLoader.loadForCoordinate(locationSheet.coordinate.y, locationSheet.coordinate.x);
246 page.map.view.beginTime =
new Date();
247 page.map.view.endTime =
new Date(page.map.view.beginTime.getTime() + 3600000);
252 map.overlaySources: [ gateModel, platformModel, locationModel, equipmentModel ]
253 map.timeZone:
"Europe/Berlin"
256 QQC2.Label { text:
"Floor Level:" }
259 model: page.map.floorLevels
261 currentIndex: page.map.floorLevels.rowForLevel(page.map.view.floorLevel);
262 onCurrentIndexChanged:
if (currentIndex >= 0) { page.map.view.floorLevel = page.map.floorLevels.levelForRow(currentIndex); }
263 Layout.fillWidth:
true
266 target: page.map.view
267 function onFloorLevelChanged() { floorLevelCombo.currentIndex = page.map.floorLevels.rowForLevel(page.map.view.floorLevel); }
275 Layout.fillWidth:
true
278 page.map.view.setZoomLevel(value,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
282 target: page.map.view
283 function onZoomLevelChanged() { zoomSlider.value = page.map.view.zoomLevel; }
287 coordinate:
Qt.point(11.08196, 49.44572);
292 function onMapDataChanged() {
293 locationQuery.request.latitude = page.map.mapData.center.y;
294 locationQuery.request.longitude = page.map.mapData.center.x;
295 locationQuery.request.maximumDistance = page.map.mapData.radius;
296 locationQuery.request.types = PublicTransport.Location.RentedVehicleStation | PublicTransport.Location.RentedVehicle | PublicTransport.Location.Equipment;
303 publicTransportManager: ptMgr
311 "displayName":
"KDE OSM Indoor Map",
312 "productName":
"org.kde.kosmindoormap",
313 "componentName":
"org.kde.kosmindoormap",
314 "shortDescription":
"OSM Indoor Map Demo",
315 "homepage":
"https://kde.org/",
320 "name":
"LGPL 2.0 or later",
321 "spdx":
"LGPL-2.0-or-later"
324 "copyrightStatement":
"© 2020-2021 The KDE Team",
325 "desktopFileName":
"kosmindoormap"