summaryrefslogtreecommitdiffstats
path: root/qml/Viper/ProgressBar.qml
diff options
context:
space:
mode:
Diffstat (limited to 'qml/Viper/ProgressBar.qml')
-rwxr-xr-xqml/Viper/ProgressBar.qml124
1 files changed, 124 insertions, 0 deletions
diff --git a/qml/Viper/ProgressBar.qml b/qml/Viper/ProgressBar.qml
new file mode 100755
index 00000000..3d0ec228
--- /dev/null
+++ b/qml/Viper/ProgressBar.qml
@@ -0,0 +1,124 @@
+/******************************************************************************
+ Copyright (C) 2013-2016 Wang Bin <wbsecg1@gmail.com>
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+******************************************************************************/
+
+import QtQuick 2.0
+import "utils.js" as Utils
+
+Rectangle {
+ id: root
+ color: "#44eeeeee"
+ radius: Utils.scaled(5)
+ property alias value: grip.value
+ property color lineColor: "#880000ee"
+ property color gripColor: "white"
+ property real gripSize: Utils.scaled(8)
+ property real gripTolerance: Utils.scaled(3.0)
+ property real increment: 0.1
+ property bool showGrip: true
+ property bool tracking: true
+ signal valueChangedByUi
+ signal hoverAt(real value)
+ // dx, dy: only the direction. dx>0 means enter from left or leave to left
+ signal enter(point pos, point dpos)
+ signal leave(point pos, point dpos)
+
+ Rectangle {
+ anchors {
+ left: parent.left
+ verticalCenter: parent.verticalCenter
+ }
+ radius: parent.radius
+ width: grip.x + grip.radius
+ height: parent.height
+ color: displayedColor(root.lineColor)
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+
+ onClicked: {
+ if (parent.width) {
+ parent.value = mouse.x / parent.width
+ valueChangedByUi(parent.value)
+ }
+ }
+
+ onMouseXChanged: {
+ hoverAt(mouseX/parent.width)
+ }
+
+ onEntered: {
+ enter(Qt.point(mouseX, mouseY), Qt.point(0, mouseY > height/2 ? 1 : -1))
+ hoverAt(mouseX/parent.width)
+ }
+
+ onExited: {
+ leave(Qt.point(mouseX, mouseY), Qt.point(0, mouseY > height/2 ? 1 : -1))
+ }
+ }
+
+ Rectangle {
+ id: grip
+ property real value: 0
+ x: (value * parent.width - width/2)
+ anchors.verticalCenter: parent.verticalCenter
+ width: root.gripTolerance * root.gripSize
+ height: parent.height
+ radius: width/2
+ color: "transparent"
+
+ MouseArea {
+ id: mouseArea
+ enabled: root.enabled
+ anchors.fill: parent
+ drag {
+ target: grip
+ axis: Drag.XAxis
+ minimumX: -parent.width/2
+ maximumX: root.width - parent.width/2
+ }
+
+ onPositionChanged: {
+ if (drag.active)
+ updatePosition()
+ }
+
+ onReleased: {
+ updatePosition()
+ }
+
+ function updatePosition()
+ {
+ value = (grip.x + grip.width/2) / grip.parent.width
+ valueChangedByUi(value)
+ }
+ }
+
+ Rectangle {
+ anchors.centerIn: parent
+ width: root.gripSize
+ height: parent.height
+ radius: width/2
+ color: root.showGrip ? root.gripColor : "transparent"
+ }
+ }
+
+ function displayedColor(c)
+ {
+ var tint = Qt.rgba(c.r, c.g, c.b, 0.25)
+ return enabled ? c : Qt.tint(c, tint)
+ }
+}