matrixion/resources/qml/delegates/PlayableMediaMessage.qml

113 lines
3.4 KiB
QML
Raw Normal View History

2021-03-05 02:35:15 +03:00
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
//
2021-03-05 02:35:15 +03:00
// SPDX-License-Identifier: GPL-3.0-or-later
2021-03-27 03:17:58 +03:00
import "../"
import "../ui/media"
import QtMultimedia 5.15
import QtQuick 2.15
import QtQuick.Controls 2.15
2021-11-11 08:16:25 +03:00
import QtQuick.Layouts 1.15
import im.nheko 1.0
2021-11-11 21:18:45 +03:00
Item {
2021-11-10 06:17:00 +03:00
id: content
required property double proportionalHeight
required property int type
required property int originalWidth
required property string thumbnailUrl
required property string eventId
required property string url
required property string body
required property string filesize
2021-11-11 23:32:38 +03:00
property double divisor: isReply ? 4 : 2
2022-02-14 16:03:17 +03:00
property int tempWidth: originalWidth < 1? 400: originalWidth
implicitWidth: type == MtxEvent.VideoMessage ? Math.round(tempWidth*Math.min((timelineView.height/divisor)/(tempWidth*proportionalHeight), 1)) : 500
2022-02-14 23:07:03 +03:00
width: Math.min(parent.width, implicitWidth)
height: (type == MtxEvent.VideoMessage ? width*proportionalHeight : 80) + fileInfoLabel.height
2022-02-09 23:36:04 +03:00
implicitHeight: height
2021-11-10 06:17:00 +03:00
2022-02-14 23:07:03 +03:00
property int metadataWidth
property bool fitsMetadata: (parent.width - fileInfoLabel.width) > metadataWidth+4
MxcMedia {
id: mxcmedia
2021-11-10 06:17:00 +03:00
2021-07-19 21:11:03 +03:00
// TODO: Show error in overlay or so?
onError: console.log(error)
roomm: room
2021-11-10 06:17:00 +03:00
// desiredVolume is a float from 0.0 -> 1.0, MediaPlayer volume is an int from 0 to 100
// this value automatically gets clamped for us between these two values.
volume: mediaControls.desiredVolume * 100
muted: mediaControls.muted
2021-07-19 21:11:03 +03:00
}
2021-07-19 21:11:03 +03:00
Rectangle {
id: videoContainer
2021-11-11 23:32:38 +03:00
2021-11-10 07:52:59 +03:00
color: type == MtxEvent.VideoMessage ? Nheko.colors.window : "transparent"
2021-11-11 21:18:45 +03:00
width: parent.width
height: parent.height - fileInfoLabel.height
2021-11-11 23:32:38 +03:00
TapHandler {
onTapped: Settings.openVideoExternal ? room.openMedia(eventId) : mediaControls.showControls()
2021-11-11 23:32:38 +03:00
}
2021-11-09 03:18:11 +03:00
2021-07-19 21:11:03 +03:00
Image {
anchors.fill: parent
source: thumbnailUrl.replace("mxc://", "image://MxcImage/") + "?scale"
2021-07-19 21:11:03 +03:00
asynchronous: true
fillMode: Image.PreserveAspectFit
2021-11-10 06:17:00 +03:00
2021-07-19 21:11:03 +03:00
VideoOutput {
id: videoOutput
2021-11-10 07:52:59 +03:00
visible: type == MtxEvent.VideoMessage
2021-07-19 21:11:03 +03:00
clip: true
anchors.fill: parent
fillMode: VideoOutput.PreserveAspectFit
source: mxcmedia
flushMode: VideoOutput.FirstFrame
orientation: mxcmedia.orientation
}
2021-11-11 21:18:45 +03:00
}
}
2021-11-11 23:32:38 +03:00
MediaControls {
id: mediaControls
anchors.left: content.left
anchors.right: content.right
anchors.bottom: fileInfoLabel.top
playingVideo: type == MtxEvent.VideoMessage
positionValue: mxcmedia.position
duration: mxcmedia.duration
mediaLoaded: mxcmedia.loaded
mediaState: mxcmedia.state
onPositionChanged: mxcmedia.position = position
onPlayPauseActivated: mxcmedia.state == MediaPlayer.PlayingState ? mxcmedia.pause() : mxcmedia.play()
onLoadActivated: mxcmedia.eventId = eventId
}
2021-11-10 06:17:00 +03:00
2021-11-10 07:52:59 +03:00
// information about file name and file size
2021-11-10 06:17:00 +03:00
Label {
id: fileInfoLabel
2021-11-11 21:18:45 +03:00
anchors.bottom: content.bottom
2021-11-10 06:17:00 +03:00
text: body + " [" + filesize + "]"
textFormat: Text.RichText
2021-11-10 06:17:00 +03:00
elide: Text.ElideRight
color: Nheko.colors.text
background: Rectangle {
color: Nheko.colors.base
}
}
2021-07-19 21:11:03 +03:00
2021-11-10 06:17:00 +03:00
}