QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
FactTextFieldSlider.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtQuick.Layouts
4
5import QGroundControl
6import QGroundControl.Controls
7import QGroundControl.FactControls
8
9/// Fact-bound text field with an optional slider and enable/disable checkbox.
10/// The slider range is determined by (in priority order): explicit sliderMin/Max,
11/// fact.userMin/Max, or fact.min/max when allowUsingMinMax is true.
12Rectangle {
13 property string label
14 property alias fact: factTextField.fact
15 property alias textFieldPreferredWidth: factTextField.textFieldPreferredWidth
16 property alias textFieldUnitsLabel: factTextField.textFieldUnitsLabel
17 property alias textFieldShowUnits: factTextField.textFieldShowUnits
18 property alias textFieldShowHelp: factTextField.textFieldShowHelp
19 property alias textField: factTextField
20 property alias enableCheckBoxChecked: enableCheckbox.checked
21 property bool warnOnUserMinMaxInvalid: true ///< true: warn if userMin/userMax are invalid, false: no warning
22
23 property bool showEnableCheckbox: false ///< true: show enable/disable checkbox, false: hide
24 property bool allowUsingMinMax: false ///< true: fall back to fact.min/max when userMin/Max not set
25 property var sliderMin: undefined ///< explicit slider minimum, overrides fact.userMin/min
26 property var sliderMax: undefined ///< explicit slider maximum, overrides fact.userMax/max
27 property color backgroundColor: _ftfsBackgroundColor
28
29 signal enableCheckboxClicked
30
31 id: control
32 implicitHeight: mainLayout.implicitHeight
33 color: backgroundColor
34 radius: ScreenTools.defaultBorderRadius
35
36 property bool _loadComplete: false
37 property bool _showSlider: _sliderMin !== undefined && _sliderMax !== undefined
38 property color _ftfsBackgroundColor: Qt.rgba(qgcPal.windowShadeLight.r, qgcPal.windowShadeLight.g, qgcPal.windowShadeLight.b, 0.2)
39 property var _sliderMin: sliderMin !== undefined ? sliderMin : (fact.userMin !== undefined ? fact.userMin : (allowUsingMinMax ? fact.min : undefined))
40 property var _sliderMax: sliderMax !== undefined ? sliderMax : (fact.userMax !== undefined ? fact.userMax : (allowUsingMinMax ? fact.max : undefined))
41
42 function updateSliderToClampedValue() {
43 if (_showSlider && sliderLoader.item) {
44 let clampedSliderValue = control.fact.value
45 if (clampedSliderValue > control._sliderMax) {
46 clampedSliderValue = control._sliderMax
47 } else if (clampedSliderValue < control._sliderMin) {
48 clampedSliderValue = control._sliderMin
49 }
50 sliderLoader.item.value = clampedSliderValue
51 }
52 }
53
54 Component.onCompleted: {
55 _loadComplete = true
56 if (warnOnUserMinMaxInvalid && !allowUsingMinMax && sliderMin === undefined && sliderMax === undefined && (fact.userMin === undefined || fact.userMax === undefined)) {
57 console.warn("FactTextFieldSlider: userMin/userMax not set for", fact.name)
58 }
59 }
60
61 Connections {
62 target: control.fact
63
64 function onValueChanged() {
65 control.updateSliderToClampedValue()
66 }
67 }
68
69 QGCPalette { id: qgcPal; colorGroupEnabled: true }
70
71 ColumnLayout {
72 id: mainLayout
73 width: parent.width
74 spacing: 0
75
76 RowLayout {
77 spacing: ScreenTools.defaultFontPixelWidth
78
79 QGCCheckBox {
80 id: enableCheckbox
81 Layout.fillWidth: visible
82 text: control.label
83 visible: control.showEnableCheckbox
84
85 onClicked: control.enableCheckboxClicked()
86 }
87
88 LabelledFactTextField {
89 id: factTextField
90 Layout.fillWidth: !control.showEnableCheckbox
91 label: control.showEnableCheckbox ? "" : control.label
92 fact: control.fact
93 enabled: !control.showEnableCheckbox || enableCheckbox.checked
94 }
95 }
96
97 Loader {
98 id: sliderLoader
99 Layout.fillWidth: true
100 sourceComponent: control._showSlider ? sliderComponent : null
101 enabled: !control.showEnableCheckbox || enableCheckbox.checked
102
103 onLoaded: control.updateSliderToClampedValue()
104 }
105
106 Component {
107 id: sliderComponent
108
109 QGCSlider {
110 id: slider
111 Layout.fillWidth: true
112 from: control._sliderMin
113 to: control._sliderMax
114 showBoundaryValues: true
115
116 onMoved: {
117 if (control._loadComplete) {
118 control.fact.value = slider.value
119 }
120 }
121 }
122 }
123 }
124}