summary refs log tree commit diff
path: root/resources
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2019-10-06 00:27:18 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2019-11-23 20:06:15 +0100
commit8a511a7862b9b6389a079afb61c9cf36c9585827 (patch)
tree02bde6e3f665f9e9c21c736daad3ea7ed4030648 /resources
parentAdd simple audio message widget (diff)
downloadnheko-8a511a7862b9b6389a079afb61c9cf36c9585827.tar.xz
Add progress bar to audio messages
Diffstat (limited to 'resources')
-rw-r--r--resources/qml/delegates/AudioMessage.qml178
1 files changed, 110 insertions, 68 deletions
diff --git a/resources/qml/delegates/AudioMessage.qml b/resources/qml/delegates/AudioMessage.qml
index f36d22b9..f4fa8f54 100644
--- a/resources/qml/delegates/AudioMessage.qml
+++ b/resources/qml/delegates/AudioMessage.qml
@@ -1,96 +1,138 @@
 import QtQuick 2.6
 import QtQuick.Layouts 1.6
-import QtMultimedia 5.12
+import QtQuick.Controls 2.5
+import QtMultimedia 5.6
 
 Rectangle {
 	radius: 10
 	color: colors.dark
-	height: row.height + 24
+	height: content.height + 24
 	width: parent.width
 
-	RowLayout {
-		id: row
-
-		anchors.centerIn: parent
+	ColumnLayout { 
+		id: content
 		width: parent.width - 24
+		anchors.centerIn: parent
+
+		RowLayout {
+			Text {
+				id: positionText
+				text: "--:--:--"
+				color: colors.text
+			}
+			Slider {
+				Layout.fillWidth: true
+				id: progress
+				value: media.position
+				from: 0
+				to: media.duration
+
+				onMoved: media.seek(value)
+				//indeterminate: true
+				function updatePositionTexts() {
+					function formatTime(date) {
+						var hh = date.getUTCHours();
+						var mm = date.getUTCMinutes();
+						var ss = date.getSeconds();
+						if (hh < 10) {hh = "0"+hh;}
+						if (mm < 10) {mm = "0"+mm;}
+						if (ss < 10) {ss = "0"+ss;}
+						return hh+":"+mm+":"+ss;
+					}
+					positionText.text = formatTime(new Date(media.position))
+					durationText.text = formatTime(new Date(media.duration))
+				}
+				onValueChanged: updatePositionTexts()
+			}
+			Text {
+				id: durationText
+				text: "--:--:--"
+				color: colors.text
+			}
+		}
 
-		spacing: 15
+		RowLayout {
+			width: parent.width
 
-		Rectangle {
-			id: button
-			color: colors.light
-			radius: 22
-			height: 44
-			width: 44
-			Image {
-				id: img
-				anchors.centerIn: parent
+			spacing: 15
 
-				source: "qrc:/icons/icons/ui/arrow-pointing-down.png"
-				fillMode: Image.Pad
+			Rectangle {
+				id: button
+				color: colors.light
+				radius: 22
+				height: 44
+				width: 44
+				Image {
+					id: img
+					anchors.centerIn: parent
 
-			}
-			MouseArea {
-				anchors.fill: parent
-				onClicked: {
-					switch (button.state) {
-						case "": timelineManager.cacheMedia(eventData.url, eventData.mimetype); break;
-						case "stopped":
-							audio.play(); console.log("play");
+					source: "qrc:/icons/icons/ui/arrow-pointing-down.png"
+					fillMode: Image.Pad
+
+				}
+				MouseArea {
+					anchors.fill: parent
+					onClicked: {
+						switch (button.state) {
+							case "": timelineManager.cacheMedia(eventData.url, eventData.mimetype); break;
+							case "stopped":
+							media.play(); console.log("play");
 							button.state = "playing"
 							break
-						case "playing":
-							audio.pause(); console.log("pause");
+							case "playing":
+							media.pause(); console.log("pause");
 							button.state = "stopped"
 							break
+						}
 					}
+					cursorShape: Qt.PointingHandCursor
+				}
+				MediaPlayer {
+					id: media
+					onError: console.log(errorString)
+					onStatusChanged: if(status == MediaPlayer.Loaded) progress.updatePositionTexts()
 				}
-				cursorShape: Qt.PointingHandCursor
-			}
-			MediaPlayer {
-				id: audio
-				onError: console.log(errorString)
-			}
 
-			Connections {
-				target: timelineManager
-				onMediaCached: {
-					if (mxcUrl == eventData.url) {
-						audio.source = "file://" + cacheUrl
-						button.state = "stopped"
-						console.log("media loaded: " + mxcUrl + " at " + cacheUrl)
+				Connections {
+					target: timelineManager
+					onMediaCached: {
+						if (mxcUrl == eventData.url) {
+							media.source = "file://" + cacheUrl
+							button.state = "stopped"
+							console.log("media loaded: " + mxcUrl + " at " + cacheUrl)
+						}
+						console.log("media cached: " + mxcUrl + " at " + cacheUrl)
 					}
-					console.log("media cached: " + mxcUrl + " at " + cacheUrl)
 				}
+
+				states: [
+					State {
+						name: "stopped"
+						PropertyChanges { target: img; source: "qrc:/icons/icons/ui/play-sign.png" }
+					},
+					State {
+						name: "playing"
+						PropertyChanges { target: img; source: "qrc:/icons/icons/ui/pause-symbol.png" }
+					}
+				]
 			}
+			ColumnLayout {
+				id: col
 
-			states: [
-				State {
-					name: "stopped"
-					PropertyChanges { target: img; source: "qrc:/icons/icons/ui/play-sign.png" }
-				},
-				State {
-					name: "playing"
-					PropertyChanges { target: img; source: "qrc:/icons/icons/ui/pause-symbol.png" }
+				Text {
+					Layout.fillWidth: true
+					text: eventData.body
+					textFormat: Text.PlainText
+					elide: Text.ElideRight
+					color: colors.text
+				}
+				Text {
+					Layout.fillWidth: true
+					text: eventData.filesize
+					textFormat: Text.PlainText
+					elide: Text.ElideRight
+					color: colors.text
 				}
-			]
-		}
-		ColumnLayout {
-			id: col
-
-			Text {
-				Layout.fillWidth: true
-				text: eventData.body
-				textFormat: Text.PlainText
-				elide: Text.ElideRight
-				color: colors.text
-			}
-			Text {
-				Layout.fillWidth: true
-				text: eventData.filesize
-				textFormat: Text.PlainText
-				elide: Text.ElideRight
-				color: colors.text
 			}
 		}
 	}