Refactor the context menu loading

This commit is contained in:
Tobias Fella
2021-04-03 02:16:46 +02:00
parent 78f7f815ca
commit 73f18f4fe9
5 changed files with 84 additions and 133 deletions

View File

@@ -43,7 +43,7 @@ RowLayout {
Kirigami.Heading { Kirigami.Heading {
Layout.fillWidth: true Layout.fillWidth: true
level: 4 level: 4
text: display text: model.display
wrapMode: Label.Wrap wrapMode: Label.Wrap
} }

View File

@@ -63,66 +63,6 @@ Image {
} }
} }
MouseArea {
id: messageMouseArea
enabled: !img.readonly
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
if(mouse.button === Qt.LeftButton) {
fullScreenImage.createObject(parent, {"filename": eventId, "localPath": currentRoom.urlToDownload(eventId)}).showFullScreen()
} else {
openContextMenu()
}
}
function openContextMenu() {
var contextMenu = imageDelegateContextMenu.createObject(root, {'room': currentRoom, 'author': author, 'message': message, 'eventId': eventId});
contextMenu.viewSource.connect(function() {
messageSourceSheet.createObject(ApplicationWindow.overlay, {"sourceText": toolTip}).open()
})
contextMenu.downloadAndOpen.connect(downloadAndOpen)
contextMenu.saveFileAs.connect(saveFileAs)
contextMenu.reply.connect(function() {
roomPanelInput.replyModel = Object.assign({}, model)
roomPanelInput.isReply = true
roomPanelInput.focus()
})
contextMenu.remove.connect(function() {
currentRoom.redactEvent(eventId)
})
contextMenu.popup()
}
Component {
id: messageSourceSheet
MessageSourceSheet {}
}
Component {
id: openFolderDialog
OpenFolderDialog {}
}
Component {
id: imageDelegateContextMenu
FileDelegateContextMenu {}
}
Component {
id: fullScreenImage
FullScreenImage {}
}
}
function saveFileAs() { function saveFileAs() {
var dialog = fileDialog.createObject(ApplicationWindow.overlay) var dialog = fileDialog.createObject(ApplicationWindow.overlay)
dialog.open() dialog.open()

View File

@@ -9,39 +9,79 @@ import org.kde.kirigami 2.14 as Kirigami
import NeoChat.Dialog 1.0 import NeoChat.Dialog 1.0
import NeoChat.Menu 1.0 import NeoChat.Menu 1.0
import org.kde.neochat 1.0
import Qt.labs.platform 1.1
MessageDelegateContextMenu { MessageDelegateContextMenu {
id: root id: root
signal downloadAndOpen() required property var file
signal saveFileAs() required property var progressInfo
property list<Kirigami.Action> actions: [ property list<Kirigami.Action> actions: [
Kirigami.Action { Kirigami.Action {
text: i18n("Open Externally") text: i18n("Open Externally")
icon.name: "document-open" icon.name: "document-open"
onTriggered: downloadAndOpen() onTriggered: {
if (file.downloaded) {
if (!Qt.openUrlExternally(progressInfo.localPath)) {
Qt.openUrlExternally(progressInfo.localDir);
}
} else {
file.onDownloadedChanged.connect(function() {
if (!Qt.openUrlExternally(progressInfo.localPath)) {
Qt.openUrlExternally(progressInfo.localDir);
}
});
currentRoom.downloadFile(eventId, StandardPaths.writableLocation(StandardPaths.CacheLocation) + "/" + eventId.replace(":", "_").replace("/", "_").replace("+", "_") + currentRoom.fileNameToDownload(eventId))
}
}
}, },
Kirigami.Action { Kirigami.Action {
text: i18n("Save As") text: i18n("Save As")
icon.name: "document-save" icon.name: "document-save"
onTriggered: saveFileAs() onTriggered: {
var dialog = saveAsDialog.createObject(ApplicationWindow.overlay)
dialog.open()
dialog.currentFile = dialog.folder + "/" + currentRoom.fileNameToDownload(eventId)
}
}, },
Kirigami.Action { Kirigami.Action {
text: i18n("Reply") text: i18n("Reply")
icon.name: "mail-replied-symbolic" icon.name: "mail-replied-symbolic"
onTriggered: reply(author, message) onTriggered: {
ChatBoxHelper.replyToMessage(eventId, message, author);
}
}, },
Kirigami.Action { Kirigami.Action {
visible: author.id === currentRoom.localUser.id || currentRoom.canSendState("redact") visible: author.id === currentRoom.localUser.id || currentRoom.canSendState("redact")
text: i18n("Remove") text: i18n("Remove")
icon.name: "edit-delete-remove" icon.name: "edit-delete-remove"
icon.color: "red" icon.color: "red"
onTriggered: remove() onTriggered: {
currentRoom.redactEvent(eventId);
}
}, },
Kirigami.Action { Kirigami.Action {
text: i18n("View Source") text: i18n("View Source")
icon.name: "code-context" icon.name: "code-context"
onTriggered: viewSource() onTriggered: {
messageSourceSheet.createObject(root, {'sourceText': root.source}).open();
}
} }
] ]
Component {
id: saveAsDialog
FileDialog {
fileMode: FileDialog.SaveFile
folder: StandardPaths.writableLocation(StandardPaths.DownloadLocation)
onAccepted: {
if (!currentFile) {
return;
}
currentRoom.downloadFile(eventId, currentFile)
}
}
}
} }

View File

@@ -18,33 +18,38 @@ Loader {
required property var author required property var author
required property string message required property string message
required property string eventId required property string eventId
required property string source
signal viewSource()
signal reply(var author, string message)
signal remove()
property list<Kirigami.Action> actions: [ property list<Kirigami.Action> actions: [
Kirigami.Action { Kirigami.Action {
text: i18n("Reply") text: i18n("Reply")
icon.name: "mail-replied-symbolic" icon.name: "mail-replied-symbolic"
onTriggered: reply(author, message) onTriggered: {
ChatBoxHelper.replyToMessage(eventId, message, author);
}
}, },
Kirigami.Action { Kirigami.Action {
visible: author.id === currentRoom.localUser.id || currentRoom.canSendState("redact") visible: author.id === currentRoom.localUser.id || currentRoom.canSendState("redact")
text: i18n("Remove") text: i18n("Remove")
icon.name: "edit-delete-remove" icon.name: "edit-delete-remove"
icon.color: "red" icon.color: "red"
onTriggered: remove() onTriggered: {
currentRoom.redactEvent(eventId);
}
}, },
Kirigami.Action { Kirigami.Action {
text: i18n("Copy") text: i18n("Copy")
icon.name: "edit-copy" icon.name: "edit-copy"
onTriggered: Clipboard.saveText(message) onTriggered: {
Clipboard.saveText(message)
}
}, },
Kirigami.Action { Kirigami.Action {
text: i18n("View Source") text: i18n("View Source")
icon.name: "code-context" icon.name: "code-context"
onTriggered: viewSource() onTriggered: {
messageSourceSheet.createObject(page, {'sourceText': loadRoot.source}).open();
}
} }
] ]

View File

@@ -438,6 +438,17 @@ Kirigami.ScrollablePage {
Layout.preferredHeight: info.h / info.w * width Layout.preferredHeight: info.h / info.w * width
Layout.maximumHeight: Kirigami.Units.gridUnit * 15 Layout.maximumHeight: Kirigami.Units.gridUnit * 15
Layout.maximumWidth: Kirigami.Units.gridUnit * 30 Layout.maximumWidth: Kirigami.Units.gridUnit * 30
TapHandler {
acceptedButtons: Qt.RightButton
onTapped: openFileContext(author, model.display, eventId, toolTip, progressInfo, parent)
}
TapHandler {
acceptedButtons: Qt.LeftButton
onLongPressed: openFileContext(author, model.display, eventId, toolTip, progressInfo, parent)
onTapped: {
fullScreenImage.createObject(parent, {"filename": eventId, "localPath": currentRoom.urlToDownload(eventId)}).showFullScreen()
}
}
} }
} }
} }
@@ -630,17 +641,17 @@ Kirigami.ScrollablePage {
MessageSourceSheet {} MessageSourceSheet {}
} }
Component {
id: openFolderDialog
OpenFolderDialog {}
}
Component { Component {
id: fileDelegateContextMenu id: fileDelegateContextMenu
FileDelegateContextMenu {} FileDelegateContextMenu {}
} }
Component {
id: fullScreenImage
FullScreenImage {}
}
} }
footer: ChatBox { footer: ChatBox {
@@ -739,71 +750,26 @@ Kirigami.ScrollablePage {
} }
/// Open message context dialog for file and videos /// Open message context dialog for file and videos
function openFileContext(author, message, eventId, toolTip, progressInfo, file) { function openFileContext(author, message, eventId, source, progressInfo, file) {
const contextMenu = fileDelegateContextMenu.createObject(page, { const contextMenu = fileDelegateContextMenu.createObject(page, {
'author': author, 'author': author,
'message': message, 'message': message,
'eventId': eventId, 'eventId': eventId,
'source': source,
'file': file,
'progressInfo': progressInfo,
}); });
contextMenu.downloadAndOpen.connect(function() {
if (file.downloaded) {
if (!Qt.openUrlExternally(progressInfo.localPath)) {
Qt.openUrlExternally(progressInfo.localDir);
}
} else {
file.onDownloadedChanged.connect(function() {
if (!Qt.openUrlExternally(progressInfo.localPath)) {
Qt.openUrlExternally(progressInfo.localDir);
}
});
currentRoom.downloadFile(eventId, Platform.StandardPaths.writableLocation(Platform.StandardPaths.CacheLocation) + "/" + eventId.replace(":", "_").replace("/", "_").replace("+", "_") + currentRoom.fileNameToDownload(eventId))
}
});
contextMenu.saveFileAs.connect(function() {
const folderDialog = openFolderDialog.createObject(ApplicationWindow.overlay)
folderDialog.chosen.connect(function(path) {
if (!path) {
return;
}
currentRoom.downloadFile(eventId, path + "/" + currentRoom.fileNameToDownload(eventId))
})
folderDialog.open()
})
contextMenu.viewSource.connect(function() {
messageSourceSheet.createObject(page, {
'sourceText': toolTip,
}).open();
});
contextMenu.reply.connect(function(replyUser, replyContent) {
ChatBoxHelper.replyToMessage(eventId, replyContent, replyUser);
})
contextMenu.remove.connect(function() {
currentRoom.redactEvent(eventId);
})
contextMenu.open(); contextMenu.open();
} }
/// Open context menu for normal message /// Open context menu for normal message
function openMessageContext(author, message, eventId, toolTip) { function openMessageContext(author, message, eventId, source) {
const contextMenu = messageDelegateContextMenu.createObject(page, { const contextMenu = messageDelegateContextMenu.createObject(page, {
'author': author, 'author': author,
'message': message, 'message': message,
'eventId': eventId, 'eventId': eventId,
'source': source,
}); });
contextMenu.viewSource.connect(function() {
messageSourceSheet.createObject(page, {
'sourceText': toolTip,
}).open();
});
contextMenu.reply.connect(function(replyUser, replyContent) {
ChatBoxHelper.replyToMessage(eventId, replyContent, replyUser);
})
contextMenu.remove.connect(function() {
currentRoom.redactEvent(eventId);
})
contextMenu.open(); contextMenu.open();
} }
} }