moment/src/gui/Pages/Chat/Timeline/EventDelegate.qml

127 lines
3.8 KiB
QML
Raw Normal View History

// SPDX-License-Identifier: LGPL-3.0-or-later
import QtQuick 2.12
import QtQuick.Layouts 1.12
2019-12-27 09:06:42 -04:00
import Clipboard 0.1
import "../../.."
2019-12-18 04:53:08 -04:00
import "../../../Base"
import "../../../PythonBridge"
2019-03-21 23:28:14 -04:00
HColumnLayout {
id: eventDelegate
2019-03-21 23:28:14 -04:00
property var fetchProfilesFuture: null
// Remember timeline goes from newest message at index 0 to oldest
readonly property var previousModel: eventList.model.get(model.index + 1)
readonly property var nextModel: eventList.model.get(model.index - 1)
readonly property QtObject currentModel: model
readonly property bool compact: window.settings.compactMode
readonly property bool checked: model.id in eventList.checked
readonly property bool isOwn: chat.userId === model.sender_id
readonly property bool isRedacted: model.event_type === "RedactedEvent"
readonly property bool onRight: ! eventList.ownEventsOnLeft && isOwn
readonly property bool combine: eventList.canCombine(previousModel, model)
readonly property bool asOneLine: eventList.renderEventAsOneLine(model)
readonly property bool talkBreak:
eventList.canTalkBreak(previousModel, model)
readonly property bool dayBreak:
eventList.canDayBreak(previousModel, model)
2019-03-21 23:28:14 -04:00
readonly property int cursorShape:
eventContent.hoveredLink ? Qt.PointingHandCursor :
eventContent.hoveredSelectable ? Qt.IBeamCursor :
Qt.ArrowCursor
readonly property int separationSpacing:
dayBreak ? theme.spacing * 4 :
talkBreak ? theme.spacing * 6 :
combine ? theme.spacing / (compact ? 4 : 2) :
theme.spacing * (compact ? 1 : 2)
readonly property alias eventContent: eventContent
function dict() {
let event = eventList.model.get(model.index)
event = JSON.parse(JSON.stringify(event))
event.source = JSON.parse(event.source)
return event
}
2019-09-14 18:52:43 -04:00
function openContextMenu() {
eventList.contextMenu.spawn(
model.index, eventDelegate, eventContent.hoveredLink,
)
2019-09-14 18:52:43 -04:00
}
function toggleChecked() {
eventList.toggleCheck(model.index)
}
width: eventList.width - eventList.leftMargin - eventList.rightMargin
// Needed because of eventList's MouseArea which steals the
// HSelectableLabel's MouseArea hover events
onCursorShapeChanged: eventList.cursorShape = cursorShape
Component.onCompleted: if (model.fetch_profile)
fetchProfilesFuture = py.callClientCoro(
chat.userId,
"get_event_profiles",
[chat.roomId, model.id],
// The if avoids segfault if eventDelegate is already destroyed
() => { if (eventDelegate) fetchProfilesFuture = null }
)
Component.onDestruction:
if (fetchProfilesFuture) fetchProfilesFuture.cancel()
ListView.onRemove: eventList.uncheck(model.id)
Item {
Layout.fillWidth: true
visible: model.event_type !== "RoomCreateEvent"
Layout.preferredHeight: separationSpacing
}
Daybreak {
visible: dayBreak
Layout.fillWidth: true
Layout.minimumWidth: parent.width
Layout.bottomMargin: separationSpacing
2019-07-20 02:27:17 -04:00
}
2019-07-02 22:29:09 -04:00
EventContent {
id: eventContent
Layout.fillWidth: true
2019-04-28 14:48:59 -04:00
}
TapHandler {
acceptedButtons: Qt.LeftButton
acceptedModifiers: Qt.NoModifier
onTapped: toggleChecked()
}
TapHandler {
acceptedButtons: Qt.LeftButton
acceptedModifiers: Qt.ShiftModifier
onTapped: eventList.checkFromLastToHere(model.index)
}
TapHandler {
acceptedButtons: Qt.RightButton
acceptedPointerTypes: PointerDevice.GenericPointer | PointerDevice.Pen
2019-09-14 18:52:43 -04:00
onTapped: openContextMenu()
}
TapHandler {
acceptedPointerTypes: PointerDevice.Finger | PointerDevice.Pen
onLongPressed: openContextMenu()
}
2019-03-21 23:28:14 -04:00
}