// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import Qt . labs . platform 1.1 as Platform
import QtQuick 2.12
import QtQuick . Controls 2.3
import QtQuick . Layouts 1.2
import QtQuick . Window 2.13
import im . nheko 1.0
Item {
id: r
property color userColor: "red"
property double proportionalHeight
property int type
property string typeString
property int originalWidth
property string blurhash
property string body
property string formattedBody
property string eventId
property string filename
property string filesize
property string url
property bool isOnlyEmoji
property string userId
property string userName
property string thumbnailUrl
property string roomTopic
property string roomName
property string callType
property int encryptionError
property int relatedEventCacheBuster
Layout.preferredHeight: replyContainer . height
height: replyContainer . height
CursorShape {
anchors.fill: parent
cursorShape: Qt . PointingHandCursor
}
Rectangle {
id: colorLine
anchors.top: replyContainer . top
anchors.bottom: replyContainer . bottom
width: 4
color: TimelineManager . userColor ( userId , Nheko . colors . base )
}
ColumnLayout {
id: replyContainer
anchors.left: colorLine . right
width: parent . width - 8
spacing: 0
TapHandler {
acceptedButtons: Qt . LeftButton
onSingleTapped: {
let link = reply . child . linkAt ( eventPoint . position . x , eventPoint . position . y - userName_ . implicitHeight ) ;
if ( link ) {
Nheko . openLink ( link )
} else {
room . showEvent ( r . eventId )
}
}
gesturePolicy: TapHandler . ReleaseWithinBounds
}
TapHandler {
acceptedButtons: Qt . RightButton
onLongPressed: replyContextMenu . show ( reply . child . copyText , reply . child . linkAt ( eventPoint . position . x , eventPoint . position . y - userName_ . implicitHeight ) )
onSingleTapped: replyContextMenu . show ( reply . child . copyText , reply . child . linkAt ( eventPoint . position . x , eventPoint . position . y - userName_ . implicitHeight ) )
gesturePolicy: TapHandler . ReleaseWithinBounds
}
Text {
Layout.leftMargin: 4
id: userName_
text: TimelineManager . escapeEmoji ( userName )
color: r . userColor
textFormat: Text . RichText
TapHandler {
onSingleTapped: room . openUserProfile ( userId )
gesturePolicy: TapHandler . ReleaseWithinBounds
}
}
MessageDelegate {
Layout.leftMargin: 4
id: reply
blurhash: r . blurhash
body: r . body
formattedBody: r . formattedBody
eventId: r . eventId
filename: r . filename
filesize: r . filesize
proportionalHeight: r . proportionalHeight
type: r . type
typeString: r . typeString ? ? ""
url: r . url
thumbnailUrl: r . thumbnailUrl
originalWidth: r . originalWidth
isOnlyEmoji: r . isOnlyEmoji
userId: r . userId
userName: r . userName
roomTopic: r . roomTopic
roomName: r . roomName
callType: r . callType
relatedEventCacheBuster: r . relatedEventCacheBuster
encryptionError: r . encryptionError
// This is disabled so that left clicking the reply goes to its location
enabled: false
Layout.fillWidth: true
isReply: true
}
}
Rectangle {
id: backgroundItem
z: - 1
anchors.fill: replyContainer
property color userColor: TimelineManager . userColor ( userId , Nheko . colors . base )
property color bgColor: Nheko . colors . base
color: Qt . rgba ( userColor . r * 0.1 + bgColor . r * 0.9 , userColor . g * 0.1 + bgColor . g * 0.9 , userColor . b * 0.1 + bgColor . b * 0.9 , 1 ) // alpha makes this mix with the bubble color
}
}