nheko/resources/qml/delegates/PlayableMediaMessage.qml

174 lines
4.0 KiB
QML
Raw Normal View History

2019-10-05 23:11:20 +02:00
import QtQuick 2.6
import QtQuick.Layouts 1.2
import QtQuick.Controls 2.1
2019-10-06 00:27:18 +02:00
import QtMultimedia 5.6
2019-10-05 23:11:20 +02:00
import im.nheko 1.0
2019-10-05 23:11:20 +02:00
Rectangle {
2019-10-09 00:36:03 +02:00
id: bg
2019-10-05 23:11:20 +02:00
radius: 10
2020-04-08 23:08:43 +02:00
color: colors.dark
2020-07-25 22:10:30 +02:00
height: Math.round(content.height + 24)
2019-10-27 22:01:40 +01:00
width: parent ? parent.width : undefined
2019-10-05 23:11:20 +02:00
2019-10-09 00:36:03 +02:00
Column {
2019-10-06 00:27:18 +02:00
id: content
2019-10-05 23:11:20 +02:00
width: parent.width - 24
2019-10-06 00:27:18 +02:00
anchors.centerIn: parent
2019-10-09 00:36:03 +02:00
Rectangle {
id: videoContainer
visible: model.data.type == MtxEvent.VideoMessage
property double tempWidth: Math.min(parent ? parent.width : undefined, model.data.width < 1 ? 400 : model.data.width)
property double tempHeight: tempWidth * model.data.proportionalHeight
property double divisor: model.isReply ? 4 : 2
property bool tooHigh: tempHeight > timelineRoot.height / divisor
height: tooHigh ? timelineRoot.height / divisor : tempHeight
width: tooHigh ? (timelineRoot.height / divisor) / model.data.proportionalHeight : tempWidth
2019-10-09 00:36:03 +02:00
Image {
anchors.fill: parent
source: model.data.thumbnailUrl.replace("mxc://", "image://MxcImage/")
2019-10-09 00:36:03 +02:00
asynchronous: true
fillMode: Image.PreserveAspectFit
VideoOutput {
anchors.fill: parent
fillMode: VideoOutput.PreserveAspectFit
source: media
}
}
}
2019-10-06 00:27:18 +02:00
RowLayout {
2019-10-09 00:36:03 +02:00
width: parent.width
2019-10-06 00:27:18 +02:00
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()
2020-01-14 20:44:11 +01:00
palette: colors
2019-10-06 00:27:18 +02:00
}
Text {
id: durationText
text: "--:--:--"
color: colors.text
}
}
2019-10-05 23:11:20 +02:00
2019-10-06 00:27:18 +02:00
RowLayout {
width: parent.width
2019-10-05 23:11:20 +02:00
2019-10-06 00:27:18 +02:00
spacing: 15
2019-10-05 23:11:20 +02:00
2019-10-06 00:27:18 +02:00
Rectangle {
id: button
2020-02-03 19:21:03 +01:00
color: colors.window
2019-10-06 00:27:18 +02:00
radius: 22
height: 44
width: 44
Image {
id: img
anchors.centerIn: parent
2020-02-03 19:21:03 +01:00
z: 3
2019-10-05 23:11:20 +02:00
2020-02-03 19:21:03 +01:00
source: "image://colorimage/:/icons/icons/ui/arrow-pointing-down.png?"+colors.text
2019-10-06 00:27:18 +02:00
fillMode: Image.Pad
}
MouseArea {
anchors.fill: parent
onClicked: {
switch (button.state) {
case "": timelineManager.timeline.cacheMedia(model.data.id); break;
2019-10-06 00:27:18 +02:00
case "stopped":
media.play(); console.log("play");
2019-10-05 23:11:20 +02:00
button.state = "playing"
break
2019-10-06 00:27:18 +02:00
case "playing":
media.pause(); console.log("pause");
2019-10-05 23:11:20 +02:00
button.state = "stopped"
break
2019-10-06 00:27:18 +02:00
}
2019-10-05 23:11:20 +02:00
}
2019-10-06 00:27:18 +02:00
cursorShape: Qt.PointingHandCursor
}
MediaPlayer {
id: media
onError: console.log(errorString)
onStatusChanged: if(status == MediaPlayer.Loaded) progress.updatePositionTexts()
2019-10-09 00:36:03 +02:00
onStopped: button.state = "stopped"
2019-10-05 23:11:20 +02:00
}
2019-10-06 00:27:18 +02:00
Connections {
2019-12-03 02:26:41 +01:00
target: timelineManager.timeline
2019-10-06 00:27:18 +02:00
onMediaCached: {
if (mxcUrl == model.data.url) {
2019-10-06 00:27:18 +02:00
media.source = "file://" + cacheUrl
button.state = "stopped"
console.log("media loaded: " + mxcUrl + " at " + cacheUrl)
}
console.log("media cached: " + mxcUrl + " at " + cacheUrl)
2019-10-05 23:11:20 +02:00
}
}
2019-10-06 00:27:18 +02:00
states: [
State {
name: "stopped"
2020-02-03 19:21:03 +01:00
PropertyChanges { target: img; source: "image://colorimage/:/icons/icons/ui/play-sign.png?"+colors.text }
2019-10-06 00:27:18 +02:00
},
State {
name: "playing"
2020-02-03 19:21:03 +01:00
PropertyChanges { target: img; source: "image://colorimage/:/icons/icons/ui/pause-symbol.png?"+colors.text }
2019-10-06 00:27:18 +02:00
}
]
2019-10-05 23:11:20 +02:00
}
2019-10-06 00:27:18 +02:00
ColumnLayout {
id: col
2019-10-05 23:11:20 +02:00
2019-10-06 00:27:18 +02:00
Text {
Layout.fillWidth: true
text: model.data.body
2019-10-06 00:27:18 +02:00
textFormat: Text.PlainText
elide: Text.ElideRight
color: colors.text
}
Text {
Layout.fillWidth: true
text: model.data.filesize
2019-10-06 00:27:18 +02:00
textFormat: Text.PlainText
elide: Text.ElideRight
color: colors.text
2019-10-05 23:11:20 +02:00
}
}
}
}
}