JoystickThumbPad.qml 6.9 KB
Newer Older
1 2
import QtQuick                  2.3
import QtQuick.Controls         1.2
Don Gagne's avatar
Don Gagne committed
3 4 5 6

import QGroundControl.Palette       1.0
import QGroundControl.ScreenTools   1.0

dogmaphobic's avatar
dogmaphobic committed
7
Item {
8
    id:             _joyRoot
Don Gagne's avatar
Don Gagne committed
9

Don Gagne's avatar
Don Gagne committed
10 11 12 13 14
    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
15
    property real   yPositionDelta: 0                   ///< Amount to move the control on y axis
16
    property bool   throttle:       false
Don Gagne's avatar
Don Gagne committed
17

Don Gagne's avatar
Don Gagne committed
18 19 20 21
    property real   _centerXY:              width / 2
    property bool   _processTouchPoints:    false
    property bool   _stickCenteredOnce:     false
    property real   stickPositionX:         _centerXY
22
    property real   stickPositionY:         yAxisThrottle ? height : _centerXY
Don Gagne's avatar
Don Gagne committed
23 24 25

    QGCMapPalette { id: mapPal }

Don Gagne's avatar
Don Gagne committed
26 27
    onStickPositionXChanged: {
        var xAxisTemp = stickPositionX / width
Don Gagne's avatar
Don Gagne committed
28 29 30
        xAxisTemp *= 2.0
        xAxisTemp -= 1.0
        xAxis = xAxisTemp
Don Gagne's avatar
Don Gagne committed
31
    }
Don Gagne's avatar
Don Gagne committed
32

Don Gagne's avatar
Don Gagne committed
33
    onStickPositionYChanged: {
34
        var yAxisTemp = stickPositionY / height
Don Gagne's avatar
Don Gagne committed
35 36 37 38 39 40 41 42 43 44
        yAxisTemp *= 2.0
        yAxisTemp -= 1.0
        if (yAxisThrottle) {
            yAxisTemp = ((yAxisTemp * -1.0) / 2.0) + 0.5
        }
        yAxis = yAxisTemp
    }

    function reCenter()
    {
Don Gagne's avatar
Don Gagne committed
45
        _processTouchPoints = false
46

Don Gagne's avatar
Don Gagne committed
47 48 49
        // Move control back to original position
        xPositionDelta = 0
        yPositionDelta = 0
50

Don Gagne's avatar
Don Gagne committed
51 52
        // Center sticks
        stickPositionX = _centerXY
53 54 55
        if (!yAxisThrottle) {
            stickPositionY = _centerXY
        }
Don Gagne's avatar
Don Gagne committed
56 57 58 59
    }

    function thumbDown(touchPoints)
    {
60
        // Position the control around the initial thumb position
Don Gagne's avatar
Don Gagne committed
61
        xPositionDelta = touchPoints[0].x - _centerXY
62 63 64 65 66 67
        if (yAxisThrottle) {
            yPositionDelta = touchPoints[0].y - stickPositionY
        } else {
            yPositionDelta = touchPoints[0].y - _centerXY
        }

Don Gagne's avatar
Don Gagne committed
68 69
        // We need to wait until we move the control to the right position before we process touch points
        _processTouchPoints = true
Don Gagne's avatar
Don Gagne committed
70 71
    }

Don Gagne's avatar
Don Gagne committed
72
    /*
Don Gagne's avatar
Don Gagne committed
73
    // Keep in for debugging
Don Gagne's avatar
Don Gagne committed
74 75 76 77
    Column {
        QGCLabel { text: xAxis }
        QGCLabel { text: yAxis }
    }
Don Gagne's avatar
Don Gagne committed
78
    */
Don Gagne's avatar
Don Gagne committed
79

dogmaphobic's avatar
dogmaphobic committed
80 81 82 83 84
    Image {
        anchors.fill:       parent
        source:             lightColors ? "/res/JoystickBezel.png" : "/res/JoystickBezelLight.png"
        mipmap:             true
        smooth:             true
Don Gagne's avatar
Don Gagne committed
85 86
    }

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
    }

Don Gagne's avatar
Don Gagne committed
143 144 145 146 147 148
    Rectangle {
        anchors.margins:    parent.width / 4
        anchors.fill:       parent
        radius:             width / 2
        border.color:       mapPal.thumbJoystick
        border.width:       2
149
        color:              Qt.rgba(0,0,0,0)
Don Gagne's avatar
Don Gagne committed
150 151
    }

152 153 154 155 156
    Rectangle {
        anchors.fill:       parent
        radius:             width / 2
        border.color:       mapPal.thumbJoystick
        border.width:       2
157
        color:              Qt.rgba(0,0,0,0)
158 159
    }

Don Gagne's avatar
Don Gagne committed
160 161 162 163
    Rectangle {
        width:  hatWidth
        height: hatWidth
        radius: hatWidthHalf
164 165
        border.color: lightColors ? "white" : "black"
        border.width: 1
Don Gagne's avatar
Don Gagne committed
166
        color:  mapPal.thumbJoystick
Don Gagne's avatar
Don Gagne committed
167 168
        x:      stickPositionX - hatWidthHalf
        y:      stickPositionY - hatWidthHalf
Don Gagne's avatar
Don Gagne committed
169 170 171 172

        readonly property real hatWidth:        ScreenTools.defaultFontPixelHeight
        readonly property real hatWidthHalf:    ScreenTools.defaultFontPixelHeight / 2
    }
Don Gagne's avatar
Don Gagne committed
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

    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()
    }
Don Gagne's avatar
Don Gagne committed
198
}