10import QtQuick.Controls as QQC2
11import QtQuick.Dialogs as Dialogs
12import org.kde.kirigami as Kirigami
13import org.kde.kpublictransport as PublicTransport
14import org.kde.kosmindoormap
15import org.kde.kosmindoormap.kpublictransport
16import org.kde.osm.editorcontroller
17import org.kde.kirigamiaddons.formcard as FormCard
19Kirigami.ApplicationWindow {
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 {
65 title:
"Open OSM File"
66 fileMode: Dialogs.FileDialog.OpenFile
67 nameFilters: [
"o5m file (*.o5m)",
"OSM XML file (*.osm *.xml)",
"PBF file (*.osm.pbf)"]
68 onAccepted: page.map.mapLoader.loadFromFile(fileDialog.selectedFile);
72 title:
"Open MapCSS Stylesheet"
73 fileMode: Dialogs.FileDialog.OpenFile
74 nameFilters: [
"MapCSS stylesheet (*.mapcss)"]
75 onAccepted: page.map.styleSheet = mapcssDialog.selectedFile
77 PublicTransport.Manager { id: ptMgr }
80 property alias debugMode: debugAction.checked
81 property alias stylesheet: page.map.styleSheet
82 property alias hoverMode: page.mapHoverEnabled
85 pageStack.initialPage: IndoorMapPage {
87 debug: debugAction.checked
91 text:
"Select Location"
93 onTriggered: locationSheet.open()
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.open()
117 visible: !platformModel.isEmpty
122 onTriggered: gateSheet.open()
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)
162 text:
i18n(
"Enable hover selection")
163 icon.name: "followmouse"
165 checked: page.mapHoverEnabled
166 onToggled: page.mapHoverEnabled = !page.mapHoverEnabled
170 function queryLiveLocationData() {
171 if (rentalVehicleAction.checked || equipmentAction.checked) {
172 locationQuery.request.latitude =
map.mapData.center.y;
173 locationQuery.request.longitude =
map.mapData.center.x;
174 locationQuery.request.maximumDistance =
map.mapData.radius;
175 locationQuery.request.types =
176 (rentalVehicleAction.checked ? (PublicTransport.Location.RentedVehicleStation | PublicTransport.Location.RentedVehicle) : 0)
177 | (equipmentAction.checked ? PublicTransport.
Location.Equipment : 0);
179 locationQuery.clear();
185 mapData: page.map.mapData
191 property var platform: model
192 width: ListView.view.width
194 QQC2.Label { text: platform.lines.length == 0 ? platform.display : (platform.display +
" - "); }
196 model: platform.lines
200 height:
Kirigami.Units.iconSizes.small
202 visible: source !=
""
204 switch (platform.mode) {
206 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Train,
true).logo;
208 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Tramway,
true).logo;
209 case Platform.Subway:
210 return PublicTransport.LineMetaData.lookup(modelData, platform.coordinate.y, platform.coordinate.x, PublicTransport.Line.Metro,
true).logo;
216 text: modelData +
" "
217 visible: icon.source ==
""
224 page.map.view.floorLevel = model.level
225 page.map.view.centerOnGeoCoordinate(model.coordinate);
226 page.map.view.setZoomLevel(19,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
227 platformSheet.close()
236 text:
"Find Platform"
242 Layout.preferredWidth:
Kirigami.Units.gridUnit * 25
244 section.property:
"mode"
245 section.delegate:
Kirigami.ListSectionHeader {
246 label:
switch(parseInt(section)) {
247 case Platform.Rail:
return "Railway";
248 case Platform.Subway:
return "Subway";
249 case Platform.Tram:
return "Tramway";
250 case Platform.Bus:
return "Bus";
251 default: console.log(section, Platform.Rail);
return section;
253 width: ListView.view.width
255 section.criteria: ViewSection.FullString
257 delegate: platformDelegate
263 mapData: page.map.mapData
275 Layout.preferredWidth:
Kirigami.Units.gridUnit * 10
276 delegate: QQC2.ItemDelegate {
278 width: ListView.view.width
279 contentItem:
Kirigami.TitleSubtitle {
283 page.map.view.floorLevel = model.level
284 page.map.view.centerOnGeoCoordinate(model.coordinate);
285 page.map.view.setZoomLevel(18,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
294 mapData: page.map.mapData
305 Layout.preferredWidth:
Kirigami.Units.gridUnit * 25
306 model: AmenitySortFilterProxyModel {
307 sourceModel: amenitySheet.visible ? amenityModel : null
308 filterCaseSensitivity:
Qt.CaseInsensitive
309 filterString: amenitySearchField.text
312 delegate: IndoorMapAmenityDelegate {
314 mapData: page.map.mapData
315 required
property QtObject model
317 page.map.view.floorLevel = item.model.level
318 page.map.view.centerOnGeoCoordinate(item.model.coordinate);
319 page.map.view.setZoomLevel(21,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
320 console.log(item.model.element.url);
321 amenitySheet.close();
325 section.property:
"groupName"
326 section.delegate:
Kirigami.ListSectionHeader {
328 width: ListView.view.width
333 id: amenitySearchField
336 onOpened: amenitySearchField.clear()
339 LocationQueryOverlayProxyModel {
341 sourceModel: PublicTransport.LocationQueryModel {
345 mapData: page.map.mapData
348 RealtimeEquipmentModel {
350 mapData: page.map.mapData
351 realtimeModel: locationModel.sourceModel
354 SelectLocationSheet {
356 publicTransportManager: ptMgr
357 onCoordinateSelected: function() {
358 page.map.mapLoader.loadForCoordinate(locationSheet.coordinate.y, locationSheet.coordinate.x);
359 page.map.view.beginTime =
new Date();
360 page.map.view.endTime =
new Date(page.map.view.beginTime.getTime() + 3600000);
363 settings.setValue(
"latitude", locationSheet.coordinate.y);
364 settings.setValue(
"longitude", locationSheet.coordinate.x);
368 map.overlaySources: [ gateModel, platformModel, locationModel, equipmentModel ]
369 map.timeZone:
"Europe/Berlin"
372 QQC2.Label { text:
"Floor Level:" }
375 model: page.map.floorLevels
377 currentIndex: page.map.floorLevels.rowForLevel(page.map.view.floorLevel);
378 onCurrentIndexChanged:
if (currentIndex >= 0) { page.map.view.floorLevel = page.map.floorLevels.levelForRow(currentIndex); }
379 Layout.fillWidth:
true
382 target: page.map.view
383 function onFloorLevelChanged() { floorLevelCombo.currentIndex = page.map.floorLevels.rowForLevel(page.map.view.floorLevel); }
391 Layout.fillWidth:
true
394 page.map.view.setZoomLevel(value,
Qt.point(page.map.width / 2.0, page.map.height/ 2.0));
398 target: page.map.view
399 function onZoomLevelChanged() { zoomSlider.value = page.map.view.zoomLevel; }
403 coordinate:
Qt.point(settings.value(
"longitude", 11.08196), settings.value(
"latitude", 49.44572))
408 function onMapDataChanged() {
409 page.queryLiveLocationData();
416 publicTransportManager: ptMgr
424 "displayName":
"KDE OSM Indoor Map",
425 "productName":
"org.kde.kosmindoormap",
426 "componentName":
"org.kde.kosmindoormap",
427 "shortDescription":
"OSM Indoor Map Demo",
428 "homepage":
"https://kde.org/",
429 "bugAddress":
"submit@bugs.kde.org",
430 "version": Application.version,
433 "name":
"LGPL 2.0 or later",
434 "spdx":
"LGPL-2.0-or-later"
437 "copyrightStatement":
"© 2020-2024 The KDE Community",
438 "desktopFileName":
"org.kde.kosmindoormap",
QString i18n(const char *text, const TYPE &arg...)
const QList< QKeySequence > & shortcut(StandardShortcut id)
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)