186 lines
7.1 KiB
QML
186 lines
7.1 KiB
QML
import QtQuick 2.14
|
|
import QtQuick.Shapes 1.13
|
|
import QtGraphicalEffects 1.13
|
|
|
|
import utils 1.0
|
|
import shared.controls 1.0
|
|
import shared 1.0
|
|
import shared.panels 1.0
|
|
import shared.status 1.0
|
|
import shared.controls.chat 1.0
|
|
|
|
Loader {
|
|
id: root
|
|
property bool amISenderOfTheRepliedMessage
|
|
property int repliedMessageContentType
|
|
property string repliedMessageSenderIcon
|
|
property bool repliedMessageSenderIconIsIdenticon
|
|
property bool repliedMessageIsEdited
|
|
property string repliedMessageSender
|
|
property string repliedMessageContent
|
|
property string repliedMessageImage
|
|
property bool isCurrentUser: false
|
|
property int nameMargin: 6
|
|
property int textFieldWidth: item ? item.textField.width : 0
|
|
property int textFieldImplicitWidth: 0
|
|
property int authorWidth: item ? item.authorMetrics.width : 0
|
|
property bool longReply: false
|
|
property color elementsColor: amISenderOfTheRepliedMessage ? Style.current.chatReplyCurrentUser : Style.current.secondaryText
|
|
property var container
|
|
property int chatHorizontalPadding
|
|
property var stickerData
|
|
|
|
signal clickMessage(bool isProfileClick, bool isSticker, bool isImage, var image, bool emojiOnly, bool hideEmojiPicker, bool isReply)
|
|
signal scrollToBottom(bool isit, var container)
|
|
|
|
sourceComponent: Component {
|
|
Item {
|
|
property alias textField: lblReplyMessage
|
|
property alias authorMetrics: txtAuthorMetrics
|
|
|
|
id: chatReply
|
|
// childrenRect.height shows a binding loop for some reason, so we use heights instead
|
|
height: {
|
|
const h = userImage.height + 4
|
|
if (repliedMessageContentType === Constants.messageContentType.imageType) {
|
|
return h + imgReplyImage.height
|
|
}
|
|
if (repliedMessageContentType === Constants.messageContentType.stickerType) {
|
|
return h + stickerLoader.height
|
|
}
|
|
return h + lblReplyMessage.height
|
|
}
|
|
width: parent.width
|
|
clip: true
|
|
|
|
TextMetrics {
|
|
id: txtAuthorMetrics
|
|
font: lblReplyAuthor.font
|
|
text: lblReplyAuthor.text
|
|
}
|
|
|
|
Shape {
|
|
id: replyCorner
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: 20 - 1
|
|
anchors.top: parent.top
|
|
anchors.topMargin: Style.current.smallPadding
|
|
width: 20
|
|
height: parent.height - anchors.topMargin
|
|
asynchronous: true
|
|
antialiasing: true
|
|
|
|
ShapePath {
|
|
id: capTest
|
|
|
|
strokeColor: Utils.setColorAlpha(root.elementsColor, 0.4)
|
|
strokeWidth: 3
|
|
fillColor: "transparent"
|
|
|
|
capStyle: ShapePath.RoundCap
|
|
joinStyle: ShapePath.RoundJoin
|
|
|
|
startX: 20
|
|
startY: 0
|
|
PathLine { x: 10; y: 0 }
|
|
PathArc {
|
|
x: 0; y: 10
|
|
radiusX: 13
|
|
radiusY: 13
|
|
direction: PathArc.Counterclockwise
|
|
}
|
|
PathLine { x: 0; y: chatReply.height - replyCorner.anchors.topMargin }
|
|
}
|
|
}
|
|
|
|
UserImage {
|
|
id: userImage
|
|
imageHeight: 20
|
|
imageWidth: 20
|
|
active: true
|
|
anchors.left: replyCorner.right
|
|
anchors.leftMargin: Style.current.halfPadding
|
|
icon: repliedMessageSenderIcon
|
|
isIdenticon: repliedMessageSenderIconIsIdenticon
|
|
onClickMessage: {
|
|
root.clickMessage(true, false, false, null, false, false, true)
|
|
}
|
|
}
|
|
|
|
StyledTextEdit {
|
|
id: lblReplyAuthor
|
|
text: repliedMessageSender
|
|
color: root.elementsColor
|
|
readOnly: true
|
|
font.pixelSize: Style.current.secondaryTextFontSize
|
|
selectByMouse: true
|
|
font.weight: Font.Medium
|
|
anchors.verticalCenter: userImage.verticalCenter
|
|
anchors.left: userImage.right
|
|
anchors.leftMargin: 5
|
|
}
|
|
|
|
StatusChatImage {
|
|
id: imgReplyImage
|
|
visible: repliedMessageContentType === Constants.messageContentType.imageType
|
|
imageWidth: 50
|
|
imageSource: repliedMessageImage
|
|
anchors.top: lblReplyAuthor.bottom
|
|
anchors.topMargin: nameMargin
|
|
anchors.left: userImage.left
|
|
chatHorizontalPadding: 0
|
|
container: root.container
|
|
allCornersRounded: true
|
|
}
|
|
|
|
Loader {
|
|
id: stickerLoader
|
|
active: repliedMessageContentType === Constants.messageContentType.stickerType
|
|
anchors.top: lblReplyAuthor.bottom
|
|
anchors.topMargin: nameMargin
|
|
anchors.left: userImage.left
|
|
sourceComponent: Component {
|
|
StatusSticker {
|
|
id: stickerId
|
|
imageHeight: 56
|
|
imageWidth: 56
|
|
stickerData: root.stickerData
|
|
contentType: repliedMessageContentType
|
|
onLoaded: {
|
|
scrollToBottom(true, root.container)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
StyledTextEdit {
|
|
id: lblReplyMessage
|
|
visible: repliedMessageContentType !== Constants.messageContentType.imageType && repliedMessageContentType !== Constants.messageContentType.stickerType
|
|
Component.onCompleted: textFieldImplicitWidth = implicitWidth
|
|
anchors.top: lblReplyAuthor.bottom
|
|
anchors.topMargin: nameMargin
|
|
text: {
|
|
if (repliedMessageIsEdited){
|
|
let index = repliedMessageContent.length - 4
|
|
return Utils.getReplyMessageStyle(Emoji.parse(Utils.linkifyAndXSS(repliedMessageContent.slice(0, index) + Constants.editLabel + repliedMessageContent.slice(index)), Emoji.size.small), amISenderOfTheRepliedMessage)
|
|
} else {
|
|
return Utils.getReplyMessageStyle(Emoji.parse(Utils.linkifyAndXSS(repliedMessageContent), Emoji.size.small), amISenderOfTheRepliedMessage)
|
|
}
|
|
}
|
|
textFormat: Text.RichText
|
|
color: root.elementsColor
|
|
readOnly: true
|
|
selectByMouse: true
|
|
font.pixelSize: Style.current.additionalTextSize
|
|
font.weight: Font.Medium
|
|
anchors.left: userImage.left
|
|
width: root.longReply ? parent.width : implicitWidth
|
|
height: 20
|
|
clip: true
|
|
z: 51
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|