diff options
Diffstat (limited to 'qml/Viper/ProgressBar.qml')
-rwxr-xr-x | qml/Viper/ProgressBar.qml | 124 |
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) + } +} |