|
|
|
@ -48,6 +48,7 @@ QGCView {
@@ -48,6 +48,7 @@ QGCView {
|
|
|
|
|
property bool _lightWidgetBorders: editorMap.isSatelliteMap |
|
|
|
|
property bool _addWaypointOnClick: false |
|
|
|
|
property bool _singleComplexItem: missionController.complexMissionItemNames.length === 1 |
|
|
|
|
property real _toolbarHeight: _qgcView.height - ScreenTools.availableHeight |
|
|
|
|
|
|
|
|
|
/// The controller which should be called for load/save, send to/from vehicle calls |
|
|
|
|
property var _syncDropDownController: missionController |
|
|
|
@ -321,21 +322,17 @@ QGCView {
@@ -321,21 +322,17 @@ QGCView {
|
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
|
|
|
|
|
Item { |
|
|
|
|
anchors.fill: parent |
|
|
|
|
|
|
|
|
|
FlightMap { |
|
|
|
|
id: editorMap |
|
|
|
|
height: _qgcView.height |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
anchors.right: parent.right//rightPanel.left |
|
|
|
|
mapName: "MissionEditor" |
|
|
|
|
|
|
|
|
|
// This is the center rectangle of the map which is not obscured by tools |
|
|
|
|
property rect centerViewport: Qt.rect(_leftToolWidth, _toolbarHeight, editorMap.width - _leftToolWidth - _rightPanelWidth, editorMap.height - _statusHeight - _toolbarHeight) |
|
|
|
|
|
|
|
|
|
property real _toolbarHeight: _qgcView.height - ScreenTools.availableHeight |
|
|
|
|
property real _leftToolWidth: toolStrip.x + toolStrip.width |
|
|
|
|
property real _statusHeight: waypointValuesDisplay.visible ? editorMap.height - waypointValuesDisplay.y : 0 |
|
|
|
|
|
|
|
|
@ -461,14 +458,149 @@ QGCView {
@@ -461,14 +458,149 @@ QGCView {
|
|
|
|
|
z: QGroundControl.zOrderMapItems - 1 |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
GeoFenceMapVisuals { |
|
|
|
|
map: editorMap |
|
|
|
|
myGeoFenceController: geoFenceController |
|
|
|
|
interactive: _editingLayer == _layerGeoFence |
|
|
|
|
homePosition: missionController.plannedHomePosition |
|
|
|
|
planView: true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Rally points on map |
|
|
|
|
|
|
|
|
|
MapItemView { |
|
|
|
|
model: rallyPointController.points |
|
|
|
|
|
|
|
|
|
delegate: MapQuickItem { |
|
|
|
|
id: itemIndicator |
|
|
|
|
anchorPoint.x: sourceItem.anchorPointX |
|
|
|
|
anchorPoint.y: sourceItem.anchorPointY |
|
|
|
|
coordinate: object.coordinate |
|
|
|
|
z: QGroundControl.zOrderMapItems |
|
|
|
|
|
|
|
|
|
sourceItem: MissionItemIndexLabel { |
|
|
|
|
id: itemIndexLabel |
|
|
|
|
label: qsTr("R", "rally point map item label") |
|
|
|
|
checked: _editingLayer == _layerRallyPoints ? object == rallyPointController.currentRallyPoint : false |
|
|
|
|
|
|
|
|
|
onClicked: rallyPointController.currentRallyPoint = object |
|
|
|
|
|
|
|
|
|
onCheckedChanged: { |
|
|
|
|
if (checked) { |
|
|
|
|
// Setup our drag item |
|
|
|
|
itemDragger.visible = true |
|
|
|
|
itemDragger.coordinateItem = Qt.binding(function() { return object }) |
|
|
|
|
itemDragger.mapCoordinateIndicator = Qt.binding(function() { return itemIndicator }) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ToolStrip { |
|
|
|
|
id: toolStrip |
|
|
|
|
anchors.leftMargin: ScreenTools.defaultFontPixelWidth |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.topMargin: _toolButtonTopMargin |
|
|
|
|
anchors.top: parent.top |
|
|
|
|
color: qgcPal.window |
|
|
|
|
title: qsTr("Plan") |
|
|
|
|
z: QGroundControl.zOrderWidgets |
|
|
|
|
buttonEnabled: [ true, true, true, true, true ] |
|
|
|
|
buttonVisible: [ true, true, true, _showZoom, _showZoom ] |
|
|
|
|
maxHeight: mapScale.y - toolStrip.y |
|
|
|
|
|
|
|
|
|
property bool _showZoom: !ScreenTools.isMobile |
|
|
|
|
|
|
|
|
|
property bool mySingleComplexItem: _singleComplexItem |
|
|
|
|
|
|
|
|
|
model: [ |
|
|
|
|
{ |
|
|
|
|
name: "Waypoint", |
|
|
|
|
iconSource: "/qmlimages/MapAddMission.svg", |
|
|
|
|
toggle: true |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "Pattern", |
|
|
|
|
iconSource: "/qmlimages/MapDrawShape.svg", |
|
|
|
|
dropPanelComponent: _singleComplexItem ? undefined : patternDropPanel |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "Center", |
|
|
|
|
iconSource: "/qmlimages/MapCenter.svg", |
|
|
|
|
dropPanelComponent: centerMapDropPanel |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "In", |
|
|
|
|
iconSource: "/qmlimages/ZoomPlus.svg" |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "Out", |
|
|
|
|
iconSource: "/qmlimages/ZoomMinus.svg" |
|
|
|
|
} |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
onClicked: { |
|
|
|
|
switch (index) { |
|
|
|
|
case 0: |
|
|
|
|
_addWaypointOnClick = checked |
|
|
|
|
break |
|
|
|
|
case 1: |
|
|
|
|
if (_singleComplexItem) { |
|
|
|
|
addComplexItem(missionController.complexMissionItemNames[0]) |
|
|
|
|
} |
|
|
|
|
break |
|
|
|
|
case 3: |
|
|
|
|
editorMap.zoomLevel += 0.5 |
|
|
|
|
break |
|
|
|
|
case 4: |
|
|
|
|
editorMap.zoomLevel -= 0.5 |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
MapScale { |
|
|
|
|
id: mapScale |
|
|
|
|
anchors.margins: ScreenTools.defaultFontPixelHeight * (0.66) |
|
|
|
|
anchors.bottom: waypointValuesDisplay.visible ? waypointValuesDisplay.top : parent.bottom |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
mapControl: editorMap |
|
|
|
|
visible: !ScreenTools.isTinyScreen |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
MissionItemStatus { |
|
|
|
|
id: waypointValuesDisplay |
|
|
|
|
anchors.margins: ScreenTools.defaultFontPixelWidth |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
z: QGroundControl.zOrderTopMost |
|
|
|
|
currentMissionItem: _currentMissionItem |
|
|
|
|
missionItems: missionController.visualItems |
|
|
|
|
expandedWidth: missionItemEditor.x - (ScreenTools.defaultFontPixelWidth * 2) |
|
|
|
|
missionDistance: missionController.missionDistance |
|
|
|
|
missionTime: missionController.missionTime |
|
|
|
|
missionMaxTelemetry: missionController.missionMaxTelemetry |
|
|
|
|
visible: _editingLayer == _layerMission && !ScreenTools.isShortScreen |
|
|
|
|
} |
|
|
|
|
} // FlightMap |
|
|
|
|
|
|
|
|
|
// Right pane for mission editing controls |
|
|
|
|
Rectangle { |
|
|
|
|
id: rightPanel |
|
|
|
|
anchors.top: parent.top |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
width: _rightPanelWidth |
|
|
|
|
color: qgcPal.window |
|
|
|
|
opacity: 0.95 |
|
|
|
|
|
|
|
|
|
// Plan Element selector (Mission/Fence/Rally) |
|
|
|
|
Row { |
|
|
|
|
id: planElementSelectorRow |
|
|
|
|
anchors.top: toolStrip.top |
|
|
|
|
anchors.leftMargin: parent.width - _rightPanelWidth |
|
|
|
|
anchors.top: parent.top |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
z: QGroundControl.zOrderWidgets |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
spacing: _horizontalMargin |
|
|
|
|
visible: false // WIP: Temporarily remove - QGroundControl.corePlugin.options.enablePlanViewSelector |
|
|
|
|
|
|
|
|
@ -531,28 +663,15 @@ QGCView {
@@ -531,28 +663,15 @@ QGCView {
|
|
|
|
|
// Mission Item Editor |
|
|
|
|
Item { |
|
|
|
|
id: missionItemEditor |
|
|
|
|
anchors.topMargin: planElementSelectorRow.visible ? _margin : 0 |
|
|
|
|
anchors.top: planElementSelectorRow.visible ? planElementSelectorRow.bottom : planElementSelectorRow.top |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
width: _rightPanelWidth |
|
|
|
|
opacity: _rightPanelOpacity |
|
|
|
|
z: QGroundControl.zOrderTopMost |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
visible: _editingLayer == _layerMission |
|
|
|
|
|
|
|
|
|
MouseArea { |
|
|
|
|
// This MouseArea prevents the Map below it from getting Mouse events. Without this |
|
|
|
|
// things like mousewheel will scroll the Flickable and then scroll the map as well. |
|
|
|
|
anchors.fill: missionItemEditorListView |
|
|
|
|
onWheel: wheel.accepted = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QGCListView { |
|
|
|
|
id: missionItemEditorListView |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
anchors.top: parent.top |
|
|
|
|
height: parent.height |
|
|
|
|
anchors.fill: parent |
|
|
|
|
spacing: _margin / 2 |
|
|
|
|
orientation: ListView.Vertical |
|
|
|
|
model: missionController.visualItems |
|
|
|
@ -566,6 +685,7 @@ QGCView {
@@ -566,6 +685,7 @@ QGCView {
|
|
|
|
|
missionItem: object |
|
|
|
|
width: parent.width |
|
|
|
|
readOnly: false |
|
|
|
|
rootQgcView: _qgcView |
|
|
|
|
|
|
|
|
|
onClicked: setCurrentItem(object.sequenceNumber) |
|
|
|
|
|
|
|
|
@ -586,11 +706,9 @@ QGCView {
@@ -586,11 +706,9 @@ QGCView {
|
|
|
|
|
|
|
|
|
|
// GeoFence Editor |
|
|
|
|
Loader { |
|
|
|
|
anchors.topMargin: _margin |
|
|
|
|
anchors.top: planElementSelectorRow.bottom |
|
|
|
|
anchors.top: planElementSelectorRow.visible ? planElementSelectorRow.bottom : planElementSelectorRow.top |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
opacity: _rightPanelOpacity |
|
|
|
|
z: QGroundControl.zOrderWidgets |
|
|
|
|
sourceComponent: _editingLayer == _layerGeoFence ? geoFenceEditorComponent : undefined |
|
|
|
|
|
|
|
|
|
property real availableWidth: _rightPanelWidth |
|
|
|
@ -598,160 +716,27 @@ QGCView {
@@ -598,160 +716,27 @@ QGCView {
|
|
|
|
|
property var myGeoFenceController: geoFenceController |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GeoFenceMapVisuals { |
|
|
|
|
map: editorMap |
|
|
|
|
myGeoFenceController: geoFenceController |
|
|
|
|
interactive: _editingLayer == _layerGeoFence |
|
|
|
|
homePosition: missionController.plannedHomePosition |
|
|
|
|
planView: true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Rally Point Editor |
|
|
|
|
|
|
|
|
|
RallyPointEditorHeader { |
|
|
|
|
id: rallyPointHeader |
|
|
|
|
anchors.topMargin: _margin |
|
|
|
|
anchors.top: planElementSelectorRow.bottom |
|
|
|
|
anchors.top: planElementSelectorRow.visible ? planElementSelectorRow.bottom : planElementSelectorRow.top |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
width: _rightPanelWidth |
|
|
|
|
opacity: _rightPanelOpacity |
|
|
|
|
z: QGroundControl.zOrderTopMost |
|
|
|
|
visible: _editingLayer == _layerRallyPoints |
|
|
|
|
controller: rallyPointController |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RallyPointItemEditor { |
|
|
|
|
id: rallyPointEditor |
|
|
|
|
anchors.topMargin: _margin |
|
|
|
|
anchors.top: rallyPointHeader.bottom |
|
|
|
|
anchors.top: planElementSelectorRow.visible ? planElementSelectorRow.bottom : planElementSelectorRow.top |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.right: parent.right |
|
|
|
|
width: _rightPanelWidth |
|
|
|
|
opacity: _rightPanelOpacity |
|
|
|
|
z: QGroundControl.zOrderTopMost |
|
|
|
|
visible: _editingLayer == _layerRallyPoints && rallyPointController.points.count |
|
|
|
|
rallyPoint: rallyPointController.currentRallyPoint |
|
|
|
|
controller: rallyPointController |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Rally points on map |
|
|
|
|
|
|
|
|
|
MapItemView { |
|
|
|
|
model: rallyPointController.points |
|
|
|
|
|
|
|
|
|
delegate: MapQuickItem { |
|
|
|
|
id: itemIndicator |
|
|
|
|
anchorPoint.x: sourceItem.anchorPointX |
|
|
|
|
anchorPoint.y: sourceItem.anchorPointY |
|
|
|
|
coordinate: object.coordinate |
|
|
|
|
z: QGroundControl.zOrderMapItems |
|
|
|
|
|
|
|
|
|
sourceItem: MissionItemIndexLabel { |
|
|
|
|
id: itemIndexLabel |
|
|
|
|
label: qsTr("R", "rally point map item label") |
|
|
|
|
checked: _editingLayer == _layerRallyPoints ? object == rallyPointController.currentRallyPoint : false |
|
|
|
|
|
|
|
|
|
onClicked: rallyPointController.currentRallyPoint = object |
|
|
|
|
|
|
|
|
|
onCheckedChanged: { |
|
|
|
|
if (checked) { |
|
|
|
|
// Setup our drag item |
|
|
|
|
itemDragger.visible = true |
|
|
|
|
itemDragger.coordinateItem = Qt.binding(function() { return object }) |
|
|
|
|
itemDragger.mapCoordinateIndicator = Qt.binding(function() { return itemIndicator }) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ToolStrip { |
|
|
|
|
id: toolStrip |
|
|
|
|
anchors.leftMargin: ScreenTools.defaultFontPixelWidth |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.topMargin: _toolButtonTopMargin |
|
|
|
|
anchors.top: parent.top |
|
|
|
|
color: qgcPal.window |
|
|
|
|
title: qsTr("Plan") |
|
|
|
|
z: QGroundControl.zOrderWidgets |
|
|
|
|
buttonEnabled: [ true, true, true, true, true ] |
|
|
|
|
buttonVisible: [ true, true, true, _showZoom, _showZoom ] |
|
|
|
|
maxHeight: mapScale.y - toolStrip.y |
|
|
|
|
|
|
|
|
|
property bool _showZoom: !ScreenTools.isMobile |
|
|
|
|
|
|
|
|
|
property bool mySingleComplexItem: _singleComplexItem |
|
|
|
|
|
|
|
|
|
model: [ |
|
|
|
|
{ |
|
|
|
|
name: "Waypoint", |
|
|
|
|
iconSource: "/qmlimages/MapAddMission.svg", |
|
|
|
|
toggle: true |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "Pattern", |
|
|
|
|
iconSource: "/qmlimages/MapDrawShape.svg", |
|
|
|
|
dropPanelComponent: _singleComplexItem ? undefined : patternDropPanel |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "Center", |
|
|
|
|
iconSource: "/qmlimages/MapCenter.svg", |
|
|
|
|
dropPanelComponent: centerMapDropPanel |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "In", |
|
|
|
|
iconSource: "/qmlimages/ZoomPlus.svg" |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "Out", |
|
|
|
|
iconSource: "/qmlimages/ZoomMinus.svg" |
|
|
|
|
} |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
onClicked: { |
|
|
|
|
switch (index) { |
|
|
|
|
case 0: |
|
|
|
|
_addWaypointOnClick = checked |
|
|
|
|
break |
|
|
|
|
case 1: |
|
|
|
|
if (_singleComplexItem) { |
|
|
|
|
addComplexItem(missionController.complexMissionItemNames[0]) |
|
|
|
|
} |
|
|
|
|
break |
|
|
|
|
case 3: |
|
|
|
|
editorMap.zoomLevel += 0.5 |
|
|
|
|
break |
|
|
|
|
case 4: |
|
|
|
|
editorMap.zoomLevel -= 0.5 |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
MapScale { |
|
|
|
|
id: mapScale |
|
|
|
|
anchors.margins: ScreenTools.defaultFontPixelHeight * (0.66) |
|
|
|
|
anchors.bottom: waypointValuesDisplay.visible ? waypointValuesDisplay.top : parent.bottom |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
mapControl: editorMap |
|
|
|
|
visible: !ScreenTools.isTinyScreen |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
MissionItemStatus { |
|
|
|
|
id: waypointValuesDisplay |
|
|
|
|
anchors.margins: ScreenTools.defaultFontPixelWidth |
|
|
|
|
anchors.left: parent.left |
|
|
|
|
anchors.bottom: parent.bottom |
|
|
|
|
z: QGroundControl.zOrderTopMost |
|
|
|
|
currentMissionItem: _currentMissionItem |
|
|
|
|
missionItems: missionController.visualItems |
|
|
|
|
expandedWidth: missionItemEditor.x - (ScreenTools.defaultFontPixelWidth * 2) |
|
|
|
|
missionDistance: missionController.missionDistance |
|
|
|
|
missionTime: missionController.missionTime |
|
|
|
|
missionMaxTelemetry: missionController.missionMaxTelemetry |
|
|
|
|
visible: _editingLayer == _layerMission && !ScreenTools.isShortScreen |
|
|
|
|
} |
|
|
|
|
} // FlightMap |
|
|
|
|
} // Item - split view container |
|
|
|
|
} // Right panel |
|
|
|
|
} // QGCViewPanel |
|
|
|
|
|
|
|
|
|
Component { |
|
|
|
|