Spectral/imports/Spectral/Component/Timeline/FileDelegate.qml

191 lines
5.6 KiB
QML
Raw Normal View History

2018-12-22 14:25:03 +00:00
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls.Material 2.12
import QtGraphicalEffects 1.0
import Qt.labs.platform 1.0 as Platform
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
2018-12-22 14:25:03 +00:00
import Spectral.Font 0.1
import Spectral.Effect 2.0
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
RowLayout {
2019-05-09 13:18:04 +00:00
readonly property bool avatarVisible: !sentByMe && showAuthor
2018-12-22 14:25:03 +00:00
readonly property bool sentByMe: author === currentRoom.localUser
property bool openOnFinished: false
readonly property bool downloaded: progressInfo && progressInfo.completed
id: root
2019-05-11 13:32:40 +00:00
spacing: 4
2018-12-22 14:25:03 +00:00
onDownloadedChanged: if (downloaded && openOnFinished) openSavedFile()
2019-05-11 13:32:40 +00:00
z: -5
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
Avatar {
Layout.preferredWidth: 36
Layout.preferredHeight: 36
Layout.alignment: Qt.AlignBottom
2018-12-22 14:25:03 +00:00
visible: avatarVisible
2019-05-11 13:32:40 +00:00
hint: author.displayName
source: author.avatarMediaId
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
Component {
id: userDetailDialog
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
UserDetailDialog {}
}
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
RippleEffect {
anchors.fill: parent
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
circular: true
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author}).open()
}
}
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
Label {
Layout.preferredWidth: 36
Layout.preferredHeight: 36
2019-05-11 13:32:40 +00:00
visible: !(sentByMe || avatarVisible)
}
2019-05-11 13:32:40 +00:00
Control {
Layout.maximumWidth: messageListView.width - (!sentByMe ? 36 + root.spacing : 0) - 48
2019-05-11 13:32:40 +00:00
padding: 12
2019-05-11 13:32:40 +00:00
contentItem: RowLayout {
ToolButton {
contentItem: MaterialIcon {
icon: progressInfo.completed ? "\ue5ca" : "\ue2c4"
}
2019-05-11 13:32:40 +00:00
onClicked: progressInfo.completed ? openSavedFile() : saveFileAs()
}
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
ColumnLayout {
Label {
Layout.fillWidth: true
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
text: display
wrapMode: Label.Wrap
font.pixelSize: 18
font.weight: Font.Medium
font.capitalization: Font.AllUppercase
}
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
Label {
Layout.fillWidth: true
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
text: progressInfo.active ? (humanSize(progressInfo.progress) + "/" + humanSize(progressInfo.total)) : humanSize(content.info ? content.info.size : 0)
color: MPalette.lighter
wrapMode: Label.Wrap
}
}
}
2018-12-22 14:25:03 +00:00
2019-05-11 13:32:40 +00:00
background: Rectangle {
2019-05-19 18:24:36 +00:00
color: sentByMe ? MPalette.background : eventType === "notice" ? MPalette.primary : MPalette.accent
radius: 2
2019-05-11 13:32:40 +00:00
AutoMouseArea {
anchors.fill: parent
2019-05-11 13:32:40 +00:00
id: messageMouseArea
onSecondaryClicked: {
var contextMenu = fileDelegateContextMenu.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()
}
2019-05-11 13:32:40 +00:00
Component {
id: messageSourceDialog
2019-05-11 13:32:40 +00:00
MessageSourceDialog {}
}
2019-05-11 13:32:40 +00:00
Component {
id: openFolderDialog
2019-05-11 13:32:40 +00:00
OpenFolderDialog {}
}
2019-05-11 13:32:40 +00:00
Component {
id: fileDelegateContextMenu
FileDelegateContextMenu {}
2018-12-22 14:25:03 +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-22 14:25:03 +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-22 14:25:03 +00:00
}
}
function openSavedFile()
{
if (Qt.openUrlExternally(progressInfo.localPath)) return;
if (Qt.openUrlExternally(progressInfo.localDir)) return;
}
2019-05-09 13:18:04 +00:00
function humanSize(bytes)
{
if (!bytes)
return qsTr("Unknown", "Unknown attachment size")
if (bytes < 4000)
return qsTr("%1 bytes").arg(bytes)
bytes = Math.round(bytes / 100) / 10
if (bytes < 2000)
return qsTr("%1 KB").arg(bytes)
bytes = Math.round(bytes / 100) / 10
if (bytes < 2000)
return qsTr("%1 MB").arg(bytes)
return qsTr("%1 GB").arg(Math.round(bytes / 100) / 10)
}
2018-12-22 14:25:03 +00:00
}