190 lines
4.6 KiB
QML
190 lines
4.6 KiB
QML
import QtGraphicalEffects 1.0
|
|
import QtQuick 2.7
|
|
import QtQuick.Controls 2.4
|
|
import QtQuick.Controls.Material 2.0
|
|
import QtQuick.Layouts 1.3
|
|
|
|
import "controls" as Awesome
|
|
|
|
Item {
|
|
id: root
|
|
|
|
anchors.left: fromMe ? undefined : parent.left
|
|
anchors.right: fromMe ? parent.right : undefined
|
|
height: Math.max(imgProfile.height, rectMessageBubble.height)
|
|
|
|
property alias message: lbl.text
|
|
property string rawMessage
|
|
property string from
|
|
property string handle
|
|
property string displayName
|
|
property string messageID
|
|
property bool fromMe
|
|
property bool ackd
|
|
property alias timestamp: ts.text
|
|
property alias image: imgProfile.source
|
|
property alias status: imgProfile.status
|
|
property string error
|
|
|
|
Connections {
|
|
target: gcd
|
|
|
|
onAcknowledged: function(mid) {
|
|
if (mid == messageID) {
|
|
root.ackd = true
|
|
}
|
|
}
|
|
|
|
onGroupSendError: function(mid, error) {
|
|
if (mid == messageID) {
|
|
root.error = error
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
ContactPicture {
|
|
id: imgProfile
|
|
anchors.left: parent.left
|
|
handle: root.from
|
|
visible: !fromMe
|
|
showStatus: false
|
|
highlight: ima.containsMouse
|
|
|
|
ToolTip.visible: ima.containsMouse
|
|
//: Click to DM
|
|
ToolTip.text: qsTr("dm-tooltip")
|
|
|
|
MouseArea {
|
|
id: ima
|
|
anchors.fill: parent
|
|
hoverEnabled: overlay.inGroup
|
|
|
|
|
|
onClicked: {
|
|
gcd.broadcast("ResetMessagePane")
|
|
theStack.pane = theStack.messagePane
|
|
gcd.loadMessagesPane(from)
|
|
overlayStack.overlay = overlayStack.chatOverlay
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
Rectangle { // THIS IS JUST A PRETTY MESSAGE-HOLDING RECTANGLE
|
|
id: rectMessageBubble
|
|
height: colMessageBubble.height + 8
|
|
width: colMessageBubble.width + 6
|
|
color: fromMe ? "#B09CBC" : "#4B3557"
|
|
radius: 5
|
|
|
|
// the console will complain constantly about me setting these anchors, but qt only allows margins if they've been set to something
|
|
// a kludge to fix this would be to have spacers before/after and set the widths according to the side they're on ^ea
|
|
anchors.left: fromMe ? undefined : imgProfile.right //parent.left
|
|
anchors.right: fromMe ? parent.right : undefined
|
|
anchors.leftMargin: 5
|
|
anchors.rightMargin: 9
|
|
anchors.topMargin: 5
|
|
|
|
|
|
ColumnLayout {
|
|
id: colMessageBubble
|
|
|
|
|
|
Column { // combine these into one element or else childrenRect won't play nicely
|
|
TextEdit { // this is used as a helper to calculate the message box width
|
|
id: dummy
|
|
visible: false
|
|
padding: 6
|
|
leftPadding: 10
|
|
font.pixelSize: gcd.themeScale * 12
|
|
wrapMode: TextEdit.NoWrap
|
|
text: message
|
|
textFormat: Text.RichText
|
|
}
|
|
|
|
TextEdit { // this is the actual text display
|
|
id: lbl
|
|
color: "#FFFFFF"
|
|
padding: 6
|
|
leftPadding: 10
|
|
font.pixelSize: gcd.themeScale * 12
|
|
selectByMouse: gcd.os != "android"
|
|
readOnly: true
|
|
width: Math.min(dummy.width, root.parent.width - (imgProfile.visible ? imgProfile.width : 0) - 40)
|
|
wrapMode: TextEdit.Wrap
|
|
textFormat: Text.RichText
|
|
}
|
|
}
|
|
|
|
RowLayout {
|
|
id: rowBottom
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
|
|
|
|
Label { // TIMESTAMP
|
|
id: ts
|
|
color: "#FFFFFF"
|
|
font.pixelSize: 10 * gcd.themeScale
|
|
anchors.left: parent.left
|
|
leftPadding: 10
|
|
}
|
|
|
|
Label { // DISPLAY NAME FOR GROUPS
|
|
color: "#FFFFFF"
|
|
font.pixelSize: 10 * gcd.themeScale
|
|
anchors.right: parent.right
|
|
text: displayName.length > 12 ? displayName.substr(0,12) + "..." : displayName
|
|
visible: !fromMe
|
|
ToolTip.text: from
|
|
ToolTip.visible: ma2.containsMouse
|
|
ToolTip.delay: 200
|
|
|
|
MouseArea {
|
|
id: ma2
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
}
|
|
}
|
|
|
|
Image { // ACKNOWLEDGEMENT ICON
|
|
id: ack
|
|
anchors.right: parent.right
|
|
source: root.error != "" ? "qrc:/qml/images/fontawesome/regular/window-close.svg" : (root.ackd ? "qrc:/qml/images/fontawesome/regular/check-circle.svg" : "qrc:/qml/images/fontawesome/regular/hourglass.svg")
|
|
height: 10 * gcd.themeScale
|
|
sourceSize.height: 10 * gcd.themeScale
|
|
visible: fromMe
|
|
ToolTip.visible: ma.containsMouse
|
|
ToolTip.delay: 200
|
|
//: Could not send this message
|
|
ToolTip.text: root.error != "" ? qsTr("could-not-send-msg-error") + ":" + root.error : (root.ackd ? qsTr("acknowledged-label") : qsTr("pending-label"))
|
|
|
|
|
|
MouseArea {
|
|
id: ma
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
TextEdit {
|
|
id: copyhelper
|
|
visible: false
|
|
text: root.rawMessage
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: gcd.os == "android" ? parent : null
|
|
|
|
|
|
onPressAndHold: {
|
|
copyhelper.selectAll()
|
|
copyhelper.copy()
|
|
gcd.popup("message copied")
|
|
}
|
|
}
|
|
}
|
|
} |