diff --git a/src/PlanView/SurveyItemEditor.qml b/src/PlanView/SurveyItemEditor.qml index 6a91934..92f41a0 100644 --- a/src/PlanView/SurveyItemEditor.qml +++ b/src/PlanView/SurveyItemEditor.qml @@ -54,101 +54,119 @@ Rectangle { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - spacing: _margin - QGCTabBar { - id: tabBar + ColumnLayout { anchors.left: parent.left anchors.right: parent.right + spacing: _margin + visible: !missionItem.surveyAreaPolygon.isValid - Component.onCompleted: currentIndex = QGroundControl.settingsManager.planViewSettings.displayPresetsTabFirst.rawValue ? 2 : 0 - - QGCTabButton { text: qsTr("Grid") } - QGCTabButton { text: qsTr("Camera") } - QGCTabButton { text: qsTr("Presets") } + QGCLabel { + Layout.fillWidth: true + wrapMode: Text.WordWrap + text: qsTr("Use the Polygon Tools to create the polygon which outlines your survey area.") + } } Column { - anchors.left: parent.left - anchors.right: parent.right - spacing: _margin - visible: tabBar.currentIndex == 0 + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: missionItem.surveyAreaPolygon.isValid - QGCLabel { + QGCTabBar { + id: tabBar anchors.left: parent.left anchors.right: parent.right - text: qsTr("WARNING: Photo interval is below minimum interval (%1 secs) supported by camera.").arg(_cameraMinTriggerInterval.toFixed(1)) - wrapMode: Text.WordWrap - color: qgcPal.warningText - visible: missionItem.cameraShots > 0 && _cameraMinTriggerInterval !== 0 && _cameraMinTriggerInterval > missionItem.timeBetweenShots - } - CameraCalcGrid { - cameraCalc: missionItem.cameraCalc - vehicleFlightIsFrontal: true - distanceToSurfaceLabel: qsTr("Altitude") - distanceToSurfaceAltitudeMode: missionItem.followTerrain ? - QGroundControl.AltitudeModeAboveTerrain : - missionItem.cameraCalc.distanceToSurfaceRelative - frontalDistanceLabel: qsTr("Trigger Dist") - sideDistanceLabel: qsTr("Spacing") - } + Component.onCompleted: currentIndex = QGroundControl.settingsManager.planViewSettings.displayPresetsTabFirst.rawValue ? 2 : 0 - SectionHeader { - id: transectsHeader - text: qsTr("Transects") + QGCTabButton { text: qsTr("Grid") } + QGCTabButton { text: qsTr("Camera") } + QGCTabButton { text: qsTr("Presets") } } - GridLayout { - anchors.left: parent.left - anchors.right: parent.right - columnSpacing: _margin - rowSpacing: _margin - columns: 2 - visible: transectsHeader.checked - - QGCLabel { text: qsTr("Angle") } - FactTextField { - fact: missionItem.gridAngle - Layout.fillWidth: true - onUpdated: angleSlider.value = missionItem.gridAngle.value + Column { + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: tabBar.currentIndex == 0 + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + text: qsTr("WARNING: Photo interval is below minimum interval (%1 secs) supported by camera.").arg(_cameraMinTriggerInterval.toFixed(1)) + wrapMode: Text.WordWrap + color: qgcPal.warningText + visible: missionItem.cameraShots > 0 && _cameraMinTriggerInterval !== 0 && _cameraMinTriggerInterval > missionItem.timeBetweenShots } - QGCSlider { - id: angleSlider - minimumValue: 0 - maximumValue: 359 - stepSize: 1 - tickmarksEnabled: false - Layout.fillWidth: true - Layout.columnSpan: 2 - Layout.preferredHeight: ScreenTools.defaultFontPixelHeight * 1.5 - onValueChanged: missionItem.gridAngle.value = value - Component.onCompleted: value = missionItem.gridAngle.value - updateValueWhileDragging: true + CameraCalcGrid { + cameraCalc: missionItem.cameraCalc + vehicleFlightIsFrontal: true + distanceToSurfaceLabel: qsTr("Altitude") + distanceToSurfaceAltitudeMode: missionItem.followTerrain ? + QGroundControl.AltitudeModeAboveTerrain : + missionItem.cameraCalc.distanceToSurfaceRelative + frontalDistanceLabel: qsTr("Trigger Dist") + sideDistanceLabel: qsTr("Spacing") } - QGCLabel { - text: qsTr("Turnaround dist") + SectionHeader { + id: transectsHeader + text: qsTr("Transects") } - FactTextField { - fact: missionItem.turnAroundDistance - Layout.fillWidth: true + + GridLayout { + anchors.left: parent.left + anchors.right: parent.right + columnSpacing: _margin + rowSpacing: _margin + columns: 2 + visible: transectsHeader.checked + + QGCLabel { text: qsTr("Angle") } + FactTextField { + fact: missionItem.gridAngle + Layout.fillWidth: true + onUpdated: angleSlider.value = missionItem.gridAngle.value + } + + QGCSlider { + id: angleSlider + minimumValue: 0 + maximumValue: 359 + stepSize: 1 + tickmarksEnabled: false + Layout.fillWidth: true + Layout.columnSpan: 2 + Layout.preferredHeight: ScreenTools.defaultFontPixelHeight * 1.5 + onValueChanged: missionItem.gridAngle.value = value + Component.onCompleted: value = missionItem.gridAngle.value + updateValueWhileDragging: true + } + + QGCLabel { + text: qsTr("Turnaround dist") + } + FactTextField { + fact: missionItem.turnAroundDistance + Layout.fillWidth: true + } } - } - QGCButton { - text: qsTr("Rotate Entry Point") - onClicked: missionItem.rotateEntryPoint(); - } + QGCButton { + text: qsTr("Rotate Entry Point") + onClicked: missionItem.rotateEntryPoint(); + } - ColumnLayout { - anchors.left: parent.left - anchors.right: parent.right - spacing: _margin - visible: transectsHeader.checked + ColumnLayout { + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: transectsHeader.checked - /* + /* Temporarily removed due to bug https://github.com/mavlink/qgroundcontrol/issues/7005 FactCheckBox { text: qsTr("Split concave polygons") @@ -158,231 +176,232 @@ Rectangle { } */ - QGCOptionsComboBox { - Layout.fillWidth: true - - model: [ - { - text: qsTr("Hover and capture image"), - fact: missionItem.hoverAndCapture, - enabled: !missionItem.followTerrain, - visible: missionItem.hoverAndCaptureAllowed - }, - { - text: qsTr("Refly at 90 deg offset"), - fact: missionItem.refly90Degrees, - enabled: !missionItem.followTerrain, - visible: true - }, - { - text: qsTr("Images in turnarounds"), - fact: missionItem.cameraTriggerInTurnAround, - enabled: missionItem.hoverAndCaptureAllowed ? !missionItem.hoverAndCapture.rawValue : true, - visible: true - }, - { - text: qsTr("Fly alternate transects"), - fact: missionItem.flyAlternateTransects, - enabled: true, - visible: _vehicle ? (_vehicle.fixedWing || _vehicle.vtol) : false - }, - { - text: qsTr("Relative altitude"), - enabled: missionItem.cameraCalc.isManualCamera && !missionItem.followTerrain, - visible: QGroundControl.corePlugin.options.showMissionAbsoluteAltitude || (!missionItem.cameraCalc.distanceToSurfaceRelative && !missionItem.followTerrain), - checked: missionItem.cameraCalc.distanceToSurfaceRelative + QGCOptionsComboBox { + Layout.fillWidth: true + + model: [ + { + text: qsTr("Hover and capture image"), + fact: missionItem.hoverAndCapture, + enabled: !missionItem.followTerrain, + visible: missionItem.hoverAndCaptureAllowed + }, + { + text: qsTr("Refly at 90 deg offset"), + fact: missionItem.refly90Degrees, + enabled: !missionItem.followTerrain, + visible: true + }, + { + text: qsTr("Images in turnarounds"), + fact: missionItem.cameraTriggerInTurnAround, + enabled: missionItem.hoverAndCaptureAllowed ? !missionItem.hoverAndCapture.rawValue : true, + visible: true + }, + { + text: qsTr("Fly alternate transects"), + fact: missionItem.flyAlternateTransects, + enabled: true, + visible: _vehicle ? (_vehicle.fixedWing || _vehicle.vtol) : false + }, + { + text: qsTr("Relative altitude"), + enabled: missionItem.cameraCalc.isManualCamera && !missionItem.followTerrain, + visible: QGroundControl.corePlugin.options.showMissionAbsoluteAltitude || (!missionItem.cameraCalc.distanceToSurfaceRelative && !missionItem.followTerrain), + checked: missionItem.cameraCalc.distanceToSurfaceRelative + } + ] + + onItemClicked: { + if (index == 4) { + missionItem.cameraCalc.distanceToSurfaceRelative = !missionItem.cameraCalc.distanceToSurfaceRelative + console.log(missionItem.cameraCalc.distanceToSurfaceRelative) + } } - ] + } + } - onItemClicked: { - if (index == 4) { - missionItem.cameraCalc.distanceToSurfaceRelative = !missionItem.cameraCalc.distanceToSurfaceRelative - console.log(missionItem.cameraCalc.distanceToSurfaceRelative) + SectionHeader { + id: terrainHeader + text: qsTr("Terrain") + checked: missionItem.followTerrain + } + + ColumnLayout { + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: terrainHeader.checked + + + QGCCheckBox { + id: followsTerrainCheckBox + text: qsTr("Vehicle follows terrain") + checked: missionItem.followTerrain + onClicked: missionItem.followTerrain = checked + } + + GridLayout { + Layout.fillWidth: true + columnSpacing: _margin + rowSpacing: _margin + columns: 2 + visible: followsTerrainCheckBox.checked + + QGCLabel { text: qsTr("Tolerance") } + FactTextField { + fact: missionItem.terrainAdjustTolerance + Layout.fillWidth: true + } + + QGCLabel { text: qsTr("Max Climb Rate") } + FactTextField { + fact: missionItem.terrainAdjustMaxClimbRate + Layout.fillWidth: true + } + + QGCLabel { text: qsTr("Max Descent Rate") } + FactTextField { + fact: missionItem.terrainAdjustMaxDescentRate + Layout.fillWidth: true } } } - } - SectionHeader { - id: terrainHeader - text: qsTr("Terrain") - checked: missionItem.followTerrain - } + SectionHeader { + id: statsHeader + text: qsTr("Statistics") + } + + TransectStyleComplexItemStats { + anchors.left: parent.left + anchors.right: parent.right + visible: statsHeader.checked + } + } // Grid Column + + Column { + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: tabBar.currentIndex == 1 + + CameraCalcCamera { + cameraCalc: missionItem.cameraCalc + vehicleFlightIsFrontal: true + distanceToSurfaceLabel: qsTr("Altitude") + distanceToSurfaceAltitudeMode: missionItem.followTerrain ? + QGroundControl.AltitudeModeAboveTerrain : + missionItem.cameraCalc.distanceToSurfaceRelative + frontalDistanceLabel: qsTr("Trigger Dist") + sideDistanceLabel: qsTr("Spacing") + } + } // Camera Column ColumnLayout { - anchors.left: parent.left - anchors.right: parent.right - spacing: _margin - visible: terrainHeader.checked + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: tabBar.currentIndex == 2 + QGCLabel { + Layout.fillWidth: true + text: qsTr("Presets") + wrapMode: Text.WordWrap + } - QGCCheckBox { - id: followsTerrainCheckBox - text: qsTr("Vehicle follows terrain") - checked: missionItem.followTerrain - onClicked: missionItem.followTerrain = checked + QGCComboBox { + id: presetCombo + Layout.fillWidth: true + model: missionItem.presetNames } - GridLayout { + RowLayout { Layout.fillWidth: true - columnSpacing: _margin - rowSpacing: _margin - columns: 2 - visible: followsTerrainCheckBox.checked - QGCLabel { text: qsTr("Tolerance") } - FactTextField { - fact: missionItem.terrainAdjustTolerance + QGCButton { Layout.fillWidth: true + text: qsTr("Apply Preset") + enabled: missionItem.presetNames.length != 0 + onClicked: missionItem.loadPreset(presetCombo.textAt(presetCombo.currentIndex)) } - QGCLabel { text: qsTr("Max Climb Rate") } - FactTextField { - fact: missionItem.terrainAdjustMaxClimbRate + QGCButton { Layout.fillWidth: true + text: qsTr("Delete Preset") + enabled: missionItem.presetNames.length != 0 + onClicked: missionItem.deletePreset(presetCombo.textAt(presetCombo.currentIndex)) } - QGCLabel { text: qsTr("Max Descent Rate") } - FactTextField { - fact: missionItem.terrainAdjustMaxDescentRate - Layout.fillWidth: true - } } - } - - SectionHeader { - id: statsHeader - text: qsTr("Statistics") - } - - TransectStyleComplexItemStats { - anchors.left: parent.left - anchors.right: parent.right - visible: statsHeader.checked - } - } // Grid Column - - Column { - anchors.left: parent.left - anchors.right: parent.right - spacing: _margin - visible: tabBar.currentIndex == 1 - - CameraCalcCamera { - cameraCalc: missionItem.cameraCalc - vehicleFlightIsFrontal: true - distanceToSurfaceLabel: qsTr("Altitude") - distanceToSurfaceAltitudeMode: missionItem.followTerrain ? - QGroundControl.AltitudeModeAboveTerrain : - missionItem.cameraCalc.distanceToSurfaceRelative - frontalDistanceLabel: qsTr("Trigger Dist") - sideDistanceLabel: qsTr("Spacing") - } - } // Camera Column - - ColumnLayout { - anchors.left: parent.left - anchors.right: parent.right - spacing: _margin - visible: tabBar.currentIndex == 2 - - QGCLabel { - Layout.fillWidth: true - text: qsTr("Presets") - wrapMode: Text.WordWrap - } - - QGCComboBox { - id: presetCombo - Layout.fillWidth: true - model: missionItem.presetNames - } - RowLayout { - Layout.fillWidth: true + Item { height: ScreenTools.defaultFontPixelHeight; width: 1 } QGCButton { + Layout.alignment: Qt.AlignCenter Layout.fillWidth: true - text: qsTr("Apply Preset") - enabled: missionItem.presetNames.length != 0 - onClicked: missionItem.loadPreset(presetCombo.textAt(presetCombo.currentIndex)) + text: qsTr("Save Settings As New Preset") + onClicked: mainWindow.showComponentDialog(savePresetDialog, qsTr("Save Preset"), mainWindow.showDialogDefaultWidth, StandardButton.Save | StandardButton.Cancel) } - QGCButton { + SectionHeader { + id: presectsTransectsHeader + anchors.left: undefined + anchors.right: undefined Layout.fillWidth: true - text: qsTr("Delete Preset") - enabled: missionItem.presetNames.length != 0 - onClicked: missionItem.deletePreset(presetCombo.textAt(presetCombo.currentIndex)) + text: qsTr("Transects") } - } - - Item { height: ScreenTools.defaultFontPixelHeight; width: 1 } + GridLayout { + Layout.fillWidth: true + columnSpacing: _margin + rowSpacing: _margin + columns: 2 + visible: presectsTransectsHeader.checked - QGCButton { - Layout.alignment: Qt.AlignCenter - Layout.fillWidth: true - text: qsTr("Save Settings As New Preset") - onClicked: mainWindow.showComponentDialog(savePresetDialog, qsTr("Save Preset"), mainWindow.showDialogDefaultWidth, StandardButton.Save | StandardButton.Cancel) - } + QGCLabel { text: qsTr("Angle") } + FactTextField { + fact: missionItem.gridAngle + Layout.fillWidth: true + onUpdated: presetsAngleSlider.value = missionItem.gridAngle.value + } - SectionHeader { - id: presectsTransectsHeader - anchors.left: undefined - anchors.right: undefined - Layout.fillWidth: true - text: qsTr("Transects") - } + QGCSlider { + id: presetsAngleSlider + minimumValue: 0 + maximumValue: 359 + stepSize: 1 + tickmarksEnabled: false + Layout.fillWidth: true + Layout.columnSpan: 2 + Layout.preferredHeight: ScreenTools.defaultFontPixelHeight * 1.5 + onValueChanged: missionItem.gridAngle.value = value + Component.onCompleted: value = missionItem.gridAngle.value + updateValueWhileDragging: true + } - GridLayout { - Layout.fillWidth: true - columnSpacing: _margin - rowSpacing: _margin - columns: 2 - visible: presectsTransectsHeader.checked - - QGCLabel { text: qsTr("Angle") } - FactTextField { - fact: missionItem.gridAngle - Layout.fillWidth: true - onUpdated: presetsAngleSlider.value = missionItem.gridAngle.value + QGCButton { + Layout.columnSpan: 2 + Layout.fillWidth: true + text: qsTr("Rotate Entry Point") + onClicked: missionItem.rotateEntryPoint(); + } } - QGCSlider { - id: presetsAngleSlider - minimumValue: 0 - maximumValue: 359 - stepSize: 1 - tickmarksEnabled: false - Layout.fillWidth: true - Layout.columnSpan: 2 - Layout.preferredHeight: ScreenTools.defaultFontPixelHeight * 1.5 - onValueChanged: missionItem.gridAngle.value = value - Component.onCompleted: value = missionItem.gridAngle.value - updateValueWhileDragging: true + SectionHeader { + id: presetsStatsHeader + anchors.left: undefined + anchors.right: undefined + Layout.fillWidth: true + text: qsTr("Statistics") } - QGCButton { - Layout.columnSpan: 2 + TransectStyleComplexItemStats { Layout.fillWidth: true - text: qsTr("Rotate Entry Point") - onClicked: missionItem.rotateEntryPoint(); + visible: presetsStatsHeader.checked } - } - - SectionHeader { - id: presetsStatsHeader - anchors.left: undefined - anchors.right: undefined - Layout.fillWidth: true - text: qsTr("Statistics") - } - - TransectStyleComplexItemStats { - Layout.fillWidth: true - visible: presetsStatsHeader.checked - } - } // Camera Column + } // Main editing column + } // Top level Column Component { id: savePresetDialog @@ -418,4 +437,17 @@ Rectangle { } } } + + KMLOrSHPFileDialog { + id: kmlOrSHPLoadDialog + title: qsTr("Select Polygon File") + selectExisting: true + + onAcceptedForLoad: { + missionItem.surveyAreaPolygon.loadKMLOrSHPFile(file) + missionItem.resetState = false + //editorMap.mapFitFunctions.fitMapViewportToMissionItems() + close() + } + } } // Rectangle