/**************************************************************************** * * (c) 2009-2016 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ import QtQuick 2.3 import QtQuick.Controls 1.2 import QtLocation 5.3 import QtPositioning 5.3 import QGroundControl 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Palette 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FlightMap 1.0 Item { id: _root property var map ///< Map control to place item in property var qgcView ///< QGCView to use for popping dialogs property var areaItem: object property var _polygon: areaItem property var _depot: undefined property bool _showDepot: areaItem.interactive || areaItem.borderPolygon.interactive on_ShowDepotChanged: { if (_showDepot){ _addDepot() } else { _destroyDepot() } } signal clicked(int sequenceNumber) function _addDepot() { if (!_depot){ _depot = depotPointComponent.createObject(_root) map.addMapItem(_depot) } } function _destroyDepot() { if (_depot){ map.removeMapItem(_depot) _depot.destroy() _depot = undefined } } /// Add an initial 4 sided polygon if there is none function _addInitialPolygon() { // Initial polygon is inset to take 2/3rds space var rect = Qt.rect(map.centerViewport.x, map.centerViewport.y, map.centerViewport.width, map.centerViewport.height) rect.x += (rect.width * 0.25) / 2 rect.y += (rect.height * 0.25) / 2 rect.width *= 0.75 rect.height *= 0.75 var centerCoord = map.toCoordinate(Qt.point(rect.x + (rect.width / 2), rect.y + (rect.height / 2)), false /* clipToViewPort */) var topLeftCoord = map.toCoordinate(Qt.point(rect.x, rect.y), false /* clipToViewPort */) var topRightCoord = map.toCoordinate(Qt.point(rect.x + rect.width, rect.y), false /* clipToViewPort */) var bottomLeftCoord = map.toCoordinate(Qt.point(rect.x, rect.y + rect.height), false /* clipToViewPort */) var bottomRightCoord = map.toCoordinate(Qt.point(rect.x + rect.width, rect.y + rect.height), false /* clipToViewPort */) // Adjust polygon to max size var maxSize = 100 var halfWidthMeters = Math.min(topLeftCoord.distanceTo(topRightCoord), maxSize) / 2 var halfHeightMeters = Math.min(topLeftCoord.distanceTo(bottomLeftCoord), maxSize) / 2 topLeftCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, -90).atDistanceAndAzimuth(halfHeightMeters, 0) topRightCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, 90).atDistanceAndAzimuth(halfHeightMeters, 0) bottomLeftCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, -90).atDistanceAndAzimuth(halfHeightMeters, 180) bottomRightCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, 90).atDistanceAndAzimuth(halfHeightMeters, 180) if (areaItem.showBorderPolygon.rawValue === true) { if (areaItem.borderPolygon.count < 3) { areaItem.borderPolygon.appendVertex(topLeftCoord) areaItem.borderPolygon.appendVertex(topRightCoord) areaItem.borderPolygon.appendVertex(bottomRightCoord) areaItem.borderPolygon.appendVertex(bottomLeftCoord) } } else { if (_polygon.count < 3) { _polygon.appendVertex(topLeftCoord) _polygon.appendVertex(topRightCoord) _polygon.appendVertex(bottomRightCoord) _polygon.appendVertex(bottomLeftCoord) } } } Component.onCompleted: { _addInitialPolygon() if (_showDepot){ _addDepot() } } Component.onDestruction: { _destroyDepot() } WimaMapPolygonVisuals { qgcView: _root.qgcView mapControl: map mapPolygon: _polygon borderWidth: 1 borderColor: "black" interiorColor: "yellow" interiorOpacity: 0.25 } WimaMapPolygonVisuals { qgcView: _root.qgcView mapControl: map mapPolygon: areaItem.borderPolygon borderWidth: 1 borderColor: areaItem.borderPolygon.interactive ? "white" : "transparent" interiorColor: "transparent" interiorOpacity: 1 } // Depot Point. Component { id: depotPointComponent DragCoordinate { property var depot: _root.areaItem.depot map: _root.map qgcView: _root.qgcView z: QGroundControl.zOrderMapItems checked: _root._showDepot coordinate: _root.areaItem.depot label: "Depot" function syncAndBind(){ if (coordinate.latitude !== depot.latitude || coordinate.longitude !== depot.longitude){ if (_root.areaItem.containsCoordinate(coordinate)){ _root.areaItem.depot = coordinate } } coordinate = Qt.binding(function(){return _root.areaItem.depot}) } onDragReleased: { syncAndBind() } Component.onCompleted: { syncAndBind() } } } }