summaryrefslogtreecommitdiffstats
path: root/examples/multimedia/video/qmlvideo/qmlvideo/SeekControl.qml
diff options
context:
space:
mode:
Diffstat (limited to 'examples/multimedia/video/qmlvideo/qmlvideo/SeekControl.qml')
-rw-r--r--examples/multimedia/video/qmlvideo/qmlvideo/SeekControl.qml105
1 files changed, 105 insertions, 0 deletions
diff --git a/examples/multimedia/video/qmlvideo/qmlvideo/SeekControl.qml b/examples/multimedia/video/qmlvideo/qmlvideo/SeekControl.qml
new file mode 100644
index 000000000..646e5e8ef
--- /dev/null
+++ b/examples/multimedia/video/qmlvideo/qmlvideo/SeekControl.qml
@@ -0,0 +1,105 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+
+Item {
+ id: seekControl
+ height: Math.min(parent.width, parent.height) / 20
+ property int duration: 0
+ property int playPosition: 0
+ property int seekPosition: 0
+ property bool enabled: true
+ property bool seeking: false
+
+ Rectangle {
+ id: background
+ anchors.fill: parent
+ color: palette.base
+ opacity: 0.3
+ radius: parent.height / 15
+ }
+
+ Rectangle {
+ id: progressBar
+ anchors { left: parent.left; top: parent.top; bottom: parent.bottom }
+ width: seekControl.duration == 0 ? 0 : background.width * seekControl.playPosition / seekControl.duration
+ color: palette.highlight
+ opacity: 0.7
+ }
+
+ Text {
+ width: 90
+ anchors { left: parent.left; top: parent.top; bottom: parent.bottom; leftMargin: 10 }
+ horizontalAlignment: Text.AlignLeft
+ verticalAlignment: Text.AlignVCenter
+ color: palette.windowText
+ smooth: true
+ text: seekControl.formatTime(seekControl.playPosition)
+ }
+
+ Text {
+ width: 90
+ anchors { right: parent.right; top: parent.top; bottom: parent.bottom; rightMargin: 10 }
+ horizontalAlignment: Text.AlignRight
+ verticalAlignment: Text.AlignVCenter
+ color: palette.windowText
+ smooth: true
+ text: seekControl.formatTime(seekControl.duration)
+ }
+
+ Rectangle {
+ id: progressHandle
+ height: parent.height
+ width: parent.height / 2
+ color: palette.accent
+ opacity: 0.5
+ anchors.verticalCenter: progressBar.verticalCenter
+ x: seekControl.duration == 0 ? 0 : seekControl.playPosition / seekControl.duration * background.width
+
+ MouseArea {
+ id: mouseArea
+ anchors { horizontalCenter: parent.horizontalCenter; bottom: parent.bottom }
+ height: parent.height
+ width: parent.height * 2
+ enabled: seekControl.enabled
+ drag {
+ target: progressHandle
+ axis: Drag.XAxis
+ minimumX: 0
+ maximumX: background.width
+ }
+ onPressed: {
+ seekControl.seeking = true;
+ }
+ onCanceled: {
+ seekControl.seekPosition = progressHandle.x * seekControl.duration / background.width
+ seekControl.seeking = false
+ }
+ onReleased: (mouse) => {
+ seekControl.seekPosition = progressHandle.x * seekControl.duration / background.width
+ seekControl.seeking = false
+ mouse.accepted = true
+ }
+ }
+ }
+
+ Timer { // Update position also while user is dragging the progress handle
+ id: seekTimer
+ repeat: true
+ interval: 300
+ running: seekControl.seeking
+ onTriggered: {
+ seekControl.seekPosition = progressHandle.x*seekControl.duration / background.width
+ }
+ }
+
+ function formatTime(timeInMs) {
+ if (!timeInMs || timeInMs <= 0) return "0:00"
+ let seconds = timeInMs / 1000;
+ let minutes = Math.floor(seconds / 60)
+ seconds = Math.floor(seconds % 60)
+ if (seconds < 10) seconds = "0" + seconds;
+ return minutes + ":" + seconds
+ }
+}