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

155 lines
4.3 KiB
QML
Raw Normal View History

2018-12-07 01:18:42 +00:00
import QtQuick 2.12
import QtQuick.Controls 2.4
2018-11-22 09:15:14 +00:00
import QtQuick.Layouts 1.3
2018-12-07 01:18:42 +00:00
import QtQuick.Controls.Material 2.4
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.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
2018-12-15 14:29:51 +00:00
onDownloadedChanged: if (downloaded && openOnFinished) openSavedFile()
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
source: author.avatarUrl
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
}
Image {
Layout.maximumWidth: messageListView.width - (!sentByMe ? 32 + messageRow.spacing : 0) - 48
id: img
source: "image://mxc/" + (content.thumbnail_url ? content.thumbnail_url : content.url)
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Rectangle {
width: img.width
height: img.height
radius: 24
}
}
AutoMouseArea {
anchors.fill: parent
id: messageMouseArea
2018-12-15 14:29:51 +00:00
onSecondaryClicked: messageContextMenu.popup()
Menu {
id: messageContextMenu
MenuItem {
text: "View Source"
onTriggered: {
sourceDialog.sourceText = toolTip
sourceDialog.open()
}
}
MenuItem {
text: "Open Externally"
onTriggered: downloadAndOpen()
}
MenuItem {
text: "Save As"
onTriggered: saveFileAs()
}
MenuItem {
text: "Reply"
onTriggered: {
roomPanelInput.replyUser = author
roomPanelInput.replyEventID = eventId
roomPanelInput.replyContent = message
roomPanelInput.isReply = true
roomPanelInput.focus()
}
}
MenuItem {
text: "Redact"
onTriggered: currentRoom.redactEvent(eventId)
}
2018-11-22 09:15:14 +00:00
}
}
}
}
2018-12-15 14:29:51 +00:00
function saveFileAs() { currentRoom.saveFileAs(eventId) }
function downloadAndOpen()
{
if (downloaded) openSavedFile()
else
{
openOnFinished = true
currentRoom.downloadFile(eventId, Platform.StandardPaths.writableLocation(Platform.StandardPaths.CacheLocation) + "/" + eventId.replace(":", "_") + (message || ".tmp"))
}
}
function openSavedFile()
{
if (Qt.openUrlExternally(progressInfo.localPath)) return;
if (Qt.openUrlExternally(progressInfo.localDir)) return;
}
2018-11-22 09:15:14 +00:00
}