QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
APMSubFrameComponent.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtQuick.Dialogs
4import QtQuick.Layouts
5
6import QGroundControl
7import QGroundControl.FactControls
8import QGroundControl.Controls
9
10SetupPage {
11 id: subFramePage
12 pageComponent: subFramePageComponent
13
14 property bool _oldFW: globals.activeVehicle.versionCompare(3 ,5 ,2) < 0
15 property bool _hasSensibledefaults: globals.activeVehicle.versionCompare(4 ,1 ,0) >= 0
16
17 property var frameModelSelected: undefined
18
19 APMAirframeComponentController { id: controller; }
20
21 property Fact _frameConfig: controller.getParameterFact(-1, "FRAME_CONFIG")
22
23 function setFrameConfig(frameNumber) {
24 _frameConfig.value = frameNumber
25 }
26
27 function loadFrameDefaultParameters(frameName) {
28 controller.loadParameters(subFramePage.getParametersFile(frameName))
29 }
30
31 function getParametersFile(frameName) {
32 let version = "3_5"
33
34 if (globals.activeVehicle.versionCompare(4, 0, 0) >= 0) {
35 version = "4_0_0"
36 } else if (globals.activeVehicle.versionCompare(3, 5, 4) >= 0) {
37 version = "3_5_4"
38 } else if (globals.activeVehicle.versionCompare(3, 5, 2) >= 0) {
39 version = "3_5_2"
40 }
41
42 return `Sub/${frameName}-${version}.params`
43 }
44
45 Component {
46 id: subFramePageComponent
47
48 Column {
49 id: mainColumn
50 width: availableWidth
51
52 QGCPalette { id: qgcPal; colorGroupEnabled: true }
53
54 property real _minW: ScreenTools.defaultFontPixelWidth * 30
55 property real _boxWidth: _minW
56 property real _boxSpace: ScreenTools.defaultFontPixelWidth
57
58 onWidthChanged: {
59 computeDimensions()
60 }
61
62 Component.onCompleted: computeDimensions()
63
64 function computeDimensions() {
65 var sw = 0
66 var rw = 0
67 var idx = Math.floor(mainColumn.width / (_minW + ScreenTools.defaultFontPixelWidth))
68 if(idx < 1) {
69 _boxWidth = mainColumn.width
70 _boxSpace = 0
71 } else {
72 _boxSpace = 0
73 if(idx > 1) {
74 _boxSpace = ScreenTools.defaultFontPixelWidth
75 sw = _boxSpace * (idx - 1)
76 }
77 rw = mainColumn.width - sw
78 _boxWidth = rw / idx
79 }
80 }
81
82 ListModel {
83 id: subFrameModel
84
85 ListElement {
86 name: "BlueROV1"
87 resource: "qrc:///qmlimages/Frames/BlueROV1.png"
88 paramValue: 0
89 }
90
91 ListElement {
92 name: "BlueROV2/Vectored"
93 resource: "qrc:///qmlimages/Frames/Vectored.png"
94 paramValue: 1
95 paramFileName: "bluerov2"
96 }
97
98 ListElement {
99 name: "Vectored-6DOF"
100 resource: "qrc:///qmlimages/Frames/Vectored6DOF.png"
101 paramValue: 2
102 paramFileName: "bluerov2-heavy"
103 }
104
105 ListElement {
106 name: "SimpleROV-3"
107 resource: "qrc:///qmlimages/Frames/SimpleROV-3.png"
108 paramValue: 4
109 }
110
111 ListElement {
112 name: "SimpleROV-4"
113 resource: "qrc:///qmlimages/Frames/SimpleROV-4.png"
114 paramValue: 5
115 }
116
117 ListElement {
118 name: "SimpleROV-5"
119 resource: "qrc:///qmlimages/Frames/SimpleROV-5.png"
120 paramValue: 6
121 }
122 }
123
124 Flow {
125 id: flowView
126 width: parent.width
127 spacing: _boxSpace
128
129 Repeater {
130 model: subFrameModel
131
132 Rectangle {
133 width: _boxWidth
134 height: ScreenTools.defaultFontPixelHeight * 14
135 color: qgcPal.window
136
137 QGCLabel {
138 id: title
139 text: subFrameModel.get(index).name
140 }
141
142 Rectangle {
143 anchors.topMargin: ScreenTools.defaultFontPixelHeight / 2
144 anchors.top: title.bottom
145 anchors.bottom: parent.bottom
146 anchors.left: parent.left
147 anchors.right: parent.right
148 color: subFrameModel.get(index).paramValue == _frameConfig.value ? qgcPal.buttonHighlight: qgcPal.windowShade
149
150 Image {
151 anchors.margins: ScreenTools.defaultFontPixelWidth
152 anchors.top: parent.top
153 anchors.bottom: parent.bottom
154 anchors.left: parent.left
155 anchors.right: parent.right
156 fillMode: Image.PreserveAspectFit
157 smooth: true
158 mipmap: true
159 source: subFrameModel.get(index).resource
160 }
161
162 MouseArea {
163 anchors.fill: parent
164 cursorShape: Qt.PointingHandCursor
165 onClicked: {
166 frameModelSelected = subFrameModel.get(index)
167 if (_hasSensibledefaults) {
168 // No need to suggest loading the default parameters.
169 // The firmware default should be good enough.
170 setFrameConfig(frameModelSelected.paramValue)
171 return
172 }
173 confirmFrameDialogFactory.open()
174 }
175 }
176 }
177 }
178 }// Repeater
179 }// Flow
180 } // Column
181 } // Component
182
183 QGCPopupDialogFactory {
184 id: confirmFrameDialogFactory
185
186 dialogComponent: confirmFrameComponent
187 }
188
189 Component {
190 id: confirmFrameComponent
191
192 QGCPopupDialog {
193 id: confirmFrameDialog
194 title: qsTr("Frame selection")
195 buttons: Dialog.Close
196
197 ColumnLayout {
198 QGCLabel {
199 id: applyParamsText
200 width: firstButton.width
201 wrapMode: Text.WordWrap
202 text: frameModelSelected.paramFileName != undefined ?
203 qsTr("Would you like to load the default parameters for the frame?") :
204 qsTr("Would you like to set the desired frame?")
205 }
206
207 QGCButton {
208 id: firstButton
209 Layout.fillWidth: true
210 text: qsTr("Yes, Load default parameter set for %1").arg(frameModelSelected.name)
211 visible: frameModelSelected.paramFileName != undefined
212
213 onClicked: {
214 setFrameConfig(frameModelSelected.paramValue)
215 loadFrameDefaultParameters(frameModelSelected.paramFileName)
216 confirmFrameDialog.close()
217 }
218 }
219
220 QGCButton {
221 Layout.fillWidth: true
222 text: frameModelSelected.paramFileName != undefined ?
223 qsTr("No, set frame only") :
224 qsTr("Confirm frame %1").arg(frameModelSelected.name)
225
226 onClicked: {
227 setFrameConfig(frameModelSelected.paramValue)
228 confirmFrameDialog.close()
229 }
230 }
231 }
232 }
233 }
234}