Spectral/imports/Spectral/Component/Timeline/ImageDelegate.qml

235 lines
6.5 KiB
QML
Raw Normal View History

2018-12-07 01:18:42 +00:00
import QtQuick 2.12
2018-12-22 14:25:03 +00:00
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls.Material 2.12
2018-11-22 09:15:14 +00:00
import QtGraphicalEffects 1.0
2018-12-15 14:29:51 +00:00
import Qt.labs.platform 1.0 as Platform
2018-11-22 09:15:14 +00:00
import Spectral 0.1
import Spectral.Setting 0.1
import Spectral.Component 2.0
import Spectral.Dialog 2.0
2019-04-30 03:05:35 +00:00
import Spectral.Menu.Timeline 2.0
import Spectral.Effect 2.0
2018-11-22 09:15:14 +00:00
import Spectral.Font 0.1
ColumnLayout {
readonly property bool avatarVisible: !sentByMe && (aboveAuthor !== author || aboveSection !== section || aboveEventType === "state" || aboveEventType === "emote" || aboveEventType === "other")
readonly property bool sentByMe: author === currentRoom.localUser
2018-12-15 14:29:51 +00:00
property bool openOnFinished: false
readonly property bool downloaded: progressInfo && progressInfo.completed
2018-11-22 09:15:14 +00:00
id: root
spacing: 0
2019-05-01 02:59:09 +00:00
onDownloadedChanged: {
if (downloaded && openOnFinished) {
openSavedFile()
openOnFinished = false
}
2019-05-01 02:59:09 +00:00
}
2018-12-15 14:29:51 +00:00
2018-11-22 09:15:14 +00:00
Label {
Layout.leftMargin: 48
text: author.displayName
visible: avatarVisible
font.pixelSize: 13
verticalAlignment: Text.AlignVCenter
}
RowLayout {
Layout.alignment: sentByMe ? Qt.AlignRight : Qt.AlignLeft
z: -5
id: messageRow
spacing: 4
Avatar {
2018-11-22 09:15:14 +00:00
Layout.preferredWidth: 32
Layout.preferredHeight: 32
Layout.alignment: Qt.AlignTop
visible: avatarVisible
hint: author.displayName
2019-01-04 12:17:26 +00:00
source: author.avatarMediaId
Component {
id: userDetailDialog
UserDetailDialog {}
}
RippleEffect {
anchors.fill: parent
circular: true
onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author}).open()
}
2018-11-22 09:15:14 +00:00
}
Label {
Layout.preferredWidth: 32
Layout.preferredHeight: 32
Layout.alignment: Qt.AlignTop
visible: !(sentByMe || avatarVisible)
text: Qt.formatDateTime(time, "hh:mm")
color: "#5B7480"
font.pixelSize: 10
horizontalAlignment: Label.AlignHCenter
verticalAlignment: Label.AlignVCenter
}
BusyIndicator {
Layout.preferredWidth: 64
Layout.preferredHeight: 64
visible: img.status == Image.Loading
}
2018-11-22 09:15:14 +00:00
Image {
Layout.maximumWidth: messageListView.width - (!sentByMe ? 32 + messageRow.spacing : 0) - 48
id: img
source: "image://mxc/" +
(content.info && content.info.thumbnail_info ?
content.thumbnailMediaId : content.mediaId)
sourceSize.width: 720
sourceSize.height: 720
fillMode: Image.PreserveAspectCrop
2018-11-22 09:15:14 +00:00
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Rectangle {
2019-01-04 12:17:26 +00:00
width: img.width
height: img.height
radius: 24
}
2018-11-22 09:15:14 +00:00
}
2019-03-03 11:35:50 +00:00
Rectangle {
anchors.fill: parent
color: "transparent"
radius: 24
antialiasing: true
2019-03-03 11:35:50 +00:00
border.width: 4
border.color: MPalette.background
2019-03-03 11:35:50 +00:00
}
2019-05-01 02:59:09 +00:00
Rectangle {
anchors.fill: parent
visible: progressInfo.active && !downloaded
color: "#BB000000"
ProgressBar {
anchors.centerIn: parent
width: parent.width * 0.8
from: 0
to: progressInfo.total
value: progressInfo.progress
}
}
RippleEffect {
2018-11-22 09:15:14 +00:00
anchors.fill: parent
id: messageMouseArea
onPrimaryClicked: fullScreenImage.createObject(parent, {"filename": eventId, "localPath": currentRoom.urlToDownload(eventId)}).show()
2019-04-30 03:05:35 +00:00
onSecondaryClicked: {
var contextMenu = imageDelegateContextMenu.createObject(ApplicationWindow.overlay)
contextMenu.viewSource.connect(function() {
messageSourceDialog.createObject(ApplicationWindow.overlay, {"sourceText": toolTip}).open()
})
contextMenu.downloadAndOpen.connect(downloadAndOpen)
contextMenu.saveFileAs.connect(saveFileAs)
contextMenu.reply.connect(function() {
roomPanelInput.replyUser = author
roomPanelInput.replyEventID = eventId
roomPanelInput.replyContent = message
roomPanelInput.isReply = true
roomPanelInput.focus()
})
contextMenu.redact.connect(function() {
currentRoom.redactEvent(eventId)
})
contextMenu.popup()
}
Component {
id: messageSourceDialog
MessageSourceDialog {}
}
2019-04-30 09:02:00 +00:00
Component {
id: openFolderDialog
2019-04-30 09:02:00 +00:00
OpenFolderDialog {}
2019-04-30 09:02:00 +00:00
}
2019-04-30 03:05:35 +00:00
Component {
id: imageDelegateContextMenu
2018-12-15 14:29:51 +00:00
2019-04-30 03:05:35 +00:00
FileDelegateContextMenu {}
2018-11-22 09:15:14 +00:00
}
2019-05-01 02:59:09 +00:00
Component {
id: fullScreenImage
FullScreenImage {}
}
2018-11-22 09:15:14 +00:00
}
}
}
2018-12-15 14:29:51 +00:00
2019-04-30 09:02:00 +00:00
function saveFileAs() {
var folderDialog = openFolderDialog.createObject(ApplicationWindow.overlay)
2019-04-30 09:02:00 +00:00
folderDialog.chosen.connect(function(path) {
2019-04-30 09:02:00 +00:00
if (!path) return
currentRoom.downloadFile(eventId, path + "/" + currentRoom.fileNameToDownload(eventId))
2019-04-30 09:02:00 +00:00
})
folderDialog.open()
2019-04-30 09:02:00 +00:00
}
2018-12-15 14:29:51 +00:00
function downloadAndOpen()
{
if (downloaded) openSavedFile()
else
{
openOnFinished = true
currentRoom.downloadFile(eventId, Platform.StandardPaths.writableLocation(Platform.StandardPaths.CacheLocation) + "/" + eventId.replace(":", "_").replace("/", "_").replace("+", "_") + currentRoom.fileNameToDownload(eventId))
2018-12-15 14:29:51 +00:00
}
}
function openSavedFile()
{
if (Qt.openUrlExternally(progressInfo.localPath)) return;
if (Qt.openUrlExternally(progressInfo.localDir)) return;
}
2018-11-22 09:15:14 +00:00
}