Warning, /libraries/kpublictransport/tests/IndoorMapPage.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 import QtQuick
0008 import QtQuick.Layouts
0009 import QtQuick.Controls as QQC2
0010 import org.kde.kirigami as Kirigami
0011 import org.kde.kirigami.delegates as Kirigami
0012 import org.kde.kosmindoormap
0013 
0014 Kirigami.Page {
0015     title: map.floorLevels.hasName(map.view.floorLevel) ? map.floorLevels.name(map.view.floorLevel) : ("Floor " + map.floorLevels.name(map.view.floorLevel));
0016     property point coordinate
0017     property alias map: map
0018     property alias debug: infoModel.debug
0019 
0020     topPadding: 0
0021     bottomPadding: 0
0022     leftPadding: 0
0023     rightPadding: 0
0024 
0025     // prevent swipe to the right changing pages, we want to pan the map instead
0026     // TODO in theory we could make this conditional to having panned the map all the way to the right
0027     Kirigami.ColumnView.preventStealing: true
0028 
0029    actions: [
0030         Kirigami.Action {
0031             icon.name: "go-down-symbolic"
0032             enabled: map.floorLevels.hasFloorLevelBelow(map.view.floorLevel)
0033             onTriggered: map.view.floorLevel = map.floorLevels.floorLevelBelow(map.view.floorLevel)
0034         },
0035         Kirigami.Action {
0036             icon.name: "go-up-symbolic"
0037             enabled: map.floorLevels.hasFloorLevelAbove(map.view.floorLevel)
0038             onTriggered: map.view.floorLevel = map.floorLevels.floorLevelAbove(map.view.floorLevel)
0039         }
0040     ]
0041 
0042     OSMElementInformationModel {
0043         id: infoModel
0044         debug: true
0045     }
0046 
0047     Component {
0048         id: infoStringDelegate
0049         Row {
0050             QQC2.Label {
0051                 visible: row.keyLabel != ""
0052                 text: row.keyLabel + ": "
0053                 color: row.category == OSMElementInformationModel.DebugCategory ? Kirigami.Theme.disabledTextColor : Kirigami.Theme.textColor
0054             }
0055             QQC2.Label {
0056                 text: row.value
0057                 color: row.category == OSMElementInformationModel.DebugCategory ? Kirigami.Theme.disabledTextColor : Kirigami.Theme.textColor
0058             }
0059         }
0060     }
0061 
0062     Component {
0063         id: infoLinkDelegate
0064         Row {
0065             QQC2.Label {
0066                 visible: row.keyLabel != ""
0067                 text: row.keyLabel + ": "
0068                 color: row.category == OSMElementInformationModel.DebugCategory ? Kirigami.Theme.disabledTextColor : Kirigami.Theme.textColor
0069             }
0070             QQC2.Label {
0071                 text: "<a href=\"" + row.url + "\">" + row.value + "</a>"
0072                 color: row.category == OSMElementInformationModel.DebugCategory ? Kirigami.Theme.disabledTextColor : Kirigami.Theme.textColor
0073                 onLinkActivated: Qt.openUrlExternally(link)
0074             }
0075         }
0076     }
0077 
0078     Component {
0079         id: infoAddressDelegate
0080         QQC2.Label {
0081             text: (row.value.street + " " + row.value.houseNumber + "\n" + row.value.postalCode + " " + row.value.city + "\n" + row.value.country).trim()
0082         }
0083     }
0084 
0085     Kirigami.OverlaySheet {
0086         id: elementDetailsSheet
0087 
0088         header: Column {
0089             Kirigami.Heading {
0090                 text: infoModel.name
0091             }
0092             Kirigami.Heading {
0093                 text: infoModel.category
0094                 level: 4
0095                 visible: text != ""
0096             }
0097         }
0098 
0099         ListView {
0100             model: infoModel
0101 
0102             section.property: "categoryLabel"
0103             section.delegate: Kirigami.Heading {
0104                 x: Kirigami.Units.largeSpacing
0105                 level: 4
0106                 text: section
0107                 color: section == "Debug" ? Kirigami.Theme.disabledTextColor : Kirigami.Theme.textColor
0108                 height: implicitHeight + Kirigami.Units.largeSpacing
0109                 verticalAlignment: Qt.AlignBottom
0110             }
0111             section.criteria: ViewSection.FullString
0112             section.labelPositioning: ViewSection.CurrentLabelAtStart | ViewSection.InlineLabels
0113 
0114             delegate: Loader {
0115                 property var row: model
0116                 x: Kirigami.Units.largeSpacing
0117                 sourceComponent: {
0118                     switch (row.type) {
0119                         case OSMElementInformationModel.Link:
0120                             return infoLinkDelegate;
0121                         case OSMElementInformationModel.PostalAddress:
0122                             return infoAddressDelegate;
0123                         default:
0124                             return infoStringDelegate;
0125                     }
0126                 }
0127             }
0128         }
0129 
0130         onClosed: infoModel.clear()
0131     }
0132 
0133     FloorLevelChangeModel {
0134         id: floorLevelChangeModel
0135         currentFloorLevel: map.view.floorLevel
0136         floorLevelModel: map.floorLevels
0137     }
0138 
0139     Kirigami.OverlaySheet {
0140         id: elevatorSheet
0141         header: Kirigami.Heading {
0142             text: "Elevator"
0143         }
0144         ListView {
0145             model: floorLevelChangeModel
0146             delegate: QQC2.ItemDelegate {
0147                 highlighted: false
0148                 width: ListView.view.width
0149                 contentItem: Kirigami.TitleSubtitle {
0150                     title: model.display
0151                     font.bold: model.isCurrentFloor
0152                 }
0153                 onClicked: {
0154                     elevatorSheet.close();
0155                     map.view.floorLevel = model.floorLevel;
0156                 }
0157             }
0158         }
0159     }
0160 
0161     IndoorMap {
0162         id: map
0163         anchors.fill: parent
0164 
0165         IndoorMapScale {
0166             map: map
0167             anchors.left: map.left
0168             anchors.bottom: map.bottom
0169             width: 0.3 * map.width
0170         }
0171 
0172         IndoorMapAttributionLabel {
0173             anchors.right: map.right
0174             anchors.bottom: map.bottom
0175         }
0176 
0177         onElementPicked: {
0178             floorLevelChangeModel.element = element;
0179             if (floorLevelChangeModel.hasSingleLevelChange) {
0180                 showPassiveNotification("Switched to floor " + floorLevelChangeModel.destinationLevelName, "short");
0181                 map.view.floorLevel = floorLevelChangeModel.destinationLevel;
0182                 return;
0183             } else if (floorLevelChangeModel.hasMultipleLevelChanges) {
0184                 elevatorSheet.open();
0185                 return;
0186             }
0187 
0188             infoModel.element = element;
0189             if (infoModel.name != "" || infoModel.debug) {
0190                 elementDetailsSheet.open();
0191             }
0192         }
0193     }
0194 
0195     onCoordinateChanged: map.mapLoader.loadForCoordinate(coordinate.y, coordinate.x);
0196 }