Warning, /network/neochat/src/qml/HoverActions.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com> 0002 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0003 0004 import QtQuick 0005 import QtQuick.Controls as QQC2 0006 import QtQuick.Layouts 0007 0008 import org.kde.kirigami as Kirigami 0009 import org.kde.neochat 0010 0011 /** 0012 * @brief A component that provides a set of actions when a message is hovered in the timeline. 0013 * 0014 * There is also an icon to show that a message has come from a verified device in 0015 * encrypted chats. 0016 */ 0017 QQC2.Control { 0018 id: root 0019 0020 /** 0021 * @brief The current message delegate the actions are being shown on. 0022 */ 0023 property var delegate: null 0024 0025 /** 0026 * @brief The current room that user is viewing. 0027 */ 0028 required property NeoChatRoom currentRoom 0029 0030 /** 0031 * @brief Whether the actions should be shown. 0032 */ 0033 readonly property bool showActions: delegate && delegate.hovered 0034 0035 /** 0036 * @brief Request that the chat bar be focussed. 0037 */ 0038 signal focusChatBar 0039 0040 topPadding: 0 0041 bottomPadding: 0 0042 leftPadding: 0 0043 rightPadding: 0 0044 0045 x: delegate ? delegate.contentX + delegate.bubbleX : 0 0046 y: delegate ? delegate.mapToItem(parent, 0, 0).y + delegate.bubbleY - height + Kirigami.Units.smallSpacing : 0 0047 width: delegate ? delegate.bubbleWidth : Kirigami.Units.gridUnit * 4 0048 0049 visible: (root.hovered || root.showActions || showActionsTimer.running) && !Kirigami.Settings.isMobile 0050 onVisibleChanged: { 0051 if (visible) { 0052 // HACK: delay disapearing by 200ms, otherwise this can create some glitches 0053 // See https://invent.kde.org/network/neochat/-/issues/333 0054 showActionsTimer.restart(); 0055 } 0056 } 0057 Timer { 0058 id: showActionsTimer 0059 interval: 200 0060 } 0061 0062 contentItem: RowLayout { 0063 Item { 0064 Layout.fillWidth: true 0065 } 0066 Kirigami.Icon { 0067 source: "security-high" 0068 width: height 0069 height: root.height 0070 visible: root.delegate && root.delegate.verified 0071 HoverHandler { 0072 id: hover 0073 } 0074 QQC2.ToolTip.text: i18n("This message was sent from a verified device") 0075 QQC2.ToolTip.visible: hover.hovered 0076 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay 0077 } 0078 Kirigami.ActionToolBar { 0079 Layout.maximumWidth: maximumContentWidth + Kirigami.Units.largeSpacing 0080 rightPadding: Kirigami.Units.largeSpacing 0081 alignment: Qt.AlignRight 0082 flat: false 0083 display: QQC2.Button.IconOnly 0084 0085 actions: [ 0086 Kirigami.Action { 0087 text: i18n("React") 0088 icon.name: "preferences-desktop-emoticons" 0089 onTriggered: emojiDialog.open() 0090 }, 0091 Kirigami.Action { 0092 visible: root.delegate && root.delegate.author.isLocalUser && (root.delegate.delegateType === DelegateType.Emote || root.delegate.delegateType === DelegateType.Message) && !root.currentRoom.readOnly 0093 text: i18n("Edit") 0094 icon.name: "document-edit" 0095 onTriggered: { 0096 root.currentRoom.editCache.editId = root.delegate.eventId; 0097 root.currentRoom.mainCache.replyId = ""; 0098 } 0099 }, 0100 Kirigami.Action { 0101 visible: !root.currentRoom.readOnly 0102 text: i18n("Reply") 0103 icon.name: "mail-replied-symbolic" 0104 onTriggered: { 0105 root.currentRoom.mainCache.replyId = root.delegate.eventId; 0106 root.currentRoom.editCache.editId = ""; 0107 root.focusChatBar(); 0108 } 0109 }, 0110 Kirigami.Action { 0111 visible: !root.currentRoom.readOnly 0112 text: i18n("Reply in Thread") 0113 icon.name: "dialog-messages" 0114 onTriggered: { 0115 root.currentRoom.mainCache.replyId = root.delegate.eventId; 0116 root.currentRoom.mainCache.threadId = root.delegate.isThreaded ? root.delegate.threadRoot : root.delegate.eventId; 0117 root.currentRoom.editCache.editId = ""; 0118 root.focusChatBar(); 0119 } 0120 } 0121 ] 0122 0123 EmojiDialog { 0124 id: emojiDialog 0125 currentRoom: root.currentRoom 0126 showQuickReaction: true 0127 onChosen: emoji => { 0128 root.currentRoom.toggleReaction(root.delegate.eventId, emoji); 0129 if (!Kirigami.Settings.isMobile) { 0130 root.focusChatBar(); 0131 } 0132 } 0133 } 0134 } 0135 } 0136 }