mirror of
https://github.com/status-im/status-desktop.git
synced 2025-02-19 01:58:52 +00:00
similar to the profile dialog, we need to add an opacity mask in front of the contentItem to ensure the rounded corners at the bottom are preserved when we have no margins/padding inside the popup Fixes #7759
179 lines
6.1 KiB
QML
179 lines
6.1 KiB
QML
import QtQuick 2.14
|
|
import QtQuick.Controls 2.14
|
|
import QtQuick.Layouts 1.14
|
|
import QtQml.Models 2.14
|
|
import QtGraphicalEffects 1.14
|
|
|
|
import StatusQ.Core 0.1
|
|
import StatusQ.Controls 0.1
|
|
import StatusQ.Popups.Dialog 0.1
|
|
|
|
import utils 1.0
|
|
import shared.views.chat 1.0
|
|
|
|
StatusDialog {
|
|
id: root
|
|
|
|
property var store
|
|
property var messageStore
|
|
property var pinnedMessagesModel //this doesn't belong to the messageStore, it is a part of the ChatContentStore, but we didn't introduce it yet.
|
|
property string messageToPin
|
|
property string messageToUnpin
|
|
property var emojiReactionsModel
|
|
|
|
width: 800
|
|
height: 428
|
|
padding: 0
|
|
|
|
title: root.messageToPin ? qsTr("Pin limit reached") : qsTr("Pinned messages")
|
|
subtitle: root.messageToPin ? qsTr("Unpin a previous message first")
|
|
: qsTr("%n message(s)", "", pinnedMessageListView.count)
|
|
|
|
contentItem: ColumnLayout {
|
|
id: column
|
|
|
|
StatusBaseText {
|
|
visible: pinnedMessageListView.count === 0
|
|
text: qsTr("Pinned messages will appear here.")
|
|
Layout.alignment: Qt.AlignCenter
|
|
verticalAlignment: Text.AlignVCenter
|
|
color: Style.current.secondaryText
|
|
}
|
|
|
|
ButtonGroup {
|
|
id: pinButtonGroup
|
|
}
|
|
|
|
StatusListView {
|
|
id: pinnedMessageListView
|
|
model: root.pinnedMessagesModel
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: count
|
|
|
|
delegate: Item {
|
|
id: messageDelegate
|
|
|
|
width: ListView.view.width
|
|
height: messageItem.height
|
|
|
|
MessageView {
|
|
id: messageItem
|
|
|
|
width: parent.width
|
|
|
|
rootStore: root.store
|
|
messageStore: root.messageStore
|
|
messageContextMenu: msgContextMenu
|
|
|
|
messageId: model.id
|
|
responseToMessageWithId: model.responseToMessageWithId
|
|
senderId: model.senderId
|
|
senderDisplayName: model.senderDisplayName
|
|
senderOptionalName: model.senderOptionalName
|
|
senderIsEnsVerified: model.senderEnsVerified
|
|
senderIsAdded: model.senderIsAdded
|
|
senderIcon: model.senderIcon
|
|
senderTrustStatus: model.senderTrustStatus
|
|
amISender: model.amISender
|
|
messageText: model.messageText
|
|
messageImage: model.messageImage
|
|
messageTimestamp: model.timestamp
|
|
messageOutgoingStatus: model.outgoingStatus
|
|
messageContentType: model.contentType
|
|
pinnedMessage: model.pinned
|
|
messagePinnedBy: model.pinnedBy
|
|
linkUrls: model.links
|
|
transactionParams: model.transactionParameters
|
|
|
|
// This is possible since we have all data loaded before we load qml.
|
|
// When we fetch messages to fulfill a gap we have to set them at once.
|
|
prevMessageIndex: index - 1
|
|
prevMessageAsJsonObj: root.messageStore? root.messageStore.getMessageByIndexAsJson(index - 1) : {}
|
|
nextMessageIndex: index + 1
|
|
nextMessageAsJsonObj: root.messageStore? root.messageStore.getMessageByIndexAsJson(index + 1) : {}
|
|
|
|
// Additional params
|
|
isInPinnedPopup: true
|
|
disableHover: !!root.messageToPin
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
enabled: !!root.messageToPin
|
|
cursorShape: Qt.PointingHandCursor
|
|
z: 55
|
|
onClicked: {
|
|
if (!radio.checked)
|
|
radio.checked = true
|
|
}
|
|
}
|
|
|
|
StatusRadioButton {
|
|
id: radio
|
|
visible: !!root.messageToPin
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Style.current.bigPadding
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
ButtonGroup.group: pinButtonGroup
|
|
onCheckedChanged: { // NB this should be `onToggled` but MouseArea above handles the whole delegate
|
|
root.messageToUnpin = checked ? model.id : ""
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
MessageContextMenuView {
|
|
id: msgContextMenu
|
|
reactionModel: root.emojiReactionsModel
|
|
store: root.store
|
|
pinnedPopup: true
|
|
pinnedMessage: true
|
|
onShouldCloseParentPopup: {
|
|
root.close()
|
|
}
|
|
|
|
onUnpinMessage: {
|
|
root.messageStore.unpinMessage(messageId)
|
|
}
|
|
|
|
onJumpToMessage: {
|
|
root.messageStore.messageModule.jumpToMessage(messageId)
|
|
}
|
|
}
|
|
|
|
layer.enabled: root.visible
|
|
layer.effect: OpacityMask {
|
|
maskSource: Rectangle {
|
|
width: column.width
|
|
height: column.height
|
|
radius: background.radius
|
|
|
|
Rectangle {
|
|
width: parent.width
|
|
height: parent.radius
|
|
anchors.top: parent.top
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
footer: StatusDialogFooter {
|
|
id: footer
|
|
visible: !!root.messageToPin
|
|
rightButtons: ObjectModel {
|
|
StatusButton {
|
|
visible: footer.visible
|
|
enabled: !!root.messageToUnpin && pinButtonGroup.checkedButton
|
|
text: qsTr("Unpin selected message and pin new message")
|
|
onClicked: {
|
|
root.messageStore.unpinMessage(root.messageToUnpin)
|
|
root.messageToUnpin = ""
|
|
root.messageStore.pinMessage(root.messageToPin)
|
|
root.messageToPin = ""
|
|
root.close()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|