Skip to content
Snippets Groups Projects
GeoFenceEditor.qml 15.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • import QtQuick          2.3
    import QtQuick.Controls 1.2
    
    import QtQuick.Layouts  1.2
    
    
    import QGroundControl               1.0
    import QGroundControl.ScreenTools   1.0
    import QGroundControl.Controls      1.0
    
    import QGroundControl.FactSystem    1.0
    import QGroundControl.FactControls  1.0
    
    
    QGCFlickable {
        id:             root
        width:          availableWidth
    
        height:         availableHeight
        contentHeight:  editorColumn.height
    
        clip:           true
    
    
        property real   availableWidth
        property real   availableHeight
        property var    myGeoFenceController
        property var    flightMap
    
    
        readonly property real  _editFieldWidth:    Math.min(width - _margin * 2, ScreenTools.defaultFontPixelWidth * 15)
    
        readonly property real  _margin:            ScreenTools.defaultFontPixelWidth / 2
        readonly property real  _radius:            ScreenTools.defaultFontPixelWidth / 2
    
    
        Column {
            id:             editorColumn
            anchors.left:   parent.left
            anchors.right:  parent.right
    
            Rectangle {
                id:     geoFenceEditorRect
                width:  parent.width
                height: geoFenceItems.y + geoFenceItems.height + (_margin * 2)
                radius: _radius
                color:  qgcPal.missionItemEditor
    
                QGCLabel {
                    id:                 geoFenceLabel
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.top:        parent.top
                    text:               qsTr("GeoFence")
                    color:              "black"
                }
    
                Rectangle {
                    id:                 geoFenceItems
    
                    anchors.margins:    _margin
                    anchors.left:       parent.left
                    anchors.right:      parent.right
    
                    anchors.top:        geoFenceLabel.bottom
                    height:             fenceColumn.y + fenceColumn.height + (_margin * 2)
                    color:              qgcPal.windowShadeDark
                    radius:             _radius
    
                    Column {
                        id:                 fenceColumn
                        anchors.margins:    _margin
                        anchors.top:        parent.top
    
                        anchors.left:       parent.left
                        anchors.right:      parent.right
    
                        spacing:            ScreenTools.defaultFontPixelHeight / 2
    
                        QGCLabel {
                            anchors.left:       parent.left
                            anchors.right:      parent.right
                            wrapMode:           Text.WordWrap
                            font.pointSize:     myGeoFenceController.supported ? ScreenTools.smallFontPointSize : ScreenTools.defaultFontPointSize
                            text:               myGeoFenceController.supported ?
                                                    qsTr("GeoFencing allows you to set a virtual ‘fence’ around the area you want to fly in.") :
                                                    qsTr("This vehicle does not support GeoFence.")
                        }
    
                        Column {
                            anchors.left:   parent.left
                            anchors.right:  parent.right
                            spacing:        ScreenTools.defaultFontPixelHeight / 2
                            visible:        myGeoFenceController.supported
    
                            Repeater {
                                model: myGeoFenceController.params
    
                                Item {
                                    width:  fenceColumn.width
                                    height: textField.height
    
                                    property bool showCombo: modelData.enumStrings.length > 0
    
                                    QGCLabel {
                                        id:                 textFieldLabel
                                        anchors.baseline:   textField.baseline
                                        text:               myGeoFenceController.paramLabels[index]
                                    }
    
                                    FactTextField {
                                        id:             textField
                                        anchors.right:  parent.right
                                        width:          _editFieldWidth
                                        showUnits:      true
                                        fact:           modelData
                                        visible:        !parent.showCombo
                                    }
    
                                    FactComboBox {
                                        id:             comboField
                                        anchors.right:  parent.right
                                        width:          _editFieldWidth
                                        indexModel:     false
                                        fact:           showCombo ? modelData : _nullFact
                                        visible:        parent.showCombo
    
                                        property var _nullFact: Fact { }
                                    }
                                }
                            }
    
                            SectionHeader {
                                id:     insertSection
                                text:   qsTr("Insert GeoFence")
    
                            QGCButton {
                                anchors.left:   parent.left
    
                                anchors.right:  parent.right
    
                                text:           qsTr("Polygon Fence")
    
                                onClicked: {
                                    var rect = Qt.rect(flightMap.centerViewport.x, flightMap.centerViewport.y, flightMap.centerViewport.width, flightMap.centerViewport.height)
                                    var topLeftCoord = flightMap.toCoordinate(Qt.point(rect.x, rect.y), false /* clipToViewPort */)
                                    var bottomRightCoord = flightMap.toCoordinate(Qt.point(rect.x + rect.width, rect.y + rect.height), false /* clipToViewPort */)
                                    myGeoFenceController.addInclusionPolygon(topLeftCoord, bottomRightCoord)
                                }
    
                            QGCButton {
                                anchors.left:   parent.left
    
                                anchors.right:  parent.right
    
                                text:           qsTr("Circular Fence")
    
                                onClicked: {
                                    var rect = Qt.rect(flightMap.centerViewport.x, flightMap.centerViewport.y, flightMap.centerViewport.width, flightMap.centerViewport.height)
                                    var topLeftCoord = flightMap.toCoordinate(Qt.point(rect.x, rect.y), false /* clipToViewPort */)
                                    var bottomRightCoord = flightMap.toCoordinate(Qt.point(rect.x + rect.width, rect.y + rect.height), false /* clipToViewPort */)
                                    myGeoFenceController.addInclusionCircle(topLeftCoord, bottomRightCoord)
                                }
    
                            SectionHeader {
                                id:     polygonSection
                                text:   qsTr("Polygon Fences")
                            }
    
                            QGCLabel {
                                text:       qsTr("None")
                                visible:    polygonSection.checked && myGeoFenceController.polygons.count == 0
                            }
    
                            GridLayout {
                                anchors.left:   parent.left
                                anchors.right:  parent.right
                                columns:        3
                                flow:           GridLayout.TopToBottom
                                visible:        polygonSection.checked && myGeoFenceController.polygons.count > 0
    
                                QGCLabel {
                                    text:               qsTr("Inclusion")
                                    Layout.column:      0
                                    Layout.alignment:   Qt.AlignHCenter
                                }
    
                                Repeater {
                                    model: myGeoFenceController.polygons
    
                                    QGCCheckBox {
                                        checked:            object.inclusion
                                        onClicked:          object.inclusion = checked
                                        Layout.alignment:   Qt.AlignHCenter
                                    }
                                }
    
                                QGCLabel {
                                    text:               qsTr("Edit")
                                    Layout.column:      1
                                    Layout.alignment:   Qt.AlignHCenter
                                }
    
                                Repeater {
                                    model: myGeoFenceController.polygons
    
                                    QGCRadioButton {
                                        checked:            _interactive
                                        Layout.alignment:   Qt.AlignHCenter
    
                                        property bool _interactive: object.interactive
    
                                        on_InteractiveChanged: checked = _interactive
    
                                        onClicked: {
                                            myGeoFenceController.clearAllInteractive()
                                            object.interactive = checked
                                        }
                                    }
                                }
    
                                QGCLabel {
                                    text:               qsTr("Delete")
                                    Layout.column:      2
                                    Layout.alignment:   Qt.AlignHCenter
                                }
    
                                Repeater {
                                    model: myGeoFenceController.polygons
    
                                    QGCColoredImage {
                                        width:              ScreenTools.defaultFontPixelHeight
                                        height:             width
                                        sourceSize.height:  width
                                        source:             "/res/XDelete.svg"
                                        fillMode:           Image.PreserveAspectFit
                                        color:              qgcPal.text
                                        Layout.alignment:   Qt.AlignHCenter
    
                                        property int _polygonIndex: index
    
                                        QGCMouseArea {
                                            fillItem:   parent
                                            onClicked:  myGeoFenceController.deletePolygon(parent._polygonIndex)
                                        }
                                    }
                                }
                            } // GridLayout
    
                            SectionHeader {
                                id:     circleSection
                                text:   qsTr("Circular Fences")
                            }
    
                            QGCLabel {
                                text:       qsTr("None")
                                visible:    circleSection.checked && myGeoFenceController.circles.count == 0
                            }
    
                            GridLayout {
                                anchors.left:   parent.left
                                anchors.right:  parent.right
                                columns:        4
                                flow:           GridLayout.TopToBottom
                                visible:        polygonSection.checked && myGeoFenceController.circles.count > 0
    
                                QGCLabel {
                                    text:               qsTr("Inclusion")
                                    Layout.column:      0
                                    Layout.alignment:   Qt.AlignHCenter
                                }
    
                                Repeater {
                                    model: myGeoFenceController.circles
    
                                    QGCCheckBox {
                                        checked:            object.inclusion
                                        onClicked:          object.inclusion = checked
                                        Layout.alignment:   Qt.AlignHCenter
                                    }
                                }
    
                                QGCLabel {
                                    text:               qsTr("Edit")
                                    Layout.column:      1
                                    Layout.alignment:   Qt.AlignHCenter
                                }
    
                                Repeater {
                                    model: myGeoFenceController.circles
    
                                    QGCRadioButton {
                                        checked:            _interactive
                                        Layout.alignment:   Qt.AlignHCenter
    
                                        property bool _interactive: object.interactive
    
                                        on_InteractiveChanged: checked = _interactive
    
                                        onClicked: {
                                            myGeoFenceController.clearAllInteractive()
                                            object.interactive = checked
                                        }
                                    }
                                }
    
                                QGCLabel {
                                    text:               qsTr("Radius")
                                    Layout.column:      2
                                    Layout.alignment:   Qt.AlignHCenter
                                }
    
                                Repeater {
                                    model: myGeoFenceController.circles
    
                                    FactTextField {
                                        fact:               object.radius
                                        Layout.fillWidth:   true
                                        Layout.alignment:   Qt.AlignHCenter
                                    }
                                }
    
                                QGCLabel {
                                    text:               qsTr("Delete")
                                    Layout.column:      3
                                    Layout.alignment:   Qt.AlignHCenter
                                }
    
                                Repeater {
                                    model: myGeoFenceController.circles
    
                                    QGCColoredImage {
                                        width:              ScreenTools.defaultFontPixelHeight
                                        height:             width
                                        sourceSize.height:  width
                                        source:             "/res/XDelete.svg"
                                        fillMode:           Image.PreserveAspectFit
                                        color:              qgcPal.text
                                        Layout.alignment:   Qt.AlignHCenter
    
                                        property int _circleIndex: index
    
                                        QGCMouseArea {
                                            fillItem:   parent
                                            onClicked:  myGeoFenceController.deleteCircle(parent._polygonIndex)
                                        }
                                    }
                                }
                            } // GridLayout
                        }