Newer
Older
import QtQuick 2.3
import QtQuick.Controls 1.2
import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0
property alias lightColors: mapPal.lightColors ///< true: use light colors from QGCMapPalette for drawing
property real xAxis: 0 ///< Value range [-1,1], negative values left stick, positive values right stick
property real yAxis: 0 ///< Value range [-1,1], negative values up stick, positive values down stick
property bool yAxisThrottle: false ///< true: yAxis used for throttle, range [1,0], positive value are stick up
property real xPositionDelta: 0 ///< Amount to move the control on x axis
property real yPositionDelta: 0 ///< Amount to move the control on y axis
property real _centerXY: width / 2
property bool _processTouchPoints: false
property bool _stickCenteredOnce: false
property real stickPositionX: _centerXY
property real stickPositionY: yAxisThrottle ? height : _centerXY
onStickPositionXChanged: {
var xAxisTemp = stickPositionX / width
xAxisTemp *= 2.0
xAxisTemp -= 1.0
xAxis = xAxisTemp
var yAxisTemp = stickPositionY / height
yAxisTemp *= 2.0
yAxisTemp -= 1.0
if (yAxisThrottle) {
yAxisTemp = ((yAxisTemp * -1.0) / 2.0) + 0.5
}
yAxis = yAxisTemp
}
function reCenter()
{
// Move control back to original position
xPositionDelta = 0
yPositionDelta = 0
if (!yAxisThrottle) {
stickPositionY = _centerXY
}
// Position the control around the initial thumb position
if (yAxisThrottle) {
yPositionDelta = touchPoints[0].y - stickPositionY
} else {
yPositionDelta = touchPoints[0].y - _centerXY
}
// We need to wait until we move the control to the right position before we process touch points
_processTouchPoints = true
Column {
QGCLabel { text: xAxis }
QGCLabel { text: yAxis }
}
Image {
anchors.fill: parent
source: lightColors ? "/res/JoystickBezel.png" : "/res/JoystickBezelLight.png"
mipmap: true
smooth: true
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
QGCColoredImage {
color: lightColors ? "white" : "black"
visible: throttle
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: height
mipmap: true
fillMode: Image.PreserveAspectFit
source: "/res/clockwise-arrow.svg"
anchors.right: parent.right
anchors.rightMargin: ScreenTools.defaultFontPixelWidth
anchors.verticalCenter: parent.verticalCenter
}
QGCColoredImage {
color: lightColors ? "white" : "black"
visible: throttle
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: height
mipmap: true
fillMode: Image.PreserveAspectFit
source: "/res/counter-clockwise-arrow.svg"
anchors.left: parent.left
anchors.leftMargin: ScreenTools.defaultFontPixelWidth
anchors.verticalCenter: parent.verticalCenter
}
QGCColoredImage {
color: lightColors ? "white" : "black"
visible: throttle
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: height
mipmap: true
fillMode: Image.PreserveAspectFit
source: "/res/chevron-up.svg"
anchors.top: parent.top
anchors.topMargin: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
}
QGCColoredImage {
color: lightColors ? "white" : "black"
visible: throttle
height: ScreenTools.defaultFontPixelHeight
width: height
sourceSize.height: height
mipmap: true
fillMode: Image.PreserveAspectFit
source: "/res/chevron-down.svg"
anchors.bottom: parent.bottom
anchors.bottomMargin: ScreenTools.defaultFontPixelWidth
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
anchors.margins: parent.width / 4
anchors.fill: parent
radius: width / 2
border.color: mapPal.thumbJoystick
border.width: 2
Rectangle {
anchors.fill: parent
radius: width / 2
border.color: mapPal.thumbJoystick
border.width: 2
Rectangle {
width: hatWidth
height: hatWidth
radius: hatWidthHalf
border.color: lightColors ? "white" : "black"
border.width: 1
x: stickPositionX - hatWidthHalf
y: stickPositionY - hatWidthHalf
readonly property real hatWidth: ScreenTools.defaultFontPixelHeight
readonly property real hatWidthHalf: ScreenTools.defaultFontPixelHeight / 2
}
Connections {
target: touchPoint
onXChanged: {
if (_processTouchPoints) {
_joyRoot.stickPositionX = Math.max(Math.min(touchPoint.x, _joyRoot.width), 0)
}
}
onYChanged: {
if (_processTouchPoints) {
_joyRoot.stickPositionY = Math.max(Math.min(touchPoint.y, _joyRoot.height), 0)
}
}
}
MultiPointTouchArea {
anchors.fill: parent
minimumTouchPoints: 1
maximumTouchPoints: 1
touchPoints: [ TouchPoint { id: touchPoint } ]
onPressed: _joyRoot.thumbDown(touchPoints)
onReleased: _joyRoot.reCenter()
}