The below mentioned features have been implemented in this component
1. Profile Picture of sender
2. Sender details - name, secondaryName, chatID
3. Text content
4. Image Content
5. Sticker Content
6. Audio Content
7. Reply Component with all the details for the message beinf replied to
8. Pinned component for Pinned message
9. Edit Component to edit the message
10. Loades to load the below -
a. Link content loader
b. transaction content
c. invitation bubble
d. footer - in this case to show emoji reactions to a message
e. quick actions loader to show the related quick actions
126 lines
3.4 KiB
QML
126 lines
3.4 KiB
QML
import QtQuick 2.3
|
|
import QtGraphicalEffects 1.13
|
|
|
|
import StatusQ.Components 0.1
|
|
import StatusQ.Core 0.1
|
|
import StatusQ.Core.Theme 0.1
|
|
|
|
Loader {
|
|
id: statusSticker
|
|
|
|
property bool noHover: false
|
|
property bool noMouseArea: false
|
|
property StatusImageSettings image: StatusImageSettings {
|
|
width: 140
|
|
height: 140
|
|
}
|
|
|
|
signal loaded()
|
|
signal clicked()
|
|
|
|
active: visible
|
|
|
|
sourceComponent: Rectangle {
|
|
id: root
|
|
|
|
color: Theme.palette.baseColor2
|
|
radius: 16
|
|
|
|
width: image.width
|
|
height: image.height
|
|
|
|
function reload() {
|
|
// From the documentation (https://doc.qt.io/qt-5/qml-qtquick-image.html#sourceSize-prop)
|
|
// Note: Changing this property dynamically causes the image source to
|
|
// be reloaded, potentially even from the network, if it is not in the
|
|
// disk cache.
|
|
const oldSource = sticker.source
|
|
sticker.cache = false
|
|
sticker.sourceSize.width += 1
|
|
sticker.sourceSize.width -= 1
|
|
sticker.cache = true
|
|
}
|
|
|
|
Loader {
|
|
id: loader
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
}
|
|
|
|
Image {
|
|
id: sticker
|
|
anchors.fill: parent
|
|
horizontalAlignment: Image.AlignHCenter
|
|
verticalAlignment: Image.AlignVCenter
|
|
cache: true
|
|
source: image.source
|
|
|
|
onStatusChanged: {
|
|
if (status === Image.Ready) {
|
|
statusSticker.loaded()
|
|
}
|
|
}
|
|
MouseArea {
|
|
enabled: !noMouseArea && (sticker.status === Image.Ready)
|
|
cursorShape: noHover ? Qt.ArrowCursor : Qt.PointingHandCursor
|
|
anchors.fill: parent
|
|
onClicked: statusSticker.clicked()
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: loadingIndicator
|
|
StatusLoadingIndicator {
|
|
width: 24
|
|
height: 24
|
|
color: Theme.palette.baseColor1
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: reload
|
|
StatusIcon {
|
|
icon: "refresh"
|
|
color: Theme.palette.directColor1
|
|
mipmap: false
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: root.reload()
|
|
}
|
|
}
|
|
}
|
|
|
|
states: [
|
|
State {
|
|
name: "loading"
|
|
when: sticker.status === Image.Loading
|
|
PropertyChanges {
|
|
target: loader
|
|
sourceComponent: loadingIndicator
|
|
}
|
|
},
|
|
State {
|
|
name: "error"
|
|
when: sticker.status === Image.Error
|
|
PropertyChanges {
|
|
target: loader
|
|
sourceComponent: reload
|
|
}
|
|
},
|
|
State {
|
|
name: "ready"
|
|
when: sticker.status === Image.Ready
|
|
PropertyChanges {
|
|
target: root
|
|
color: "transparent"
|
|
}
|
|
PropertyChanges {
|
|
target: loader
|
|
sourceComponent: undefined
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|