QGCButton.qml 4.81 KB
Newer Older
1 2
import QtQuick 2.3
import QtQuick.Controls 1.2
3
import QtQuick.Controls.Styles 1.4
Don Gagne's avatar
Don Gagne committed
4 5

import QGroundControl.Palette 1.0
6
import QGroundControl.ScreenTools 1.0
Don Gagne's avatar
Don Gagne committed
7 8

Button {
9 10
    activeFocusOnPress: true

Gus Grubba's avatar
Gus Grubba committed
11 12 13 14 15 16
    property bool   primary:        false                               ///< primary button for a group of buttons
    property real   pointSize:      ScreenTools.defaultFontPointSize    ///< Point size for button text
    property bool   showBorder:     _qgcPal.globalTheme === QGCPalette.Light
    property bool   iconLeft:       false
    property real   backRadius:     0
    property real   heightFactor:   0.5
17

18 19
    property var    _qgcPal:            QGCPalette { colorGroupEnabled: enabled }
    property bool   _showHighlight:     (pressed | hovered | checked) && !__forceHoverOff
Don Gagne's avatar
Don Gagne committed
20

Don Gagne's avatar
Don Gagne committed
21 22 23 24 25
    // This fixes the issue with button hover where if a Button is near the edge oa QQuickWidget you can
    // move the mouse fast enough such that the MouseArea does not trigger an onExited. This is turn
    // cause the hover property to not be cleared correctly.

    property bool __forceHoverOff: false
Don Gagne's avatar
Don Gagne committed
26

dogmaphobic's avatar
dogmaphobic committed
27 28
    property int __lastGlobalMouseX:    0
    property int __lastGlobalMouseY:    0
29
    property int _horizontalPadding:    ScreenTools.defaultFontPixelWidth
Gus Grubba's avatar
Gus Grubba committed
30
    property int _verticalPadding:      Math.round(ScreenTools.defaultFontPixelHeight * heightFactor)
Don Gagne's avatar
Don Gagne committed
31

Don Gagne's avatar
Don Gagne committed
32 33 34
    Connections {
        target: __behavior
        onMouseXChanged: {
Don Gagne's avatar
Don Gagne committed
35 36
            __lastGlobalMouseX = ScreenTools.mouseX()
            __lastGlobalMouseY = ScreenTools.mouseY()
Don Gagne's avatar
Don Gagne committed
37 38
        }
        onMouseYChanged: {
Don Gagne's avatar
Don Gagne committed
39 40
            __lastGlobalMouseX = ScreenTools.mouseX()
            __lastGlobalMouseY = ScreenTools.mouseY()
Don Gagne's avatar
Don Gagne committed
41
        }
42 43
        onEntered: { __forceHoverOff = false; hoverTimer.start() }
        onExited: { __forceHoverOff = false; hoverTimer.stop() }
Don Gagne's avatar
Don Gagne committed
44 45 46 47 48 49 50
    }

    Timer {
        id:         hoverTimer
        interval:   250
        repeat:     true
        onTriggered: {
dogmaphobic's avatar
dogmaphobic committed
51
            __forceHoverOff = (__lastGlobalMouseX !== ScreenTools.mouseX() || __lastGlobalMouseY !== ScreenTools.mouseY());
Don Gagne's avatar
Don Gagne committed
52 53
        }
    }
54

Don Gagne's avatar
Don Gagne committed
55
    style: ButtonStyle {
56 57
            /*! The padding between the background and the label components. */
            padding {
58 59 60 61
                top:    _verticalPadding
                bottom: _verticalPadding
                left:   _horizontalPadding
                right:  _horizontalPadding
62 63 64
            }

            /*! This defines the background of the button. */
65
            background: Rectangle {
Gus Grubba's avatar
Gus Grubba committed
66
                id:             backRect
67 68
                implicitWidth:  ScreenTools.implicitButtonWidth
                implicitHeight: ScreenTools.implicitButtonHeight
Gus Grubba's avatar
Gus Grubba committed
69 70
                radius:         backRadius
                border.width:   showBorder ? 1 : 0
71 72 73 74
                border.color:   _qgcPal.buttonText
                color:          _showHighlight ?
                                    control._qgcPal.buttonHighlight :
                                    (primary ? control._qgcPal.primaryButton : control._qgcPal.button)
75 76 77 78
            }

            /*! This defines the label of the button.  */
            label: Item {
Gus Grubba's avatar
Gus Grubba committed
79 80 81
                implicitWidth:          text.implicitWidth + icon.width
                implicitHeight:         text.implicitHeight
                baselineOffset:         text.y + text.baselineOffset
82

Gus Grubba's avatar
Gus Grubba committed
83 84 85 86 87 88 89 90 91 92 93 94 95 96
                QGCColoredImage {
                    id:                     icon
                    source:                 control.iconSource
                    height:                 source === "" ? 0 : text.height
                    width:                  height
                    color:                  text.color
                    fillMode:               Image.PreserveAspectFit
                    sourceSize.height:      height
                    anchors.left:           control.iconLeft ? parent.left : undefined
                    anchors.leftMargin:     control.iconLeft ? ScreenTools.defaultFontPixelWidth : undefined
                    anchors.right:          !control.iconLeft ? parent.right : undefined
                    anchors.rightMargin:    !control.iconLeft ? ScreenTools.defaultFontPixelWidth : undefined
                    anchors.verticalCenter: parent.verticalCenter
                }
97

Gus Grubba's avatar
Gus Grubba committed
98 99 100 101 102 103 104 105 106 107
                Text {
                    id:                     text
                    anchors.centerIn:       parent
                    antialiasing:           true
                    text:                   control.text
                    font.pointSize:         pointSize
                    font.family:            ScreenTools.normalFontFamily
                    color:                  _showHighlight ?
                                                control._qgcPal.buttonHighlightText :
                                                (primary ? control._qgcPal.primaryButtonText : control._qgcPal.buttonText)
108 109
                }
            }
Don Gagne's avatar
Don Gagne committed
110 111
        }
}