diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index b1c28a17504c5169826ef83bc85c42da3d196d19..bdea8a6b9c5ea3a213407188ba74e0b7719b6eb8 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -146,6 +146,7 @@
src/FactSystem/FactControls/FactTextFieldGrid.qml
src/FactSystem/FactControls/FactTextFieldRow.qml
src/FactSystem/FactControls/FactValueSlider.qml
+ src/FactSystem/FactControls/FactTextFieldSlider.qml
src/FactSystem/FactControls/qmldir
src/FlightDisplay/FlightDisplayView.qml
src/FlightDisplay/FlightDisplayViewMap.qml
diff --git a/src/FactSystem/FactControls/FactTextFieldSlider.qml b/src/FactSystem/FactControls/FactTextFieldSlider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cf2a1e7e43ab9a41f2e43acd044e8b5f2abac7a6
--- /dev/null
+++ b/src/FactSystem/FactControls/FactTextFieldSlider.qml
@@ -0,0 +1,157 @@
+import QtQuick 2.7
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Layouts 1.2
+
+import QGroundControl.FactSystem 1.0
+import QGroundControl.Controls 1.0
+import QGroundControl.ScreenTools 1.0
+import QGroundControl.FactControls 1.0
+
+
+Row {
+ id: sliderRoot
+ width: parent.width
+
+ property Fact fact: null
+ property var _factValue: fact ? fact.value : null
+ property bool _loadComplete: false
+
+ property real _range: Math.abs(fact.max - fact.min)
+ property real _minIncrement: _range/50
+ property int precision: 2
+
+ on_FactValueChanged: {
+ slide.value = fact.value
+ }
+
+ Component.onCompleted: {
+ slide.minimumValue = fact.min
+ slide.maximumValue = fact.max
+ slide.value = fact.value
+ _loadComplete = true
+ }
+
+ // Used to find width of value string
+ QGCLabel {
+ id: textMeasure
+ visible: false
+ text: fact.value.toFixed(precision)
+ }
+
+ // Param name, value, description and slider adjustment
+ Column {
+ id: sliderColumn
+ width: parent.width
+ spacing: _margins/2
+
+ // Param name and value
+ Row {
+ spacing: _margins
+
+ QGCLabel {
+ text: fact.name
+ font.family: ScreenTools.demiboldFontFamily
+ font.pointSize: ScreenTools.defaultFontPointSize * 1.1
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ // Row container for Value: xx.xx +/- (different spacing than parent)
+ Row {
+ spacing: ScreenTools.defaultFontPixelWidth
+ anchors.verticalCenter: parent.verticalCenter
+
+ QGCLabel {
+ text: "Value: "
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ FactTextField {
+ anchors.verticalCenter: parent.verticalCenter
+ fact: sliderRoot.fact
+ showUnits: false
+ showHelp: false
+ text: fact.value.toFixed(precision)
+ width: textMeasure.width + ScreenTools.defaultFontPixelWidth*2 // Fudged, nothing else seems to work
+ }
+
+ QGCLabel {
+ text: fact.units
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ QGCButton {
+ height: parent.height
+ width: height
+ text: "-"
+ anchors.verticalCenter: parent.verticalCenter
+
+ onClicked: fact.value = Math.max(Math.min(fact.value - _minIncrement, fact.max), fact.min)
+ }
+
+ QGCButton {
+ height: parent.height
+ width: height
+ text: "+"
+ anchors.verticalCenter: parent.verticalCenter
+
+ onClicked: fact.value = Math.max(Math.min(fact.value + _minIncrement, fact.max), fact.min)
+ }
+ } // Row - container for Value: xx.xx +/- (different spacing than parent)
+ } // Row - Param name and value
+
+ QGCLabel {
+ text: fact.shortDescription
+ }
+
+ // Slider, with minimum and maximum values labeled
+ Row {
+ width: parent.width
+ spacing: _margins
+
+ QGCLabel {
+ id: minLabel
+ width: ScreenTools.defaultFontPixelWidth * 10
+ text: fact.min.toFixed(precision)
+ horizontalAlignment: Text.AlignRight
+ }
+
+ QGCSlider {
+ id: slide
+ width: parent.width - minLabel.width - maxLabel.width - _margins * 2
+ stepSize: fact.increment ? Math.max(fact.increment, _minIncrement) : _minIncrement
+ tickmarksEnabled: true
+
+ onValueChanged: {
+ if (_loadComplete) {
+ if (Math.abs(fact.value - value) >= _minIncrement) { // prevent binding loop
+ fact.value = value
+ }
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onWheel: {
+ // do nothing
+ wheel.accepted = true;
+ }
+ onPressed: {
+ // propogate/accept
+ mouse.accepted = false;
+ }
+ onReleased: {
+ // propogate/accept
+ mouse.accepted = false;
+ }
+ }
+ } // Slider
+
+ QGCLabel {
+ id: maxLabel
+ width: ScreenTools.defaultFontPixelWidth * 10
+ text: fact.max.toFixed(precision)
+ }
+ } // Row - Slider with minimum and maximum values labeled
+ } // Column - Param name, value, description and slider adjustment
+} // Row
diff --git a/src/FactSystem/FactControls/qmldir b/src/FactSystem/FactControls/qmldir
index 02efebba4da263b96e4b77562d843e954197717e..698cc920ef07e39f9426c10c6f1d8d2d76fefaac 100644
--- a/src/FactSystem/FactControls/qmldir
+++ b/src/FactSystem/FactControls/qmldir
@@ -9,3 +9,4 @@ FactTextField 1.0 FactTextField.qml
FactTextFieldGrid 1.0 FactTextFieldGrid.qml
FactTextFieldRow 1.0 FactTextFieldRow.qml
FactValueSlider 1.0 FactValueSlider.qml
+FactTextFieldSlider 1.0 FactTextFieldSlider.qml