Skip to content
QGCButton.qml 4.12 KiB
Newer Older
Don Gagne's avatar
Don Gagne committed
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QtQuick.Controls.Private 1.0
Don Gagne's avatar
Don Gagne committed

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

Button {
    // primary: true - this is the primary button for this group of buttons
    property bool primary: false

    property var __qgcPal: QGCPalette { colorGroupEnabled: enabled }

Don Gagne's avatar
Don Gagne committed
    property bool __showHighlight: (pressed | hovered | checked) && !__forceHoverOff
Don Gagne's avatar
Don Gagne committed

Don Gagne's avatar
Don Gagne committed
    // 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

Don Gagne's avatar
Don Gagne committed
    property int __lastGlobalMouseX: 0
    property int __lastGlobalMouseY: 0
Don Gagne's avatar
Don Gagne committed

Don Gagne's avatar
Don Gagne committed
    Connections {
        target: __behavior
        onMouseXChanged: {
Don Gagne's avatar
Don Gagne committed
            __lastGlobalMouseX = ScreenTools.mouseX()
            __lastGlobalMouseY = ScreenTools.mouseY()
Don Gagne's avatar
Don Gagne committed
        }
        onMouseYChanged: {
Don Gagne's avatar
Don Gagne committed
            __lastGlobalMouseX = ScreenTools.mouseX()
            __lastGlobalMouseY = ScreenTools.mouseY()
Don Gagne's avatar
Don Gagne committed
        }
        onEntered: { __forceHoverOff; false; hoverTimer.start() }
        onExited: { __forceHoverOff; false; hoverTimer.stop() }
    }

    Timer {
        id:         hoverTimer
        interval:   250
        repeat:     true

        onTriggered: {
Don Gagne's avatar
Don Gagne committed
            if (__lastGlobalMouseX != ScreenTools.mouseX() || __lastGlobalMouseY != ScreenTools.mouseY()) {
Don Gagne's avatar
Don Gagne committed
                __forceHoverOff = true
            } else {
                __forceHoverOff = false
Don Gagne's avatar
Don Gagne committed
            }
Don Gagne's avatar
Don Gagne committed
    style: ButtonStyle {
            /*! The padding between the background and the label components. */
            padding {
                top: 4
                left: 4
                right:  control.menu !== null ? Math.round(TextSingleton.implicitHeight * 0.5) : 4
                bottom: 4
            }

            /*! This defines the background of the button. */
            background: Item {
                property bool down: control.pressed || (control.checkable && control.checked)
                implicitWidth: Math.round(TextSingleton.implicitHeight * 4.5)
                implicitHeight: Math.max(25, Math.round(TextSingleton.implicitHeight * 1.2))

                Rectangle {
                    anchors.fill: parent
                    color: __showHighlight ?
                        control.__qgcPal.buttonHighlight :
                        (primary ? control.__qgcPal.primaryButton : control.__qgcPal.button)
                }

                Image {
                    id: imageItem
                    visible: control.menu !== null
                    source: "/qmlimages/arrow-down.png"
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.right: parent.right
                    anchors.rightMargin: padding.right
                    opacity: control.enabled ? 0.6 : 0.5
                }
            }

            /*! This defines the label of the button.  */
            label: Item {
                implicitWidth: row.implicitWidth
                implicitHeight: row.implicitHeight
                baselineOffset: row.y + text.y + text.baselineOffset

                Row {
                    id: row
                    anchors.centerIn: parent
                    spacing: 2

                    Image {
                        source: control.iconSource
                        anchors.verticalCenter: parent.verticalCenter
                    }

                    Text {
                        antialiasing:   true
                        text:           control.text
Don Gagne's avatar
Don Gagne committed
                        font.pixelSize: ScreenTools.defaultFontPixelSize
                        anchors.verticalCenter: parent.verticalCenter
                        color: __showHighlight ?
                            control.__qgcPal.buttonHighlightText :
                            (primary ? control.__qgcPal.primaryButtonText : control.__qgcPal.buttonText)
                    }
                }
            }
Don Gagne's avatar
Don Gagne committed
        }
}