Skip to content
SurveyItemEditor.qml 16.6 KiB
Newer Older
import QtQuick          2.3
import QtQuick.Controls 1.2
Don Gagne's avatar
Don Gagne committed
import QtQuick.Dialogs  1.2
import QtQuick.Extras   1.4
import QtQuick.Layouts  1.2
import QGroundControl               1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Vehicle       1.0
import QGroundControl.Controls      1.0
import QGroundControl.FactSystem    1.0
import QGroundControl.FactControls  1.0
import QGroundControl.Palette       1.0
import QGroundControl.FlightMap     1.0

Rectangle {
    id:         _root
    height:     visible ? (editorColumn.height + (_margin * 2)) : 0
    width:      availableWidth
    color:      qgcPal.windowShadeDark
    radius:     _radius

Ricardo de Almeida Gonzaga's avatar
Ricardo de Almeida Gonzaga committed
    // The following properties must be available up the hierarchy chain
    //property real   availableWidth    ///< Width for control
    //property var    missionItem       ///< Mission Item for editor

    property real   _margin:                    ScreenTools.defaultFontPixelWidth / 2
    property real   _fieldWidth:                ScreenTools.defaultFontPixelWidth * 10.5
    property var    _vehicle:                   QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle : QGroundControl.multiVehicleManager.offlineEditingVehicle
    property real   _cameraMinTriggerInterval:  missionItem.cameraCalc.minTriggerInterval.rawValue
    function polygonCaptureStarted() {
Don Gagne's avatar
Don Gagne committed
        missionItem.clearPolygon()
Don Gagne's avatar
Don Gagne committed

    function polygonCaptureFinished(coordinates) {
        for (var i=0; i<coordinates.length; i++) {
            missionItem.addPolygonCoordinate(coordinates[i])
Don Gagne's avatar
Don Gagne committed
        }
Don Gagne's avatar
Don Gagne committed

    function polygonAdjustVertex(vertexIndex, vertexCoordinate) {
        missionItem.adjustPolygonCoordinate(vertexIndex, vertexCoordinate)
    function polygonAdjustStarted() { }
    function polygonAdjustFinished() { }

    QGCPalette { id: qgcPal; colorGroupEnabled: true }

    Column {
        id:                 editorColumn
        anchors.margins:    _margin
        anchors.top:        parent.top
        anchors.left:       parent.left
        anchors.right:      parent.right
        spacing:            _margin

Don Gagne's avatar
 
Don Gagne committed
        QGCTabBar {
            id:             tabBar
            anchors.left:   parent.left
            anchors.right:  parent.right
Don Gagne's avatar
 
Don Gagne committed
            Component.onCompleted: currentIndex = QGroundControl.settingsManager.planViewSettings.displayPresetsTabFirst.rawValue ? 2 : 0
Don Gagne's avatar
 
Don Gagne committed

            QGCTabButton { text: qsTr("Grid") }
            QGCTabButton { text: qsTr("Camera") }
            QGCTabButton { text: qsTr("Presets") }
Don Gagne's avatar
 
Don Gagne committed
        }

Don Gagne's avatar
 
Don Gagne committed
        Column {
Don Gagne's avatar
 
Don Gagne committed
            anchors.left:       parent.left
            anchors.right:      parent.right
Don Gagne's avatar
 
Don Gagne committed
            spacing:            _margin
            visible:            tabBar.currentIndex == 0
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
            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
Don Gagne's avatar
 
Don Gagne committed
            }

Don Gagne's avatar
 
Don Gagne committed
            CameraCalcGrid {
                cameraCalc:                     missionItem.cameraCalc
                vehicleFlightIsFrontal:         true
                distanceToSurfaceLabel:         qsTr("Altitude")
                distanceToSurfaceAltitudeMode:  missionItem.followTerrain ?
                                                    QGroundControl.AltitudeModeAboveTerrain :
                                                    missionItem.cameraCalc.distanceToSurfaceRelative
                frontalDistanceLabel:           qsTr("Trigger Dist")
                sideDistanceLabel:              qsTr("Spacing")
Don Gagne's avatar
 
Don Gagne committed
            }

Don Gagne's avatar
 
Don Gagne committed
            SectionHeader {
                id:     transectsHeader
                text:   qsTr("Transects")
Don Gagne's avatar
 
Don Gagne committed
            }

Don Gagne's avatar
 
Don Gagne committed
            GridLayout {
                anchors.left:   parent.left
                anchors.right:  parent.right
                columnSpacing:  _margin
                rowSpacing:     _margin
                columns:        2
                visible:        transectsHeader.checked
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
                QGCLabel { text: qsTr("Angle") }
                FactTextField {
                    fact:                   missionItem.gridAngle
                    Layout.fillWidth:       true
                    onUpdated:              angleSlider.value = missionItem.gridAngle.value
Don Gagne's avatar
 
Don Gagne committed
                }

Don Gagne's avatar
 
Don Gagne committed
                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
Don Gagne's avatar
 
Don Gagne committed
                }

Don Gagne's avatar
 
Don Gagne committed
                QGCLabel {
                    text:       qsTr("Turnaround dist")
                }
                FactTextField {
                    fact:               missionItem.turnAroundDistance
                    Layout.fillWidth:   true
                }
DonLakeFlyer's avatar
DonLakeFlyer committed
            }

Don Gagne's avatar
 
Don Gagne committed
            QGCButton {
                text:               qsTr("Rotate Entry Point")
                onClicked:          missionItem.rotateEntryPoint();
Don Gagne's avatar
 
Don Gagne committed
            }

Don Gagne's avatar
 
Don Gagne committed
            ColumnLayout {
                anchors.left:   parent.left
                anchors.right:  parent.right
                spacing:        _margin
Don Gagne's avatar
 
Don Gagne committed
                visible:        transectsHeader.checked
Don Gagne's avatar
 
Don Gagne committed
                /*
Don Gagne's avatar
 
Don Gagne committed
              Temporarily removed due to bug https://github.com/mavlink/qgroundcontrol/issues/7005
            FactCheckBox {
                text:       qsTr("Split concave polygons")
                fact:       _splitConcave
                visible:    _splitConcave.visible
                property Fact _splitConcave: missionItem.splitConcavePolygons
Don Gagne's avatar
 
Don Gagne committed
            */
Don Gagne's avatar
 
Don Gagne committed
                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)
                        }
Don Gagne's avatar
 
Don Gagne committed
                    }
Don Gagne's avatar
 
Don Gagne committed
            SectionHeader {
                id:         terrainHeader
                text:       qsTr("Terrain")
                checked:    missionItem.followTerrain
            }
Don Gagne's avatar
 
Don Gagne committed
            ColumnLayout {
                anchors.left:   parent.left
                anchors.right:  parent.right
                spacing:        _margin
Don Gagne's avatar
 
Don Gagne committed
                visible:        terrainHeader.checked
Don Gagne's avatar
 
Don Gagne committed
                QGCCheckBox {
                    id:         followsTerrainCheckBox
                    text:       qsTr("Vehicle follows terrain")
                    checked:    missionItem.followTerrain
                    onClicked:  missionItem.followTerrain = checked
Don Gagne's avatar
 
Don Gagne committed
                GridLayout {
Don Gagne's avatar
 
Don Gagne committed
                    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
                    }
Don Gagne's avatar
 
Don Gagne committed
            SectionHeader {
                id:     statsHeader
                text:   qsTr("Statistics")
            }
Don Gagne's avatar
 
Don Gagne committed
            TransectStyleComplexItemStats {
                anchors.left:   parent.left
                anchors.right:  parent.right
                visible:        statsHeader.checked
            }
Don Gagne's avatar
 
Don Gagne committed
        } // Grid Column
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
        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
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
        ColumnLayout {
Don Gagne's avatar
 
Don Gagne committed
            anchors.left:       parent.left
            anchors.right:      parent.right
            spacing:            _margin
            visible:            tabBar.currentIndex == 2

Don Gagne's avatar
 
Don Gagne committed
            QGCLabel {
                Layout.fillWidth:   true
                text:               qsTr("Presets")
                wrapMode:           Text.WordWrap
            }

Don Gagne's avatar
 
Don Gagne committed
            QGCComboBox {
                id:                 presetCombo
Don Gagne's avatar
 
Don Gagne committed
                Layout.fillWidth:   true
                model:              missionItem.presetNames
            }
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
            RowLayout {
                Layout.fillWidth:   true
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
                QGCButton {
                    Layout.fillWidth:   true
                    text:               qsTr("Apply Preset")
                    enabled:            missionItem.presetNames.length != 0
                    onClicked:          missionItem.loadPreset(presetCombo.textAt(presetCombo.currentIndex))
Don Gagne's avatar
 
Don Gagne committed
                }

Don Gagne's avatar
 
Don Gagne committed
                QGCButton {
                    Layout.fillWidth:   true
                    text:               qsTr("Delete Preset")
                    enabled:            missionItem.presetNames.length != 0
                    onClicked:          missionItem.deletePreset(presetCombo.textAt(presetCombo.currentIndex))
Don Gagne's avatar
 
Don Gagne committed
                }

Don Gagne's avatar
 
Don Gagne committed
            }
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
            Item { height: ScreenTools.defaultFontPixelHeight; width: 1 }
Don Gagne's avatar
 
Don Gagne committed

Don Gagne's avatar
 
Don Gagne committed
            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)
Don Gagne's avatar
 
Don Gagne committed
            }
Don Gagne's avatar
 
Don Gagne committed

            SectionHeader {
                id:                 presectsTransectsHeader
                anchors.left:       undefined
                anchors.right:      undefined
                Layout.fillWidth:   true
                text:               qsTr("Transects")
            }

            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
                }

                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
                }

                QGCButton {
                    Layout.columnSpan:  2
                    Layout.fillWidth:   true
                    text:               qsTr("Rotate Entry Point")
                    onClicked:          missionItem.rotateEntryPoint();
                }
            }

            SectionHeader {
                id:     presetsStatsHeader
                anchors.left:       undefined
                anchors.right:      undefined
                Layout.fillWidth:   true
                text:   qsTr("Statistics")
            }

            TransectStyleComplexItemStats {
                Layout.fillWidth:   true
                visible:            presetsStatsHeader.checked
            }
Don Gagne's avatar
 
Don Gagne committed
        } // Camera Column

        Component {
            id: savePresetDialog

            QGCViewDialog {
                function accept() {
                    if (presetNameField.text != "") {
                        missionItem.savePreset(presetNameField.text)
                        hideDialog()
                    }
                }

                ColumnLayout {
                    anchors.left:   parent.left
                    anchors.right:  parent.right
                    spacing:        ScreenTools.defaultFontPixelHeight

                    QGCLabel {
                        Layout.fillWidth:   true
                        text:               qsTr("Save the current settings as a named preset.")
                        wrapMode:           Text.WordWrap
                    }

                    QGCLabel {
                        text: qsTr("Preset Name")
                    }

                    QGCTextField {
                        id:                 presetNameField
                        Layout.fillWidth:   true
                    }
Don Gagne's avatar
 
Don Gagne committed
                }
            }
        }
    }