/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/import QtQuick 2.0 Item { id: handwritingModeButton state: "unavailable" property bool floating property bool flipable readonly property real __minWidthHeight: Math.min(width, height) signal clicked() signal doubleClicked() Flipable { id: flipableImage anchors.fill: parent property bool flipped front: Image { sourceSize.width: handwritingModeButton.__minWidthHeight sourceSize.height: handwritingModeButton.__minWidthHeight smooth: false source: "qrc:/content/FloatingButton_Unavailable.svg" } back: Image { id: buttonImage sourceSize.width: handwritingModeButton.__minWidthHeight sourceSize.height: handwritingModeButton.__minWidthHeight smooth: false source: "qrc:/content/FloatingButton_Available.svg" } states: State { PropertyChanges { target: rotation; angle: 180 } when: flipableImage.flipped } transform: Rotation { id: rotation origin.x: flipableImage.width / 2 origin.y: flipableImage.height / 2 axis { x: 0; y: 1; z: 0 } angle: 0 } transitions: Transition { enabled: handwritingModeButton.flipable NumberAnimation { target: rotation; property: "angle"; duration: 400 } } } states: [ State { name: "available" PropertyChanges { target: flipableImage; flipped: true } }, State { name: "active" PropertyChanges { target: flipableImage; flipped: true } PropertyChanges { target: buttonImage; source: "qrc:/content/FloatingButton_Active.svg" } } ] function snapHorizontal() { if (!floating) return if (mouseArea.drag.maximumX > mouseArea.drag.minimumX) { if (x + 20 >= mouseArea.drag.maximumX) { anchors.left = undefined anchors.right = parent.right } else if (x - 20 <= mouseArea.drag.minimumX) { anchors.right = undefined anchors.left = parent.left } } } function snapVertical() { if (!floating) return if (mouseArea.drag.maximumY > mouseArea.drag.minimumY) { if (y + 20 >= mouseArea.drag.maximumY) { anchors.top = undefined anchors.bottom = parent.bottom } else if (y - 20 <= mouseArea.drag.minimumY) { anchors.bottom = undefined anchors.top = parent.top } } } MouseArea { id: mouseArea anchors.fill: parent drag { target: handwritingModeButton.floating ? handwritingModeButton : undefined axis: Drag.XAxis | Drag.YAxis minimumX: 0 maximumX: handwritingModeButton.parent.width - handwritingModeButton.width onMaximumXChanged: !mouseArea.drag.active && handwritingModeButton.snapHorizontal() minimumY: 0 maximumY: handwritingModeButton.parent.height - handwritingModeButton.height onMaximumYChanged: !mouseArea.drag.active && handwritingModeButton.snapVertical() } onPressed: { if (!handwritingModeButton.floating) return handwritingModeButton.anchors.left = undefined handwritingModeButton.anchors.top = undefined handwritingModeButton.anchors.right = undefined handwritingModeButton.anchors.bottom = undefined } onReleased: { handwritingModeButton.snapHorizontal() handwritingModeButton.snapVertical() } onClicked: { handwritingModeButton.snapHorizontal() handwritingModeButton.snapVertical() clickTimer.restart() } onDoubleClicked: { clickTimer.stop() handwritingModeButton.snapHorizontal() handwritingModeButton.snapVertical() handwritingModeButton.doubleClicked() } Timer { id: clickTimer interval: Qt.styleHints ? Qt.styleHints.mouseDoubleClickInterval / 3 : 0 repeat: false onTriggered: handwritingModeButton.clicked() } } }