You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
10 KiB
300 lines
10 KiB
/**************************************************************************** |
|
* |
|
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> |
|
* |
|
* QGroundControl is licensed according to the terms in the file |
|
* COPYING.md in the root of the source code directory. |
|
* |
|
****************************************************************************/ |
|
|
|
|
|
import QtQuick 2.4 |
|
import QtQuick.Controls 1.3 |
|
import QtLocation 5.3 |
|
import QtPositioning 5.2 |
|
|
|
import QGroundControl 1.0 |
|
import QGroundControl.FlightDisplay 1.0 |
|
import QGroundControl.FlightMap 1.0 |
|
import QGroundControl.ScreenTools 1.0 |
|
import QGroundControl.Controls 1.0 |
|
import QGroundControl.Palette 1.0 |
|
import QGroundControl.Vehicle 1.0 |
|
import QGroundControl.Controllers 1.0 |
|
|
|
FlightMap { |
|
id: flightMap |
|
anchors.fill: parent |
|
mapName: _mapName |
|
|
|
property alias missionController: missionController |
|
property var flightWidgets |
|
property var rightPanelWidth |
|
|
|
property bool _followVehicle: true |
|
property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle |
|
property bool _activeVehicleCoordinateValid: _activeVehicle ? _activeVehicle.coordinateValid : false |
|
property var activeVehicleCoordinate: _activeVehicle ? _activeVehicle.coordinate : QtPositioning.coordinate() |
|
property var _gotoHereCoordinate: QtPositioning.coordinate() |
|
property int _retaskSequence: 0 |
|
property real _toolButtonTopMargin: parent.height - ScreenTools.availableHeight + (ScreenTools.defaultFontPixelHeight / 2) |
|
|
|
Component.onCompleted: { |
|
QGroundControl.flightMapPosition = center |
|
QGroundControl.flightMapZoom = zoomLevel |
|
} |
|
onCenterChanged: QGroundControl.flightMapPosition = center |
|
onZoomLevelChanged: QGroundControl.flightMapZoom = zoomLevel |
|
|
|
onActiveVehicleCoordinateChanged: { |
|
if (_followVehicle && _activeVehicleCoordinateValid && activeVehicleCoordinate.isValid) { |
|
_initialMapPositionSet = true |
|
flightMap.center = activeVehicleCoordinate |
|
} |
|
} |
|
|
|
QGCPalette { id: qgcPal; colorGroupEnabled: true } |
|
QGCMapPalette { id: mapPal; lightColors: isSatelliteMap } |
|
|
|
MissionController { |
|
id: missionController |
|
Component.onCompleted: start(false /* editMode */) |
|
} |
|
|
|
GeoFenceController { |
|
id: geoFenceController |
|
Component.onCompleted: start(false /* editMode */) |
|
} |
|
|
|
RallyPointController { |
|
id: rallyPointController |
|
Component.onCompleted: start(false /* editMode */) |
|
} |
|
|
|
ExclusiveGroup { |
|
id: _mapTypeButtonsExclusiveGroup |
|
} |
|
|
|
ToolStrip { |
|
id: toolStrip |
|
anchors.leftMargin: ScreenTools.defaultFontPixelWidth |
|
anchors.left: parent.left |
|
anchors.topMargin: _toolButtonTopMargin |
|
anchors.top: parent.top |
|
color: qgcPal.window |
|
title: qsTr("Fly") |
|
z: QGroundControl.zOrderWidgets |
|
buttonVisible: [ true, true, _showZoom, _showZoom ] |
|
|
|
property bool _showZoom: !ScreenTools.isShortScreen |
|
|
|
model: [ |
|
{ |
|
name: "Center", |
|
iconSource: "/qmlimages/MapCenter.svg", |
|
dropPanelComponent: centerMapDropPanel |
|
}, |
|
{ |
|
name: "Map", |
|
iconSource: "/qmlimages/MapType.svg", |
|
dropPanelComponent: mapTypeDropPanel |
|
}, |
|
{ |
|
name: "In", |
|
iconSource: "/qmlimages/ZoomPlus.svg" |
|
}, |
|
{ |
|
name: "Out", |
|
iconSource: "/qmlimages/ZoomMinus.svg" |
|
} |
|
] |
|
|
|
onClicked: { |
|
switch (index) { |
|
case 2: |
|
_flightMap.zoomLevel += 0.5 |
|
break |
|
case 3: |
|
_flightMap.zoomLevel -= 0.5 |
|
break |
|
} |
|
} |
|
} |
|
|
|
// Toolstrip drop panel compomnents |
|
|
|
MapFitFunctions { |
|
id: mapFitFunctions |
|
map: _flightMap |
|
mapFitViewport: Qt.rect(leftToolWidth, _toolButtonTopMargin, flightMap.width - leftToolWidth - rightPanelWidth, flightMap.height - _toolButtonTopMargin) |
|
usePlannedHomePosition: false |
|
mapMissionController: missionController |
|
mapGeoFenceController: geoFenceController |
|
mapRallyPointController: rallyPointController |
|
|
|
property real leftToolWidth: toolStrip.x + toolStrip.width |
|
} |
|
|
|
Component { |
|
id: centerMapDropPanel |
|
|
|
CenterMapDropPanel { |
|
map: _flightMap |
|
fitFunctions: mapFitFunctions |
|
showFollowVehicle: true |
|
followVehicle: _followVehicle |
|
|
|
onFollowVehicleChanged: _followVehicle = followVehicle |
|
} |
|
} |
|
|
|
Component { |
|
id: mapTypeDropPanel |
|
|
|
Column { |
|
spacing: ScreenTools.defaultFontPixelHeight / 2 |
|
|
|
QGCLabel { text: qsTr("Map type:") } |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
Repeater { |
|
model: QGroundControl.flightMapSettings.mapTypes |
|
|
|
QGCButton { |
|
checkable: true |
|
checked: QGroundControl.flightMapSettings.mapType === text |
|
text: modelData |
|
exclusiveGroup: _mapTypeButtonsExclusiveGroup |
|
onClicked: { |
|
QGroundControl.flightMapSettings.mapType = text |
|
dropPanel.hide() |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
// Add trajectory points to the map |
|
MapItemView { |
|
model: _mainIsMap ? _activeVehicle ? _activeVehicle.trajectoryPoints : 0 : 0 |
|
delegate: |
|
MapPolyline { |
|
line.width: 3 |
|
line.color: "red" |
|
z: QGroundControl.zOrderMapItems - 1 |
|
path: [ |
|
object.coordinate1, |
|
object.coordinate2, |
|
] |
|
} |
|
} |
|
|
|
// Add the vehicles to the map |
|
MapItemView { |
|
model: QGroundControl.multiVehicleManager.vehicles |
|
delegate: |
|
VehicleMapItem { |
|
vehicle: object |
|
coordinate: object.coordinate |
|
isSatellite: flightMap.isSatelliteMap |
|
size: _mainIsMap ? ScreenTools.defaultFontPixelHeight * 5 : ScreenTools.defaultFontPixelHeight * 2 |
|
z: QGroundControl.zOrderMapItems - 1 |
|
} |
|
} |
|
|
|
// Add the mission items to the map |
|
MissionItemView { |
|
model: _mainIsMap ? missionController.visualItems : 0 |
|
} |
|
|
|
// Add lines between waypoints |
|
MissionLineView { |
|
model: _mainIsMap ? missionController.waypointLines : 0 |
|
} |
|
|
|
// GeoFence polygon |
|
MapPolygon { |
|
border.color: "#80FF0000" |
|
border.width: 3 |
|
path: geoFenceController.polygon.path |
|
visible: geoFenceController.polygonEnabled |
|
} |
|
|
|
// GeoFence circle |
|
MapCircle { |
|
border.color: "#80FF0000" |
|
border.width: 3 |
|
center: missionController.plannedHomePosition |
|
radius: geoFenceController.circleRadius |
|
z: QGroundControl.zOrderMapItems |
|
visible: geoFenceController.circleEnabled |
|
} |
|
|
|
// GeoFence breach return point |
|
MapQuickItem { |
|
anchorPoint: Qt.point(sourceItem.width / 2, sourceItem.height / 2) |
|
coordinate: geoFenceController.breachReturnPoint |
|
visible: geoFenceController.breachReturnEnabled |
|
sourceItem: MissionItemIndexLabel { label: "F" } |
|
z: QGroundControl.zOrderMapItems |
|
} |
|
|
|
// Rally points on map |
|
MapItemView { |
|
model: rallyPointController.points |
|
|
|
delegate: MapQuickItem { |
|
id: itemIndicator |
|
anchorPoint: Qt.point(sourceItem.width / 2, sourceItem.height / 2) |
|
coordinate: object.coordinate |
|
z: QGroundControl.zOrderMapItems |
|
|
|
sourceItem: MissionItemIndexLabel { |
|
id: itemIndexLabel |
|
label: qsTr("R", "rally point map item label") |
|
} |
|
} |
|
} |
|
|
|
// GoTo here waypoint |
|
MapQuickItem { |
|
coordinate: _gotoHereCoordinate |
|
visible: _activeVehicle && _activeVehicle.guidedMode && _gotoHereCoordinate.isValid |
|
z: QGroundControl.zOrderMapItems |
|
anchorPoint.x: sourceItem.width / 2 |
|
anchorPoint.y: sourceItem.height / 2 |
|
|
|
sourceItem: MissionItemIndexLabel { |
|
checked: true |
|
label: qsTr("G", "Goto here waypoint") // second string is translator's hint. |
|
} |
|
} |
|
|
|
MapScale { |
|
anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * (0.66) |
|
anchors.rightMargin: ScreenTools.defaultFontPixelHeight * (0.33) |
|
anchors.bottom: parent.bottom |
|
anchors.right: parent.right |
|
mapControl: flightMap |
|
visible: !ScreenTools.isTinyScreen |
|
} |
|
|
|
// Handle guided mode clicks |
|
MouseArea { |
|
anchors.fill: parent |
|
|
|
onClicked: { |
|
if (_activeVehicle) { |
|
if (flightWidgets.guidedModeBar.state != "Shown") { |
|
flightWidgets.guidedModeBar.state = "Shown" |
|
} else { |
|
if (flightWidgets.gotoEnabled) { |
|
_gotoHereCoordinate = flightMap.toCoordinate(Qt.point(mouse.x, mouse.y)) |
|
flightWidgets.guidedModeBar.confirmAction(flightWidgets.guidedModeBar.confirmGoTo) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|