Warning, /utilities/kirogi/src/ui/NavigationMap.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * Copyright 2019 Eike Hein <hein@kde.org>
0003 *
0004 * This program is free software; you can redistribute it and/or
0005 * modify it under the terms of the GNU General Public License as
0006 * published by the Free Software Foundation; either version 2 of
0007 * the License or (at your option) version 3 or any later version
0008 * accepted by the membership of KDE e.V. (or its successor approved
0009 * by the membership of KDE e.V.), which shall act as a proxy
0010 * defined in Section 14 of version 3 of the license.
0011 *
0012 * This program is distributed in the hope that it will be useful,
0013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0015 * GNU General Public License for more details.
0016 *
0017 * You should have received a copy of the GNU General Public License
0018 * along with this program. If not, see <http://www.gnu.org/licenses/>.
0019 */
0020
0021 import QtQuick 2.12
0022 import QtLocation 5.6
0023 import QtPositioning 5.6
0024 import QtQuick.Window 2.12
0025 import QtQuick.Controls 2.12 as QQC2
0026 import QtQuick.Shapes 1.12
0027
0028 import QtGraphicalEffects 1.12
0029
0030 import org.kde.kirigami 2.6 as Kirigami
0031
0032 Kirigami.Page {
0033 id: page
0034
0035 readonly property var eVoffice: QtPositioning.coordinate(52.5035334, 13.4091622) // KDE e.V. office.
0036
0037 leftPadding: 0
0038 rightPadding: 0
0039 topPadding: 0
0040 bottomPadding: 0
0041
0042 Connections {
0043 target: kirogi.currentVehicle
0044
0045 onGpsPositionChanged: {
0046 if (kirogi.currentVehicle.gpsPosition.isValid
0047 && (kirogi.currentPage != page || map.center == eVoffice)) {
0048 map.center = kirogi.currentVehicle.gpsPosition;
0049 }
0050 }
0051
0052 onMaxDistanceChanged: geoFence.radius = kirogi.currentVehicle.maxDistance
0053 }
0054
0055 Connections {
0056 target: kirogi
0057
0058 onPositionChanged: {
0059 if (kirogi.position != null
0060 && (kirogi.currentPage != page || map.center == eVoffice)
0061 && (!kirogi.currentVehicle || !kirogi.currentVehicle.gpsPosition.isValid)) {
0062 map.center = kirogi.position;
0063 }
0064 }
0065 }
0066
0067 Map {
0068 id: map
0069
0070 anchors.fill: parent
0071
0072 center: eVoffice
0073 zoomLevel: 19
0074
0075 gesture.acceptedGestures: MapGestureArea.PinchGesture | MapGestureArea.PanGesture | MapGestureArea.FlickGesture
0076
0077 plugin: Plugin {
0078 preferred: ["osm"]
0079
0080 PluginParameter {
0081 name: "osm.mapping.highdpi_tiles"
0082 value: Screen.devicePixelRatio > 1 ? "true" : "false"
0083 }
0084 PluginParameter {
0085 name: "osm.mapping.providersrepository.address"
0086 value: "https://autoconfig.kde.org/qtlocation/"
0087 }
0088 PluginParameter {
0089 name: "osm.useragent"
0090 value: Qt.application.name + "/" + Qt.application.version + " (hein@kde.org)"
0091 }
0092 }
0093
0094 onMapReadyChanged: {
0095 // FIXME TODO: Preferably get a satellite map.
0096 // if (mapReady) {
0097 // for (var i = 0; i < supportedMapTypes.length; i++) {
0098 // if (supportedMapTypes[i].style == MapType.SatelliteMapDay) {
0099 // activeMapType = supportedMapTypes[i];
0100 // break;
0101 // }
0102 // }
0103 // }
0104
0105 addMapItem(geoFence);
0106 addMapItem(droneLocationMarker);
0107 addMapItem(deviceLocationMarker);
0108 }
0109
0110 TapHandler {
0111 onTapped: {
0112 if (kirogi.flying && kirogi.currentVehicle.gpsFix
0113 && kirogi.currentVehicle.gpsPosition.isValid) {
0114 var coord = map.toCoordinate(eventPoint.position, true);
0115 coord.altitude = kirogi.currentVehicle.gpsPosition.altitude;
0116 kirogi.currentVehicle.requestMoveTo(coord);
0117 }
0118 }
0119 }
0120 }
0121
0122 MapCircle {
0123 id: geoFence
0124
0125 visible: (kirogi.currentVehicle && kirogi.currentVehicle.geofence
0126 && kirogi.currentVehicle.gpsPosition.isValid)
0127
0128 center: (kirogi.currentVehicle && kirogi.currentVehicle.gpsPosition.isValid
0129 ? kirogi.currentVehicle.gpsPosition : map.center)
0130
0131 border.width: Kirigami.Units.devicePixelRatio
0132 border.color: Kirigami.Theme.negativeTextColor
0133 }
0134
0135 MapQuickItem {
0136 id: droneLocationMarker
0137
0138 visible: (kirogi.currentVehicle && kirogi.currentVehicle.gpsSupported
0139 && kirogi.currentVehicle.gpsPosition.isValid)
0140
0141 coordinate: (kirogi.currentVehicle && kirogi.currentVehicle.gpsPosition.isValid
0142 ? kirogi.currentVehicle.gpsPosition : map.center)
0143 anchorPoint: Qt.point(sourceItem.width / 2, sourceItem.height / 2)
0144
0145 sourceItem: Kirigami.Icon {
0146 width: Kirigami.Units.iconSizes.medium
0147 height: width
0148 source: centerOnDroneButton.icon
0149
0150 LinearGradient {
0151 anchors.fill: parent
0152 source: parent
0153 start: Qt.point(0, 0)
0154 end: Qt.point(0, height)
0155 gradient: Gradient {
0156 GradientStop { position: 0.49; color: "green" }
0157 GradientStop { position: 0.51; color: "red" }
0158 }
0159 transform: Rotation {
0160 origin.x: droneLocationMarker.width / 2
0161 origin.y: droneLocationMarker.height / 2
0162 angle: kirogi.currentVehicle.yaw * 180 / 3.1415}
0163 }
0164 }
0165 }
0166
0167 MapQuickItem {
0168 id: deviceLocationMarker
0169
0170 visible: kirogi.position != null
0171
0172 coordinate: kirogi.position != null ? kirogi.position : map.center
0173 anchorPoint: Qt.point(sourceItem.width / 2, sourceItem.height / 2)
0174
0175 sourceItem: Kirigami.Icon {
0176 width: Kirigami.Units.iconSizes.medium
0177 height: width
0178
0179 color: "blue"
0180 source: centerOnDeviceButton.icon
0181 }
0182 }
0183
0184 PillBox {
0185 visible: mapHeading.text
0186
0187 anchors.top: parent.top
0188 anchors.topMargin: Kirigami.Units.gridUnit
0189 anchors.horizontalCenter: parent.horizontalCenter
0190
0191 width: mapHeading.implicitWidth + Kirigami.Units.largeSpacing * 4
0192 height: 2 * Math.round((Math.max(Kirigami.Units.iconSizes.small, fontMetrics.height) + Kirigami.Units.smallSpacing * 3) / 2);
0193
0194 background: map
0195 backgroundColor: Kirigami.Theme.negativeTextColor
0196 backgroundOpacity: 0.4
0197 borderColor: Kirigami.Theme.negativeTextColor
0198
0199 QQC2.Label {
0200 id: mapHeading
0201
0202 anchors.horizontalCenter: parent.horizontalCenter
0203
0204 height: parent.height
0205
0206 verticalAlignment: Text.AlignVCenter
0207
0208 color: Kirigami.Theme.negativeTextColor
0209 font.bold: true
0210
0211 text: {
0212 if (map.error == Map.ConnectionError) {
0213 return i18n("Unable to load map.");
0214 } else if (kirogi.currentVehicle && !kirogi.currentVehicle.gpsSupported) {
0215 return i18n("%1 does not support GPS.", kirogi.currentVehicle.name);
0216 } else if (kirogi.currentVehicle && (!kirogi.currentVehicle.gpsFix || !kirogi.currentVehicle.gpsPosition.isValid)) {
0217 return i18n("%1 does not have a GPS fix.", kirogi.currentVehicle.name);
0218 } else if (kirogi.position == null) {
0219 return i18n("No device location available.");
0220 }
0221
0222 return "";
0223 }
0224 }
0225 }
0226
0227 TouchButton {
0228 anchors.top: parent.top
0229 anchors.topMargin: Kirigami.Units.gridUnit
0230 anchors.left: parent.left
0231 anchors.leftMargin: Kirigami.Units.gridUnit
0232
0233 background: map
0234
0235 icon: "transform-move"
0236 toolTipText: i18nc("%1 = Keyboard shortcut", "Flight Controls (%1)", flightControlsPageAction.shortcut)
0237
0238 onTapped: switchApplicationPage(flightControlsPage)
0239 }
0240
0241 TouchButton {
0242 id: centerOnDroneButton
0243
0244 enabled: kirogi.currentVehicle && kirogi.currentVehicle.gpsSupported && kirogi.currentVehicle.gpsPosition.isValid
0245
0246 anchors.bottom: centerOnDeviceButton.top
0247 anchors.bottomMargin: Kirigami.Units.largeSpacing
0248 anchors.right: parent.right
0249 anchors.rightMargin: Kirigami.Units.gridUnit
0250
0251 background: map
0252
0253 icon: kirogi.currentVehicle ? kirogi.currentVehicle.iconName : "uav"
0254 toolTipText: i18n("Center Map on Drone")
0255
0256 onTapped: map.center = kirogi.currentVehicle.gpsPosition
0257 }
0258
0259 TouchButton {
0260 id: centerOnDeviceButton
0261
0262 enabled: kirogi.position != null
0263
0264 anchors.bottom: parent.bottom
0265 anchors.bottomMargin: Kirigami.Units.gridUnit
0266 anchors.right: parent.right
0267 anchors.rightMargin: Kirigami.Units.gridUnit
0268
0269 background: map
0270
0271 icon: Kirigami.Settings.isMobile ? "phone-symbolic" : "computer-symbolic"
0272 toolTipText: i18n("Center Map on Device")
0273
0274 onTapped: map.center = kirogi.position
0275 }
0276 }