Refactor event context menu into its separate file
Have only one menu component attached to the EventList, instead of every delegate carrying its own.
This commit is contained in:
175
src/gui/Pages/Chat/Timeline/EventContextMenu.qml
Normal file
175
src/gui/Pages/Chat/Timeline/EventContextMenu.qml
Normal file
@@ -0,0 +1,175 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Layouts 1.12
|
||||
import Clipboard 0.1
|
||||
import "../../.."
|
||||
import "../../../Base"
|
||||
import "../../../PythonBridge"
|
||||
|
||||
HMenu {
|
||||
id: menu
|
||||
|
||||
property HListView eventList
|
||||
property int eventIndex: 0
|
||||
property Item eventDelegate: null // TODO: Qt 5.13: just use itemAtIndex()
|
||||
property var hoveredMedia: [] // [Utils.Media.<Type>, url, title]
|
||||
property string hoveredLink: ""
|
||||
|
||||
readonly property QtObject event: eventList.model.get(eventIndex)
|
||||
|
||||
readonly property bool isEncryptedMedia:
|
||||
Object.keys(JSON.parse(event.media_crypt_dict)).length > 0
|
||||
|
||||
function spawn(eventIndex, eventDelegate, hoveredMedia=[], hoveredUrl="") {
|
||||
menu.eventIndex = eventIndex
|
||||
menu.eventDelegate = eventDelegate
|
||||
menu.hoveredMedia = hoveredMedia
|
||||
menu.hoveredLink = hoveredUrl
|
||||
menu.popup()
|
||||
}
|
||||
|
||||
|
||||
onClosed: {
|
||||
hoveredMedia = []
|
||||
hoveredLink = ""
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
icon.name: "toggle-select-message"
|
||||
text: event.id in eventList.checked ? qsTr("Deselect") : qsTr("Select")
|
||||
onTriggered: eventList.toggleCheck(eventIndex)
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
visible: eventList.selectedCount >= 2
|
||||
icon.name: "deselect-all-messages"
|
||||
text: qsTr("Deselect all")
|
||||
onTriggered: eventList.checked = {}
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
visible: eventIndex !== 0
|
||||
icon.name: "select-until-here"
|
||||
text: qsTr("Select until here")
|
||||
onTriggered: eventList.checkFromLastToHere(eventIndex)
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
icon.name: "open-externally"
|
||||
text: qsTr("Open externally")
|
||||
visible: Boolean(event.media_url)
|
||||
onTriggered: eventList.openMediaExternally(event)
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
icon.name: "copy-local-path"
|
||||
text: qsTr("Copy local path")
|
||||
visible: Boolean(event.media_local_path)
|
||||
onTriggered:
|
||||
Clipboard.text =
|
||||
event.media_local_path.replace(/^file:\/\//, "")
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
id: copyMedia
|
||||
icon.name: "copy-link"
|
||||
text:
|
||||
menu.hoveredMedia.length === 0 ||
|
||||
menu.isEncryptedMedia ?
|
||||
"" :
|
||||
|
||||
menu.hoveredMedia[0] === Utils.Media.File ?
|
||||
qsTr("Copy file address") :
|
||||
|
||||
menu.hoveredMedia[0] === Utils.Media.Image ?
|
||||
qsTr("Copy image address") :
|
||||
|
||||
menu.hoveredMedia[0] === Utils.Media.Video ?
|
||||
qsTr("Copy video address") :
|
||||
|
||||
qsTr("Copy audio address")
|
||||
|
||||
visible: Boolean(text)
|
||||
onTriggered: Clipboard.text = event.media_http_url // FIXME
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
icon.name: "copy-link"
|
||||
text: qsTr("Copy link address")
|
||||
visible: Boolean(menu.hoveredLink)
|
||||
onTriggered: Clipboard.text = menu.hoveredLink
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
icon.name: "copy-text"
|
||||
text:
|
||||
eventList.selectedCount ? qsTr("Copy selection") :
|
||||
menu.hoveredMedia.length > 0 ? qsTr("Copy filename") :
|
||||
qsTr("Copy text")
|
||||
|
||||
onTriggered: {
|
||||
if (! eventList.selectedCount){
|
||||
Clipboard.text = JSON.parse(event.source).body
|
||||
return
|
||||
}
|
||||
|
||||
eventList.copySelectedDelegates()
|
||||
}
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
icon.name: "reply-to"
|
||||
text: qsTr("Reply")
|
||||
|
||||
onTriggered: {
|
||||
chat.replyToEventId = event.id
|
||||
chat.replyToUserId = event.sender_id
|
||||
chat.replyToDisplayName = event.sender_name
|
||||
}
|
||||
}
|
||||
|
||||
HMenuItemPopupSpawner {
|
||||
readonly property var events:
|
||||
eventList.selectedCount ?
|
||||
eventList.redactableCheckedEvents :
|
||||
|
||||
eventList.canRedact(event) ?
|
||||
[event] :
|
||||
|
||||
[]
|
||||
|
||||
icon.name: "remove-message"
|
||||
text: qsTr("Remove")
|
||||
enabled: properties.eventSenderAndIds.length
|
||||
|
||||
popup: "Popups/RedactPopup.qml"
|
||||
properties: ({
|
||||
preferUserId: chat.userId,
|
||||
roomId: chat.roomId,
|
||||
eventSenderAndIds: events.map(ev => [ev.sender_id, ev.id]),
|
||||
|
||||
onlyOwnMessageWarning:
|
||||
! chat.roomInfo.can_redact_all &&
|
||||
events.length < eventList.selectedCount
|
||||
})
|
||||
}
|
||||
|
||||
HMenuItem {
|
||||
icon.name: "debug"
|
||||
text: qsTr("Debug this event")
|
||||
onTriggered: mainUI.debugConsole.toggle(eventDelegate, "t.json()")
|
||||
}
|
||||
|
||||
HMenuItemPopupSpawner {
|
||||
icon.name: "clear-messages"
|
||||
text: qsTr("Clear messages")
|
||||
|
||||
popup: "Popups/ClearMessagesPopup.qml"
|
||||
properties: ({
|
||||
userId: chat.userId,
|
||||
roomId: chat.roomId,
|
||||
preClearCallback: eventList.uncheckAll,
|
||||
})
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user