8 import QtQuick.Layouts 1.15
9 import QtQuick.Controls 2.15 as QQC2
10 import Qt.labs.platform 1.0 as QPlatform
12 import org.kde.kirigami 2.20 as
Kirigami
13 import org.kde.kpublictransport 1.0 as PublicTransport
14 import org.kde.kosmindoormap 1.0
15 import org.kde.kosmindoormap.kpublictransport 1.0
16 import org.kde.osm.editorcontroller 1.0
17 import org.kde.kirigamiaddons.formcard 1.0 as
FormCard
20 globalDrawer:
Kirigami.GlobalDrawer {
22 titleIcon:
"map-symbolic"
27 icon.name:
"document-open-symbolic"
28 onTriggered: fileDialog.open()
31 text:
"Open MapCSS Stylesheet"
32 icon.name:
"document-open-symbolic"
33 onTriggered: mapcssDialog.open()
36 text:
"Reload Stylesheet"
37 icon.name:
"view-refresh-symbolic"
40 var s = page.map.styleSheet;
41 page.map.styleSheet =
"";
42 page.map.styleSheet = s;
48 icon.name:
"help-about-symbolic"
49 onTriggered:
function() { applicationWindow().pageStack.push(attributionPage); }
54 icon.name:
"help-about-symbolic"
55 onTriggered:
function() { applicationWindow().pageStack.push(aboutPage); }
59 contextDrawer:
Kirigami.ContextDrawer {
63 QPlatform.FileDialog {
65 title:
"Open OSM File"
66 fileMode: QPlatform.FileDialog.OpenFile
67 nameFilters: [
"o5m file (*.o5m)",
"OSM XML file (*.osm *.xml)",
"PBF file (*.osm.pbf)"]
68 onAccepted: page.map.mapLoader.loadFromFile(fileDialog.file);
70 QPlatform.FileDialog {
72 title:
"Open MapCSS Stylesheet"
73 fileMode: QPlatform.FileDialog.OpenFile
74 nameFilters: [
"MapCSS stylesheet (*.mapcss)"]
75 onAccepted: page.map.styleSheet = mapcssDialog.file
77 PublicTransport.Manager { id: ptMgr }
80 property alias debugMode: debugAction.checked
81 property alias stylesheet: page.map.styleSheet
84 pageStack.initialPage: IndoorMapPage {
86 debug: debugAction.checked
90 text:
"Select Location"
92 onTriggered: locationSheet.sheetOpen =
true
97 onTriggered: page.map.styleSheet =
"breeze-light"
101 onTriggered: page.map.styleSheet =
"breeze-dark"
104 text:
"Diagnostic View"
105 onTriggered: page.map.styleSheet =
"diagnostic"
109 text:
"Debug Info Model"
115 text:
"Find Platform"
116 onTriggered: platformSheet.sheetOpen =
true
117 visible: !platformModel.isEmpty
122 onTriggered: gateSheet.sheetOpen =
true
123 visible: !gateModel.isEmpty
128 onTriggered: amenitySheet.open()
132 text:
"Show Elevator Status"
134 enabled: !page.map.mapLoader.isLoading
135 onTriggered: page.queryLiveLocationData();
138 id: rentalVehicleAction
139 text:
i18n(
"Show Rental Vehicles")
141 enabled: !page.map.mapLoader.isLoading
142 onTriggered: page.queryLiveLocationData();
145 text:
i18n(
"Edit with iD")
146 icon.name: "document-edit"
147 onTriggered: EditorController.editBoundingBox(page.map.view.mapSceneToGeo(page.map.view.viewport), Editor.ID)
150 text:
i18n(
"Edit with JOSM")
151 icon.name: "org.openstreetmap.josm"
152 visible: EditorController.hasEditor(Editor.JOSM)
153 onTriggered: EditorController.editBoundingBox(page.map.view.mapSceneToGeo(page.map.view.viewport), Editor.JOSM)
156 text:
i18n(
"Edit with Vespucci")
157 icon.name: "document-edit"
158 visible: EditorController.hasEditor(Editor.Vespucci)
159 onTriggered: EditorController.editBoundingBox(page.map.view.mapSceneToGeo(page.map.view.viewport), Editor.Vespucci)
165 function queryLiveLocationData() {
166 if (rentalVehicleAction.checked || equipmentAction.checked) {
167 locationQuery.request.latitude =
map.mapData.center.y;
168 locationQuery.request.longitude =
map.mapData.center.x;
169 locationQuery.request.maximumDistance =
map.mapData.radius;
170 locationQuery.request.types =
171 (rentalVehicleAction.checked ? (PublicTransport.Location.RentedVehicleStation | PublicTransport.Location.RentedVehicle) : 0)
172 | (equipmentAction.checked ? PublicTransport.Location.Equipment : 0);
174 locationQuery.clear();
180 mapData: page.map.mapData
186 property var platform: model
188 QQC2.Label { text: platform.lines.length == 0 ? platform.display : (platform.display +
" - "); }
190 model: platform.lines
196 visible: source !=
""
198 switch (platform.mode) {
200 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Train,
true).logo;
202 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Tramway,
true).logo;
203 case Platform.Subway:
204 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Metro,
true).logo;
210 text: modelData +
" "
211 visible: icon.source ==
""
218 page.map.view.floorLevel = model.level
219 page.map.view.centerOnGeoCoordinate(model.coordinate);
220 page.map.view.setZoomLevel(19,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
221 platformSheet.sheetOpen =
false
230 text:
"Find Platform"
236 section.property:
"mode"
237 section.delegate:
Kirigami.Heading {
240 text:
switch(parseInt(section)) {
241 case Platform.Rail:
return "Railway";
242 case Platform.Subway:
return "Subway";
243 case Platform.Tram:
return "Tramway";
244 case Platform.Bus:
return "Bus";
245 default: console.log(section, Platform.Rail);
return section;
248 verticalAlignment:
Qt.AlignBottom
250 section.criteria: ViewSection.FullString
251 section.labelPositioning: ViewSection.CurrentLabelAtStart | ViewSection.InlineLabels
253 delegate: platformDelegate
259 mapData: page.map.mapData
276 page.map.view.floorLevel = model.level
277 page.map.view.centerOnGeoCoordinate(model.coordinate);
278 page.map.view.setZoomLevel(18,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
279 gateSheet.sheetOpen =
false
287 mapData: page.map.mapData
297 model: AmenitySortFilterProxyModel {
298 sourceModel: amenitySheet.sheetOpen ? amenityModel :
null
299 filterCaseSensitivity:
Qt.CaseInsensitive
300 filterString: amenitySearchField.text
303 delegate: IndoorMapAmenityDelegate {
305 mapData: page.map.mapData
306 required
property QtObject model
308 page.map.view.floorLevel = item.model.level
309 page.map.view.centerOnGeoCoordinate(item.model.coordinate);
310 page.map.view.setZoomLevel(21,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
311 console.log(item.model.element.url);
312 amenitySheet.close();
316 section.property:
"groupName"
317 section.delegate:
Kirigami.ListSectionHeader {
323 id: amenitySearchField
326 onSheetOpenChanged: {
328 amenitySearchField.clear();
332 LocationQueryOverlayProxyModel {
334 sourceModel: PublicTransport.LocationQueryModel {
338 mapData: page.map.mapData
341 RealtimeEquipmentModel {
343 mapData: page.map.mapData
344 realtimeModel: locationModel.sourceModel
347 SelectLocationSheet {
349 publicTransportManager: ptMgr
350 onCoordinateSelected:
function() {
351 page.map.mapLoader.loadForCoordinate(locationSheet.coordinate.y, locationSheet.coordinate.x);
352 page.map.view.beginTime =
new Date();
353 page.map.view.endTime =
new Date(page.map.view.beginTime.getTime() + 3600000);
356 settings.setValue(
"latitude", locationSheet.coordinate.y);
357 settings.setValue(
"longitude", locationSheet.coordinate.x);
361 map.overlaySources: [ gateModel, platformModel, locationModel, equipmentModel ]
362 map.timeZone:
"Europe/Berlin"
365 QQC2.Label { text:
"Floor Level:" }
368 model: page.map.floorLevels
370 currentIndex: page.map.floorLevels.rowForLevel(page.map.view.floorLevel);
371 onCurrentIndexChanged:
if (currentIndex >= 0) { page.map.view.floorLevel = page.map.floorLevels.levelForRow(currentIndex); }
372 Layout.fillWidth:
true
375 target: page.map.view
376 function onFloorLevelChanged() { floorLevelCombo.currentIndex = page.map.floorLevels.rowForLevel(page.map.view.floorLevel); }
384 Layout.fillWidth:
true
387 page.map.view.setZoomLevel(value,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
391 target: page.map.view
392 function onZoomLevelChanged() { zoomSlider.value = page.map.view.zoomLevel; }
396 coordinate:
Qt.point(settings.value(
"longitude", 11.08196), settings.value(
"latitude", 49.44572))
401 function onMapDataChanged() {
402 queryLiveLocationData();
409 publicTransportManager: ptMgr
417 "displayName":
"KDE OSM Indoor Map",
418 "productName":
"org.kde.kosmindoormap",
419 "componentName":
"org.kde.kosmindoormap",
420 "shortDescription":
"OSM Indoor Map Demo",
421 "homepage":
"https://kde.org/",
426 "name":
"LGPL 2.0 or later",
427 "spdx":
"LGPL-2.0-or-later"
430 "copyrightStatement":
"© 2020-2023 The KDE Team",
431 "desktopFileName":
"kosmindoormap"