[#2386] Fixed inline emoji reaction menu not showing on top of message
* Also replaced usage of synamic scoping with properties, signals and functions where possible Closes #2386
This commit is contained in:
parent
3c6571ac52
commit
0f0b239f2a
|
@ -18,40 +18,38 @@ import "./ChatColumn/ChatComponents"
|
|||
import "./data"
|
||||
import "../Wallet"
|
||||
|
||||
StackLayout {
|
||||
|
||||
Item {
|
||||
id: chatColumnLayout
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
Layout.minimumWidth: 300
|
||||
|
||||
property alias pinnedMessagesPopupComponent: pinnedMessagesPopupComponent
|
||||
|
||||
property int chatGroupsListViewCount: 0
|
||||
|
||||
property bool isReply: false
|
||||
property bool isImage: false
|
||||
|
||||
property bool isExtendedInput: isReply || isImage
|
||||
|
||||
property bool isConnected: false
|
||||
property string contactToRemove: ""
|
||||
|
||||
property bool showUsers: false
|
||||
|
||||
property var doNotShowAddToContactBannerToThose: ([])
|
||||
|
||||
property var onActivated: function () {
|
||||
chatInput.textInput.forceActiveFocus(Qt.MouseFocusReason)
|
||||
}
|
||||
|
||||
property string activeChatId: chatsModel.channelView.activeChannel.id
|
||||
property bool isBlocked: profileModel.contacts.isContactBlocked(activeChatId)
|
||||
property bool isContact: profileModel.contacts.isAdded(activeChatId)
|
||||
property bool contactRequestReceived: profileModel.contacts.contactRequestReceived(activeChatId)
|
||||
|
||||
property string currentNotificationChatId
|
||||
property string currentNotificationCommunityId
|
||||
property alias input: chatInput
|
||||
|
||||
property string hoveredMessage
|
||||
property string activeMessage
|
||||
property var currentTime: 0
|
||||
property var idMap: ({})
|
||||
property var suggestionsObj: ([])
|
||||
property Timer timer: Timer { }
|
||||
property var onActivated: function () {
|
||||
chatInput.textInput.forceActiveFocus(Qt.MouseFocusReason)
|
||||
}
|
||||
|
||||
function setHovered(messageId, hovered) {
|
||||
if (hovered) {
|
||||
|
@ -69,47 +67,6 @@ StackLayout {
|
|||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
chatInput.textInput.forceActiveFocus(Qt.MouseFocusReason)
|
||||
}
|
||||
|
||||
property var currentTime: 0
|
||||
|
||||
Timer {
|
||||
interval: 60000; // 1 min
|
||||
running: true;
|
||||
repeat: true
|
||||
triggeredOnStart: true
|
||||
onTriggered: {
|
||||
chatColumnLayout.currentTime = Date.now()
|
||||
}
|
||||
}
|
||||
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
Layout.minimumWidth: 300
|
||||
|
||||
currentIndex: chatsModel.channelView.activeChannelIndex > -1 && chatGroupsListViewCount > 0 ? 0 : 1
|
||||
|
||||
Component {
|
||||
id: pinnedMessagesPopupComponent
|
||||
PinnedMessagesPopup {
|
||||
id: pinnedMessagesPopup
|
||||
onClosed: destroy()
|
||||
}
|
||||
}
|
||||
|
||||
MessageContextMenu {
|
||||
id: messageContextMenu
|
||||
}
|
||||
|
||||
StatusImageModal {
|
||||
id: imagePopup
|
||||
}
|
||||
|
||||
property var idMap: ({})
|
||||
property var suggestionsObj: ([])
|
||||
|
||||
function addSuggestionFromMessageList(i){
|
||||
const contactAddr = chatsModel.messageView.messageList.getMessageData(i, "publicKey");
|
||||
if(idMap[contactAddr]) return;
|
||||
|
@ -155,7 +112,6 @@ StackLayout {
|
|||
isImage = false;
|
||||
let replyMessageIndex = chatsModel.messageView.messageList.getMessageIndex(SelectedMessage.messageId);
|
||||
if (replyMessageIndex === -1) return;
|
||||
|
||||
let userName = chatsModel.messageView.messageList.getMessageData(replyMessageIndex, "userName")
|
||||
let message = chatsModel.messageView.messageList.getMessageData(replyMessageIndex, "message")
|
||||
let identicon = chatsModel.messageView.messageList.getMessageData(replyMessageIndex, "identicon")
|
||||
|
@ -180,25 +136,6 @@ StackLayout {
|
|||
txModalLoader.close()
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: profileModel.contacts
|
||||
onContactListChanged: {
|
||||
isBlocked = profileModel.contacts.isContactBlocked(activeChatId);
|
||||
}
|
||||
onContactBlocked: {
|
||||
chatsModel.messageView.removeMessagesByUserId(publicKey)
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: chatsModel.channelView
|
||||
onActiveChannelChanged: {
|
||||
chatsModel.messageView.hideLoadingIndicator()
|
||||
SelectedMessage.reset();
|
||||
chatColumn.isReply = false;
|
||||
}
|
||||
}
|
||||
|
||||
function clickOnNotification() {
|
||||
// So far we're just showing this app as the top most window. Once we decide about the way
|
||||
// how to notify the app what channle should be displayed within the app when user clicks
|
||||
|
@ -210,19 +147,26 @@ StackLayout {
|
|||
applicationWindow.requestActivate()
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: systemTray
|
||||
onMessageClicked: function () {
|
||||
clickOnNotification()
|
||||
}
|
||||
function positionAtMessage(messageId) {
|
||||
stackLayoutChatMessages.children[stackLayoutChatMessages.currentIndex].item.scrollToMessage(messageId)
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: timer
|
||||
interval: 60000; // 1 min
|
||||
running: true
|
||||
repeat: true
|
||||
triggeredOnStart: true
|
||||
onTriggered: {
|
||||
chatColumnLayout.currentTime = Date.now()
|
||||
}
|
||||
}
|
||||
|
||||
function positionAtMessage(messageId) {
|
||||
stackLayoutChatMessages.children[stackLayoutChatMessages.currentIndex].item.scrollToMessage(messageId)
|
||||
StackLayout {
|
||||
anchors.fill: parent
|
||||
currentIndex: chatsModel.channelView.activeChannelIndex > -1 && chatGroupsListViewCount > 0 ? 0 : 1
|
||||
|
||||
StatusImageModal {
|
||||
id: imagePopup
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
|
@ -306,20 +250,13 @@ StackLayout {
|
|||
}
|
||||
|
||||
Rectangle {
|
||||
Component.onCompleted: {
|
||||
isConnected = chatsModel.isOnline
|
||||
if(!isConnected){
|
||||
connectedStatusRect.visible = true
|
||||
}
|
||||
}
|
||||
|
||||
id: connectedStatusRect
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
z: 60
|
||||
height: 40
|
||||
color: isConnected ? Style.current.green : Style.current.darkGrey
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
z: 60
|
||||
visible: false
|
||||
color: isConnected ? Style.current.green : Style.current.darkGrey
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
@ -346,6 +283,12 @@ StackLayout {
|
|||
}
|
||||
}
|
||||
}
|
||||
Component.onCompleted: {
|
||||
isConnected = chatsModel.isOnline
|
||||
if(!isConnected){
|
||||
connectedStatusRect.visible = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AddToContactBanner {
|
||||
|
@ -363,9 +306,11 @@ StackLayout {
|
|||
Loader {
|
||||
active: false
|
||||
sourceComponent: ChatMessages {
|
||||
id: chatMessages
|
||||
messageList: model.messages
|
||||
currentTime: chatColumnLayout.currentTime
|
||||
messageContextMenuInst: MessageContextMenu {
|
||||
reactionModel: EmojiReactions { }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -381,10 +326,6 @@ StackLayout {
|
|||
}
|
||||
}
|
||||
|
||||
EmojiReactions {
|
||||
id: reactionModel
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: chatsModel.channelView
|
||||
onActiveChannelChanged: {
|
||||
|
@ -446,7 +387,7 @@ StackLayout {
|
|||
|
||||
Component {
|
||||
id: loadingIndicator
|
||||
LoadingAnimation {}
|
||||
LoadingAnimation { }
|
||||
}
|
||||
|
||||
StatusChatInput {
|
||||
|
@ -510,7 +451,7 @@ StackLayout {
|
|||
}
|
||||
}
|
||||
|
||||
EmptyChat {}
|
||||
EmptyChat { }
|
||||
|
||||
Loader {
|
||||
id: txModalLoader
|
||||
|
@ -525,6 +466,7 @@ StackLayout {
|
|||
this.sourceComponent = undefined
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: cmpSendTransactionNoEns
|
||||
ChatCommandModal {
|
||||
|
@ -552,6 +494,7 @@ StackLayout {
|
|||
selectRecipient.readOnly: true
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: cmpReceiveTransaction
|
||||
ChatCommandModal {
|
||||
|
@ -579,6 +522,7 @@ StackLayout {
|
|||
selectRecipient.readOnly: true
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: cmpSendTransactionWithEns
|
||||
SendModal {
|
||||
|
@ -610,6 +554,40 @@ StackLayout {
|
|||
y: topBar.height
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: profileModel.contacts
|
||||
onContactListChanged: {
|
||||
isBlocked = profileModel.contacts.isContactBlocked(activeChatId);
|
||||
}
|
||||
onContactBlocked: {
|
||||
chatsModel.messageView.removeMessagesByUserId(publicKey)
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: chatsModel.channelView
|
||||
onActiveChannelChanged: {
|
||||
chatsModel.messageView.hideLoadingIndicator()
|
||||
SelectedMessage.reset();
|
||||
chatColumn.isReply = false;
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: systemTray
|
||||
onMessageClicked: function () {
|
||||
clickOnNotification()
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: pinnedMessagesPopupComponent
|
||||
PinnedMessagesPopup {
|
||||
id: pinnedMessagesPopup
|
||||
onClosed: destroy()
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: chatsModel.messageView
|
||||
|
||||
|
@ -662,6 +640,11 @@ StackLayout {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
chatInput.textInput.forceActiveFocus(Qt.MouseFocusReason)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*##^##
|
||||
|
|
|
@ -19,6 +19,7 @@ SplitView {
|
|||
property alias chatLogView: chatLogView
|
||||
property alias scrollToMessage: chatLogView.scrollToMessage
|
||||
|
||||
property var messageContextMenuInst
|
||||
property var messageList: MessagesData {}
|
||||
property bool loadingMessages: false
|
||||
property real scrollY: chatLogView.visibleArea.yPosition * chatLogView.contentHeight
|
||||
|
@ -248,11 +249,9 @@ SplitView {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
model: messageListDelegate
|
||||
section.property: "sectionIdentifier"
|
||||
section.criteria: ViewSection.FullString
|
||||
|
||||
}
|
||||
|
||||
MessageDialog {
|
||||
|
@ -317,6 +316,8 @@ SplitView {
|
|||
z = index;
|
||||
}
|
||||
}
|
||||
messageContextMenu: svRoot.messageContextMenuInst
|
||||
|
||||
// This is used in order to have access to the previous message and determine the timestamp
|
||||
// we can't rely on the index because the sequence of messages is not ordered on the nim side
|
||||
prevMessageIndex: {
|
||||
|
|
|
@ -7,6 +7,17 @@ import "./MessageComponents"
|
|||
import "../components"
|
||||
|
||||
Item {
|
||||
id: root
|
||||
width: parent.width
|
||||
anchors.right: !isCurrentUser ? undefined : parent.right
|
||||
height: {
|
||||
switch (contentType) {
|
||||
case Constants.chatIdentifier:
|
||||
return (childrenRect.height + 50);
|
||||
default: return childrenRect.height;
|
||||
}
|
||||
}
|
||||
z: (typeof chatLogView === "undefined") ? 1 : (chatLogView.count - index)
|
||||
property string fromAuthor: "0x0011223344556677889910"
|
||||
property string userName: "Jotaro Kujo"
|
||||
property string alias: ""
|
||||
|
@ -42,15 +53,7 @@ Item {
|
|||
property string replaces: ""
|
||||
property bool isEdited: false
|
||||
property bool showEdit: true
|
||||
|
||||
z: {
|
||||
if (typeof chatLogView === "undefined") {
|
||||
return 1
|
||||
}
|
||||
|
||||
return chatLogView.count - index
|
||||
}
|
||||
|
||||
property var messageContextMenu
|
||||
property string displayUserName: {
|
||||
if (isCurrentUser) {
|
||||
//% "You"
|
||||
|
@ -183,17 +186,6 @@ Item {
|
|||
}
|
||||
}
|
||||
|
||||
id: root
|
||||
width: parent.width
|
||||
anchors.right: !isCurrentUser ? undefined : parent.right
|
||||
height: {
|
||||
switch(contentType) {
|
||||
case Constants.chatIdentifier:
|
||||
return childrenRect.height + 50
|
||||
default: return childrenRect.height
|
||||
}
|
||||
}
|
||||
|
||||
property var clickMessage: function(isProfileClick, isSticker = false, isImage = false, image = null, emojiOnly = false, hideEmojiPicker = false) {
|
||||
if (placeholderMessage || activityCenterMessage) {
|
||||
return
|
||||
|
@ -210,17 +202,17 @@ Item {
|
|||
|
||||
// Get contact nickname
|
||||
let nickname = appMain.getUserNickname(fromAuthor)
|
||||
messageContextMenu.messageId = root.messageId
|
||||
messageContextMenu.linkUrls = root.linkUrls
|
||||
messageContextMenu.isProfile = !!isProfileClick
|
||||
messageContextMenu.isSticker = isSticker
|
||||
messageContextMenu.emojiOnly = emojiOnly
|
||||
messageContextMenu.hideEmojiPicker = hideEmojiPicker
|
||||
messageContextMenu.pinnedMessage = pinnedMessage
|
||||
messageContextMenu.show(userName, fromAuthor, root.profileImageSource || identicon, plainText, nickname, emojiReactionsModel)
|
||||
messageContextMenu.messageId = root.messageId;
|
||||
messageContextMenu.linkUrls = root.linkUrls;
|
||||
messageContextMenu.isProfile = !!isProfileClick;
|
||||
messageContextMenu.isSticker = isSticker;
|
||||
messageContextMenu.emojiOnly = emojiOnly;
|
||||
messageContextMenu.hideEmojiPicker = hideEmojiPicker;
|
||||
messageContextMenu.pinnedMessage = pinnedMessage;
|
||||
messageContextMenu.show(userName, fromAuthor, root.profileImageSource || identicon, plainText, nickname, emojiReactionsModel);
|
||||
// Position the center of the menu where the mouse is
|
||||
if (messageContextMenu.x + messageContextMenu.width + Style.current.padding < root.width) {
|
||||
messageContextMenu.x = messageContextMenu.x - messageContextMenu.width / 2
|
||||
messageContextMenu.x = messageContextMenu.x - messageContextMenu.width / 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -446,6 +438,10 @@ Item {
|
|||
contentType: root.contentType
|
||||
showEdit: root.showEdit
|
||||
container: root
|
||||
messageContextMenu: root.messageContextMenu
|
||||
onAddEmoji: {
|
||||
root.clickMessage(isProfileClick, isSticker, isImage , image, emojiOnly, hideEmojiPicker);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,13 +5,14 @@ import "../../../../../shared/status"
|
|||
import "../../../../../imports"
|
||||
|
||||
Rectangle {
|
||||
id: buttonsContainer
|
||||
property bool parentIsHovered: false
|
||||
property bool showEdit: true
|
||||
signal hoverChanged(bool hovered)
|
||||
property int containerMargin: 2
|
||||
property int contentType: 2
|
||||
property var messageContextMenu
|
||||
|
||||
id: buttonsContainer
|
||||
visible: !activityCenterMessage &&
|
||||
(buttonsContainer.parentIsHovered || isMessageActive)
|
||||
&& contentType !== Constants.transactionType
|
||||
|
@ -65,10 +66,10 @@ Rectangle {
|
|||
setMessageActive(messageId, true)
|
||||
clickMessage(false, false, false, null, true)
|
||||
if (!forceHoverHandler) {
|
||||
messageContextMenu.x = buttonsContainer.x + buttonsContainer.width - messageContextMenu.width
|
||||
buttonsContainer.messageContextMenu.x = buttonsContainer.x + buttonsContainer.width - buttonsContainer.messageContextMenu.width
|
||||
|
||||
// The Math.max is to make sure that the menu is rendered
|
||||
messageContextMenu.y -= Math.max(messageContextMenu.emojiContainer.height, 56) + Style.current.padding
|
||||
buttonsContainer.messageContextMenu.y -= Math.max(buttonsContainer.messageContextMenu.emojiContainer.height, 56) + Style.current.padding
|
||||
}
|
||||
}
|
||||
onHoveredChanged: {
|
||||
|
|
|
@ -5,6 +5,7 @@ import "../../../../../shared/status"
|
|||
import "../../../../../imports"
|
||||
|
||||
Item {
|
||||
id: root
|
||||
property var clickMessage: function () {}
|
||||
property int chatHorizontalPadding: Style.current.halfPadding
|
||||
property int chatVerticalPadding: 7
|
||||
|
@ -16,8 +17,8 @@ Item {
|
|||
property bool isMessageActive: typeof activeMessage !== "undefined" && activeMessage === messageId
|
||||
property bool headerRepeatCondition: (authorCurrentMsg !== authorPrevMsg || shouldRepeatHeader || dateGroupLbl.visible || chatReply.active)
|
||||
property bool showEdit: true
|
||||
|
||||
id: root
|
||||
property var messageContextMenu
|
||||
signal addEmoji(bool isProfileClick, bool isSticker, bool isImage , var image, bool emojiOnly, bool hideEmojiPicker)
|
||||
|
||||
width: parent.width
|
||||
height: messageContainer.height + messageContainer.anchors.topMargin
|
||||
|
@ -42,6 +43,7 @@ Item {
|
|||
// This is not exactly like the design because the hover becomes messed up with the buttons on top of another Message
|
||||
anchors.topMargin: -Style.current.halfPadding
|
||||
showEdit: root.showEdit
|
||||
messageContextMenu: root.messageContextMenu
|
||||
}
|
||||
|
||||
Loader {
|
||||
|
@ -410,6 +412,11 @@ Item {
|
|||
sourceComponent: Component {
|
||||
EmojiReactions {
|
||||
onHoverChanged: setHovered(messageId, hovered)
|
||||
onAddEmojiClicked: {
|
||||
root.addEmoji(false, false, false, null, true, false);
|
||||
messageContextMenu.x = (messageContainer.chatText.textField.leftPadding + 4);
|
||||
messageContextMenu.y -= (56 + Style.current.padding);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,13 +6,14 @@ import "../../../../../shared/status"
|
|||
import "../../../../../imports"
|
||||
|
||||
Item {
|
||||
property int imageMargin: 4
|
||||
signal hoverChanged(bool hovered)
|
||||
|
||||
id: root
|
||||
height: 20
|
||||
width: childrenRect.width
|
||||
|
||||
property int imageMargin: 4
|
||||
signal hoverChanged(bool hovered)
|
||||
signal addEmojiClicked()
|
||||
|
||||
function lastTwoItems(nodes) {
|
||||
//% " and "
|
||||
return nodes.join(qsTrId("-and-"));
|
||||
|
@ -210,7 +211,7 @@ Item {
|
|||
if (typeof isMessageActive !== "undefined") {
|
||||
setMessageActive(messageId, true)
|
||||
}
|
||||
clickMessage(false, false, false, null, true)
|
||||
root.addEmojiClicked();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,9 @@ import "../../../../shared/status"
|
|||
import "./"
|
||||
|
||||
PopupMenu {
|
||||
id: messageContextMenu
|
||||
width: messageContextMenu.isProfile ? profileHeader.width : emojiContainer.width
|
||||
|
||||
property string messageId
|
||||
property bool isProfile: false
|
||||
property bool isSticker: false
|
||||
|
@ -18,10 +21,6 @@ PopupMenu {
|
|||
property bool isCurrentUser: false
|
||||
property string linkUrls: ""
|
||||
property alias emojiContainer: emojiContainer
|
||||
|
||||
id: messageContextMenu
|
||||
width: messageContextMenu.isProfile ? profileHeader.width : emojiContainer.width
|
||||
|
||||
property var identicon: ""
|
||||
property var userName: ""
|
||||
property string nickname: ""
|
||||
|
@ -29,14 +28,13 @@ PopupMenu {
|
|||
property var text: ""
|
||||
property var emojiReactionsReactedByUser: []
|
||||
property var onClickEdit: function(){}
|
||||
property var reactionModel
|
||||
|
||||
subMenuIcons: [
|
||||
{
|
||||
subMenuIcons: [{
|
||||
source: Qt.resolvedUrl("../../../../shared/img/copy-to-clipboard-icon"),
|
||||
width: 16,
|
||||
height: 16
|
||||
}
|
||||
]
|
||||
}]
|
||||
|
||||
function show(userNameParam, fromAuthorParam, identiconParam, textParam, nicknameParam, emojiReactionsModel) {
|
||||
userName = userNameParam || ""
|
||||
|
@ -50,7 +48,7 @@ PopupMenu {
|
|||
newEmojiReactions[emojiReaction.emojiId] = emojiReaction.currentUserReacted
|
||||
})
|
||||
}
|
||||
emojiReactionsReactedByUser = newEmojiReactions
|
||||
emojiReactionsReactedByUser = newEmojiReactions;
|
||||
|
||||
const numLinkUrls = messageContextMenu.linkUrls.split(" ").length
|
||||
copyLinkMenu.enabled = numLinkUrls > 1
|
||||
|
@ -60,10 +58,9 @@ PopupMenu {
|
|||
|
||||
Item {
|
||||
id: emojiContainer
|
||||
visible: !hideEmojiPicker && (messageContextMenu.emojiOnly || !messageContextMenu.isProfile)
|
||||
width: emojiRow.width
|
||||
height: visible ? emojiRow.height : 0
|
||||
|
||||
visible: !hideEmojiPicker && (messageContextMenu.emojiOnly || !messageContextMenu.isProfile)
|
||||
Row {
|
||||
id: emojiRow
|
||||
spacing: Style.current.smallPadding
|
||||
|
@ -85,15 +82,16 @@ PopupMenu {
|
|||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
property bool hovered: false
|
||||
|
||||
Item {
|
||||
id: profileHeader
|
||||
visible: messageContextMenu.isProfile
|
||||
width: 200
|
||||
height: visible ? profileImage.height + username.height + Style.current.padding : 0
|
||||
color: hovered ? Style.current.backgroundHover : Style.current.transparent
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
visible: mouseArea.containsMouse
|
||||
color: Style.current.backgroundHover
|
||||
}
|
||||
StatusImageIdenticon {
|
||||
id: profileImage
|
||||
source: identicon
|
||||
|
@ -120,15 +118,10 @@ PopupMenu {
|
|||
}
|
||||
|
||||
MouseArea {
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
id: mouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onEntered: {
|
||||
profileHeader.hovered = true
|
||||
}
|
||||
onExited: {
|
||||
profileHeader.hovered = false
|
||||
}
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
openProfilePopup(userName, fromAuthor, identicon);
|
||||
messageContextMenu.close()
|
||||
|
|
Loading…
Reference in New Issue