MissionItemEditor.qml 11.4 KB
Newer Older
1
2
3
4
5
import QtQuick                      2.11
import QtQuick.Controls             2.4
import QtQuick.Controls.Styles      1.4
import QtQuick.Dialogs              1.2
import QtQml                        2.2
DonLakeFlyer's avatar
   
DonLakeFlyer committed
6
import QtQuick.Layouts              1.11
Don Gagne's avatar
Don Gagne committed
7

8
import QGroundControl               1.0
Don Gagne's avatar
Don Gagne committed
9
10
import QGroundControl.ScreenTools   1.0
import QGroundControl.Vehicle       1.0
Don Gagne's avatar
Don Gagne committed
11
12
import QGroundControl.Controls      1.0
import QGroundControl.FactControls  1.0
Don Gagne's avatar
Don Gagne committed
13
14
import QGroundControl.Palette       1.0

Don Gagne's avatar
Don Gagne committed
15
16
17

/// Mission item edit control
Rectangle {
DonLakeFlyer's avatar
   
DonLakeFlyer committed
18
19
20
21
22
23
24
    id:             _root
    height:         editorLoader.visible ? (editorLoader.y + editorLoader.height + (_margin * 2)) : (commandPicker.y + commandPicker.height + _margin / 2)
    color:          _currentItem ? qgcPal.missionItemEditor : qgcPal.windowShade
    radius:         _radius
    opacity:        _currentItem ? 1.0 : 0.7
    border.width:   _readyForSave ? 0 : 1
    border.color:   qgcPal.warningText
25

26
    property var    map                 ///< Map control
27
    property var    masterController
28
29
    property var    missionItem         ///< MissionItem associated with this editor
    property bool   readOnly            ///< true: read only view, false: full editing view
Don Gagne's avatar
Don Gagne committed
30

Don Gagne's avatar
Don Gagne committed
31
32
    signal clicked
    signal remove
DonLakeFlyer's avatar
   
DonLakeFlyer committed
33
    signal selectNextNotReadyItem
Don Gagne's avatar
Don Gagne committed
34

35
36
    property var    _masterController:          masterController
    property var    _missionController:         _masterController.missionController
37
38
39
40
    property bool   _currentItem:               missionItem.isCurrentItem
    property color  _outerTextColor:            _currentItem ? qgcPal.primaryButtonText : qgcPal.text
    property bool   _noMissionItemsAdded:       ListView.view.model.count === 1
    property real   _sectionSpacer:             ScreenTools.defaultFontPixelWidth / 2  // spacing between section headings
41
    property bool   _singleComplexItem:         _missionController.complexMissionItemNames.length === 1
DonLakeFlyer's avatar
   
DonLakeFlyer committed
42
    property bool   _readyForSave:              missionItem.readyForSaveState === VisualMissionItem.ReadyForSave
DonLakeFlyer's avatar
   
DonLakeFlyer committed
43
    property var    _activeVehicle:             QGroundControl.multiVehicleManager.activeVehicle
Don Gagne's avatar
Don Gagne committed
44

45
    readonly property real  _editFieldWidth:    Math.min(width - _margin * 2, ScreenTools.defaultFontPixelWidth * 12)
46
47
    readonly property real  _margin:            ScreenTools.defaultFontPixelWidth / 2
    readonly property real  _radius:            ScreenTools.defaultFontPixelWidth / 2
48
    readonly property real  _hamburgerSize:     commandPicker.height * 0.75
49
    readonly property real  _trashSize:     commandPicker.height * 0.75
50
    readonly property bool  _waypointsOnlyMode: QGroundControl.corePlugin.options.missionWaypointsOnly
51

Don Gagne's avatar
Don Gagne committed
52
53
54
    QGCPalette {
        id: qgcPal
        colorGroupEnabled: enabled
Don Gagne's avatar
Don Gagne committed
55
56
    }

57
58
    FocusScope {
        id:             currentItemScope
59
        anchors.fill:   parent
60
61
62
63
64
65
66
67

        MouseArea {
            anchors.fill:   parent
            onClicked: {
                currentItemScope.focus = true
                _root.clicked()
            }
        }
68
69
    }

70
71
72
73
74
75
76
77
78
    Component {
        id: editPositionDialog

        EditPositionDialog {
            coordinate: missionItem.coordinate
            onCoordinateChanged: missionItem.coordinate = coordinate
        }
    }

DonLakeFlyer's avatar
   
DonLakeFlyer committed
79
    Rectangle {
DonLakeFlyer's avatar
   
DonLakeFlyer committed
80
81
        id:                     notReadyForSaveIndicator
        anchors.verticalCenter: notReadyForSaveLabel.visible ? notReadyForSaveLabel.verticalCenter : commandPicker.verticalCenter
82
83
        anchors.leftMargin:     _margin
        anchors.left:           parent.left
DonLakeFlyer's avatar
   
DonLakeFlyer committed
84
85
86
        width:                  readyForSaveLabel.contentHeight
        height:                 width
        border.width:           1
DonLakeFlyer's avatar
   
DonLakeFlyer committed
87
        border.color:           qgcPal.warningText
DonLakeFlyer's avatar
   
DonLakeFlyer committed
88
89
        color:                  "white"
        radius:                 width / 2
DonLakeFlyer's avatar
   
DonLakeFlyer committed
90
        visible:                !_readyForSave
DonLakeFlyer's avatar
   
DonLakeFlyer committed
91
92
93
94
95
96

        QGCLabel {
            id:                 readyForSaveLabel
            anchors.centerIn:   parent
            //: Indicator in Plan view to show mission item is not ready for save/send
            text:               qsTr("?")
DonLakeFlyer's avatar
   
DonLakeFlyer committed
97
            color:              qgcPal.warningText
DonLakeFlyer's avatar
   
DonLakeFlyer committed
98
99
100
            font.pointSize:     ScreenTools.smallFontPointSize
        }
    }
101

DonLakeFlyer's avatar
   
DonLakeFlyer committed
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
    QGCLabel {
        id:                     notReadyForSaveLabel
        anchors.margins:        _margin
        anchors.left:           notReadyForSaveIndicator.right
        anchors.right:          parent.right
        anchors.top:            commandPicker.bottom
        visible:                _currentItem && !_readyForSave
        text:                   missionItem.readyForSaveState === VisualMissionItem.NotReadyForSaveTerrain ?
                                    qsTr("Incomplete: Waiting on terrain data.") :
                                    qsTr("Incomplete: Item not fully specified.")
        wrapMode:               Text.WordWrap
        horizontalAlignment:    Text.AlignHCenter
        color:                  qgcPal.warningText
    }

Gus Grubba's avatar
Gus Grubba committed
117
    QGCColoredImage {
118
119
120
121
        id:                     hamburger
        anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
        anchors.right:          parent.right
        anchors.verticalCenter: commandPicker.verticalCenter
122
123
124
        width:                  _hamburgerSize
        height:                 _hamburgerSize
        sourceSize.height:      _hamburgerSize
125
        source:                 "qrc:/qmlimages/Hamburger.svg"
Gus Grubba's avatar
Gus Grubba committed
126
        visible:                missionItem.isCurrentItem && missionItem.sequenceNumber !== 0
Don Gagne's avatar
   
Don Gagne committed
127
        color:                  qgcPal.text
Don Gagne's avatar
Don Gagne committed
128
    }
129

130
    QGCMouseArea {
DonLakeFlyer's avatar
DonLakeFlyer committed
131
132
        fillItem:   hamburger
        visible:    hamburger.visible
133
134
        onClicked: {
            currentItemScope.focus = true
DonLakeFlyer's avatar
DonLakeFlyer committed
135
            hamburgerMenu.popup()
136
        }
Don Gagne's avatar
Don Gagne committed
137

Gus Grubba's avatar
Gus Grubba committed
138
        QGCMenu {
DonLakeFlyer's avatar
DonLakeFlyer committed
139
            id: hamburgerMenu
Don Gagne's avatar
Don Gagne committed
140

DonLakeFlyer's avatar
   
DonLakeFlyer committed
141
142
143
144
145
146
147
148
149
150
151
152
153
            QGCMenuItem {
                text:           qsTr("Move to vehicle position")
                visible:        missionItem.specifiesCoordinate
                enabled:        _activeVehicle
                onTriggered:    missionItem.coordinate = _activeVehicle.coordinate
            }

            QGCMenuItem {
                text:           qsTr("Move to previous item position")
                visible:        _missionController.previousCoordinate.isValid
                onTriggered:    missionItem.coordinate = _missionController.previousCoordinate
            }

Gus Grubba's avatar
Gus Grubba committed
154
            QGCMenuItem {
155
156
                text:           qsTr("Edit position...")
                visible:        missionItem.specifiesCoordinate
Gus Grubba's avatar
Gus Grubba committed
157
                onTriggered:    mainWindow.showComponentDialog(editPositionDialog, qsTr("Edit Position"), mainWindow.showDialogDefaultWidth, StandardButton.Close)
158
159
            }

Gus Grubba's avatar
Gus Grubba committed
160
            QGCMenuSeparator {
161
                visible: missionItem.isSimpleItem && !_waypointsOnlyMode
Don Gagne's avatar
Don Gagne committed
162
            }
163

Gus Grubba's avatar
Gus Grubba committed
164
            QGCMenuItem {
Don Gagne's avatar
Don Gagne committed
165
166
167
                text:       qsTr("Show all values")
                checkable:  true
                checked:    missionItem.isSimpleItem ? missionItem.rawEdit : false
168
                visible:    missionItem.isSimpleItem && !_waypointsOnlyMode
169

Don Gagne's avatar
Don Gagne committed
170
171
172
173
                onTriggered:    {
                    if (missionItem.rawEdit) {
                        if (missionItem.friendlyEditAllowed) {
                            missionItem.rawEdit = false
174
                        } else {
175
                            mainWindow.showMessageDialog(qsTr("Mission Edit"), qsTr("You have made changes to the mission item which cannot be shown in Simple Mode"))
176
                        }
Don Gagne's avatar
Don Gagne committed
177
178
                    } else {
                        missionItem.rawEdit = true
179
                    }
Don Gagne's avatar
Don Gagne committed
180
                    checked = missionItem.rawEdit
181
182
                }
            }
Don Gagne's avatar
   
Don Gagne committed
183
184
185
186
187

            QGCMenuItem {
                text:       qsTr("Item #%1").arg(missionItem.sequenceNumber)
                enabled:    false
            }
188
189
190
        }
    }

DonLakeFlyer's avatar
   
DonLakeFlyer committed
191
192
193
    QGCColoredImage {
        id:                     deleteButton
        anchors.margins:        _margin
Don Gagne's avatar
   
Don Gagne committed
194
        anchors.left:           parent.left
DonLakeFlyer's avatar
   
DonLakeFlyer committed
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
        anchors.verticalCenter: commandPicker.verticalCenter
        height:                 _hamburgerSize
        width:                  height
        sourceSize.height:      height
        fillMode:               Image.PreserveAspectFit
        mipmap:                 true
        smooth:                 true
        color:                  qgcPal.text
        visible:                _currentItem && missionItem.sequenceNumber !== 0
        source:                 "/res/TrashDelete.svg"

        QGCMouseArea {
            fillItem:   parent
            onClicked:  remove()
        }
    }

    Rectangle {
        id:                 commandPicker
        anchors.margins:    _margin
        anchors.left:       deleteButton.right
        anchors.top:        parent.top
        height:             ScreenTools.implicitComboBoxHeight
        width:              innerLayout.x + innerLayout.width + ScreenTools.comboBoxPadding
        visible:            !commandLabel.visible
        color:              qgcPal.window
        border.width:       1
        border.color:       qgcPal.text

        RowLayout {
DonLakeFlyer's avatar
   
DonLakeFlyer committed
225
226
227
228
229
            id:                     innerLayout
            anchors.margins:        _padding
            anchors.left:           parent.left
            anchors.verticalCenter: parent.verticalCenter
            spacing:                _padding
DonLakeFlyer's avatar
   
DonLakeFlyer committed
230
231
232
233
234
235

            property real _padding: ScreenTools.comboBoxPadding

            QGCLabel { text: missionItem.commandName }

            QGCColoredImage {
DonLakeFlyer's avatar
   
DonLakeFlyer committed
236
                height:             ScreenTools.defaultFontPixelWidth
DonLakeFlyer's avatar
   
DonLakeFlyer committed
237
238
239
240
241
                width:              height
                fillMode:           Image.PreserveAspectFit
                smooth:             true
                antialiasing:       true
                color:              qgcPal.text
DonLakeFlyer's avatar
   
DonLakeFlyer committed
242
                source:             "/qmlimages/arrow-down.png"
DonLakeFlyer's avatar
   
DonLakeFlyer committed
243
244
245
246
247
248
249
            }
        }

        QGCMouseArea {
            fillItem:   parent
            onClicked:  mainWindow.showComponentDialog(commandDialog, qsTr("Select Mission Command"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel)
        }
250
251
252
253
254

        Component {
            id: commandDialog

            MissionCommandDialog {
DonLakeFlyer's avatar
   
DonLakeFlyer committed
255
256
                missionItem:                _root.missionItem
                map:                        _root.map
DonLakeFlyer's avatar
   
DonLakeFlyer committed
257
258
                // FIXME: Disabling fly through commands doesn't work since you may need to change from an RTL to something else
                flyThroughCommandsAllowed:  true //_missionController.flyThroughCommandsAllowed
259
260
261
262
263
264
            }
        }

    }

    QGCLabel {
Don Gagne's avatar
   
Don Gagne committed
265
        id:                     commandLabel
DonLakeFlyer's avatar
   
DonLakeFlyer committed
266
        anchors.leftMargin:     ScreenTools.comboBoxPadding
Don Gagne's avatar
   
Don Gagne committed
267
        anchors.fill:           commandPicker
DonLakeFlyer's avatar
   
DonLakeFlyer committed
268
        visible:                !missionItem.isCurrentItem || !missionItem.isSimpleItem || _waypointsOnlyMode || missionItem.isTakeoffItem
Don Gagne's avatar
   
Don Gagne committed
269
270
271
        verticalAlignment:      Text.AlignVCenter
        text:                   missionItem.commandName
        color:                  _outerTextColor
272
273
274
275
    }

    Loader {
        id:                 editorLoader
DonLakeFlyer's avatar
   
DonLakeFlyer committed
276
        anchors.margins:    _margin
277
        anchors.left:       parent.left
DonLakeFlyer's avatar
   
DonLakeFlyer committed
278
        anchors.top:        _readyForSave ? commandPicker.bottom : notReadyForSaveLabel.bottom
DonLakeFlyer's avatar
DonLakeFlyer committed
279
        source:             missionItem.editorQml
280
        visible:            _currentItem
281

282
283
284
        property var    masterController:   _masterController
        property real   availableWidth:     _root.width - (_margin * 2) ///< How wide the editor should be
        property var    editorRoot:         _root
285
    }
Don Gagne's avatar
Don Gagne committed
286
} // Rectangle