diff --git a/src/app/commoncomponents/LineEditContextMenu.qml b/src/app/commoncomponents/LineEditContextMenu.qml index 7f02db97b57c7d86fffd5fc9de639b8e457da65f..5cc63660ca6f5872405640bb796a0bc96424777f 100644 --- a/src/app/commoncomponents/LineEditContextMenu.qml +++ b/src/app/commoncomponents/LineEditContextMenu.qml @@ -37,6 +37,7 @@ ContextMenuAutoLoader { canTrigger: lineEditObj.selectedText.length itemName: JamiStrings.copy + hasIcon: false onClicked: { lineEditObj.copy(); } @@ -46,7 +47,7 @@ ContextMenuAutoLoader { canTrigger: lineEditObj.selectedText.length && !selectOnly itemName: JamiStrings.cut - + hasIcon: false onClicked: { lineEditObj.cut(); } @@ -56,6 +57,7 @@ ContextMenuAutoLoader { canTrigger: !selectOnly itemName: JamiStrings.paste + hasIcon: false onClicked: { if (customizePaste) root.contextMenuRequirePaste(); @@ -76,10 +78,6 @@ ContextMenuAutoLoader { lineEditObj.select(selectionStart, selectionEnd); } - contextMenuItemPreferredHeight: JamiTheme.lineEditContextMenuItemsHeight - contextMenuItemPreferredWidth: JamiTheme.lineEditContextMenuItemsWidth - contextMenuSeparatorPreferredHeight: JamiTheme.lineEditContextMenuSeparatorsHeight - Connections { target: root.item enabled: root.status === Loader.Ready diff --git a/src/app/commoncomponents/MessageOptionsPopup.qml b/src/app/commoncomponents/MessageOptionsPopup.qml deleted file mode 100644 index c562a791451dad5e9b0f08a87947888ad9b0740e..0000000000000000000000000000000000000000 --- a/src/app/commoncomponents/MessageOptionsPopup.qml +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (C) 2022-2023 Savoir-faire Linux Inc. - * Author: Nicolas Vengeon <nicolas.vengeon@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -import QtQuick -import QtQuick.Controls -import Qt5Compat.GraphicalEffects -import QtQuick.Layouts - -import net.jami.Models 1.1 -import net.jami.Adapters 1.1 -import net.jami.Constants 1.1 - -Popup { - id: root - - width: emojiColumn.width + JamiTheme.emojiMargins - height: emojiColumn.height + JamiTheme.emojiMargins - padding: 0 - background.visible: false - - required property var emojiReactions - property var emojiReplied: emojiReactions.ownEmojis - - required property string msgId - required property string msgBody - required property bool isOutgoing - required property int type - required property string transferName - required property Item msgBubble - required property ListView listView - - property string transferId: msgId - property string location: msgBody - property bool closeWithoutAnimation: false - property var emojiPicker - - focus: true - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - - function xPositionProvider(width) { - // Use the width at function scope to retrigger property evaluation. - const listViewWidth = listView.width - if (isOutgoing) { - const leftMargin = msgBubble.mapToItem(listView, 0, 0).x - return width > leftMargin ? -leftMargin : -width - } else { - const rightMargin = listViewWidth - (msgBubble.x + msgBubble.width) - return width > rightMargin ? msgBubble.width - width : msgBubble.width - } - } - function yPositionProvider(height) { - const topOffset = msgBubble.mapToItem(listView, 0, 0).y - if (topOffset < 0) return -topOffset - const bottomOffset = topOffset + height - listView.height - if (bottomOffset > 0) return -bottomOffset - return 0 - } - x: xPositionProvider(width) - y: yPositionProvider(height) - - signal addMoreEmoji - onAddMoreEmoji: { - JamiQmlUtils.updateMessageBarButtonsPoints() - openEmojiPicker() - } - - function openEmojiPicker() { - var component = WITH_WEBENGINE ? - Qt.createComponent("qrc:/webengine/emojipicker/EmojiPicker.qml") : - Qt.createComponent("qrc:/nowebengine/EmojiPicker.qml") - emojiPicker = component.createObject(root.parent, { listView: listView }) - emojiPicker.emojiIsPicked.connect(function(content) { - if (emojiReplied.includes(content)) { - MessagesAdapter.removeEmojiReaction(CurrentConversation.id, content, msgId) - } else { - MessagesAdapter.addEmojiReaction(CurrentConversation.id, content, msgId) - } - }) - if (emojiPicker !== null) { - root.opacity = 0 - emojiPicker.closed.connect(() => close()) - emojiPicker.x = xPositionProvider(JamiTheme.emojiPickerWidth) - emojiPicker.y = yPositionProvider(JamiTheme.emojiPickerHeight) - emojiPicker.open() - } else { - console.log("Error creating emojiPicker from message options popup"); - } - } - - // Close the picker when listView vertical properties change. - property real listViewHeight: listView.height - onListViewHeightChanged: close() - property bool isScrolling: listView.verticalScrollBar.active - onIsScrollingChanged: close() - - onOpened: root.closeWithoutAnimation = false - onClosed: if (emojiPicker) emojiPicker.closeEmojiPicker() - - function getModel() { - const defaultModel = ["ðŸ‘", "👎", "😂"] - const reactedEmojis = Array.isArray(emojiReplied) ? emojiReplied.slice(0, defaultModel.length) : [] - const uniqueEmojis = Array.from(new Set(reactedEmojis)) - const missingEmojis = defaultModel.filter(emoji => !uniqueEmojis.includes(emoji)) - return uniqueEmojis.concat(missingEmojis) - } - - Rectangle { - id: bubble - - color: JamiTheme.chatviewBgColor - anchors.fill: parent - radius: JamiTheme.modalPopupRadius - - ColumnLayout { - id: emojiColumn - - anchors.centerIn: parent - - RowLayout { - id: emojiRow - Layout.alignment: Qt.AlignCenter - - Repeater { - model: root.getModel() - - delegate: Button { - id: emojiButton - - height: 50 - width: 50 - text: modelData - font.pointSize: JamiTheme.emojiBubbleSize - - Text { - visible: emojiButton.hovered - anchors.centerIn: parent - text: modelData - font.pointSize: JamiTheme.emojiBubbleSizeBig - z: 1 - } - - background: Rectangle { - anchors.fill: parent - opacity: emojiReplied ? (emojiReplied.includes(modelData) ? 1 : 0) : 0 - color: JamiTheme.emojiReactPushButtonColor - radius: 10 - } - - onClicked: { - if (emojiReplied.includes(modelData)) - MessagesAdapter.removeEmojiReaction(CurrentConversation.id,text,msgId) - else - MessagesAdapter.addEmojiReaction(CurrentConversation.id,text,msgId) - close() - } - } - } - PushButton { - toolTipText: JamiStrings.moreEmojis - source: JamiResources.add_reaction_svg - normalColor: JamiTheme.emojiReactBubbleBgColor - imageColor: JamiTheme.emojiReactPushButtonColor - visible: WITH_WEBENGINE - onClicked: { - root.closeWithoutAnimation = true - root.addMoreEmoji() - //close() - } - } - } - - Rectangle { - Layout.margins: 5 - color: JamiTheme.timestampColor - Layout.fillWidth: true - Layout.preferredHeight: 1 - radius: width * 0.5 - opacity: 0.6 - } - - MessageOptionButton { - textButton: JamiStrings.copy - iconSource: JamiResources.copy_svg - Layout.fillWidth: true - Layout.margins: 5 - onClicked: { - UtilsAdapter.setClipboardText(msgBody) - close() - } - } - - MessageOptionButton { - visible: type === Interaction.Type.DATA_TRANSFER - textButton: JamiStrings.saveFile - iconSource: JamiResources.save_file_svg - Layout.fillWidth: true - Layout.margins: 5 - onClicked: { - MessagesAdapter.copyToDownloads(root.transferId, root.transferName) - close() - } - } - - MessageOptionButton { - visible: type === Interaction.Type.DATA_TRANSFER - textButton: JamiStrings.openLocation - iconSource: JamiResources.round_folder_24dp_svg - Layout.fillWidth: true - Layout.margins: 5 - onClicked: { - MessagesAdapter.openDirectory(root.location) - close() - } - } - - MessageOptionButton { - visible: type === Interaction.Type.DATA_TRANSFER && Status === Interaction.Status.TRANSFER_FINISHED - textButton: JamiStrings.removeLocally - iconSource: JamiResources.trash_black_24dp_svg - Layout.fillWidth: true - Layout.margins: 5 - onClicked: { - MessagesAdapter.removeFile(msgId, root.location) - close() - } - } - - MessageOptionButton { - id: buttonEdit - - visible: root.isOutgoing && type === Interaction.Type.TEXT - textButton: JamiStrings.editMessage - iconSource: JamiResources.edit_svg - Layout.fillWidth: true - Layout.margins: 5 - - onClicked: { - MessagesAdapter.replyToId = "" - MessagesAdapter.editId = root.msgId - close() - } - } - - MessageOptionButton { - visible: root.isOutgoing && type === Interaction.Type.TEXT - textButton: JamiStrings.deleteMessage - iconSource: JamiResources.delete_svg - Layout.fillWidth: true - Layout.margins: 5 - onClicked: { - MessagesAdapter.editMessage(CurrentConversation.id, "", root.msgId) - close() - } - } - } - } - - Overlay.modal: Rectangle { - color: JamiTheme.transparentColor - // Color animation for overlay when pop up is shown. - ColorAnimation on color { - to: JamiTheme.popupOverlayColor - duration: 500 - } - } - - DropShadow { - z: -1 - - width: bubble.width - height: bubble.height - horizontalOffset: 3.0 - verticalOffset: 3.0 - radius: bubble.radius * 4 - color: JamiTheme.shadowColor - source: bubble - transparentBorder: true - samples: radius + 1 - } - - enter: Transition { - NumberAnimation { - properties: "opacity"; from: 0.0; to: 1.0 - duration: JamiTheme.shortFadeDuration - } - } - - exit: Transition { - NumberAnimation { - properties: "opacity"; from: 1.0; to: 0.0 - duration: root.closeWithoutAnimation ? 0 : JamiTheme.shortFadeDuration - } - } -} diff --git a/src/app/commoncomponents/PushButton.qml b/src/app/commoncomponents/PushButton.qml index 19f359b968da6975b5f996c1d04b6470891917d8..563bb81f07b78615687b5f4af7671116c5d3d377 100644 --- a/src/app/commoncomponents/PushButton.qml +++ b/src/app/commoncomponents/PushButton.qml @@ -53,6 +53,7 @@ AbstractButton { property alias toolTipText: toolTip.text property alias hasShortcut: toolTip.hasShortcut property alias shortcutKey: toolTip.shortcutKey + property int buttonTextFontSize: 12 // State colors property string pressedColor: JamiTheme.pressedButtonColor @@ -143,7 +144,7 @@ AbstractButton { color: JamiTheme.primaryForegroundColor font.kerning: true - font.pixelSize: 12 + font.pixelSize: buttonTextFontSize elide: Qt.ElideRight } diff --git a/src/app/commoncomponents/SBSContextMenu.qml b/src/app/commoncomponents/SBSContextMenu.qml index 47546bf3b19147cd3bc4ba144c12a09dd83d144f..941c0e5fd9be4de1be7888e31cde5343d8ae9bf2 100644 --- a/src/app/commoncomponents/SBSContextMenu.qml +++ b/src/app/commoncomponents/SBSContextMenu.qml @@ -37,6 +37,7 @@ ContextMenuAutoLoader { canTrigger: root.transferId !== "" itemName: JamiStrings.saveFile + iconSource: JamiResources.save_file_svg onClicked: MessagesAdapter.copyToDownloads(root.transferId, root.transferName) }, GeneralMenuItem { @@ -44,6 +45,7 @@ ContextMenuAutoLoader { canTrigger: root.transferId !== "" itemName: JamiStrings.openLocation + iconSource: JamiResources.round_folder_24dp_svg onClicked: { MessagesAdapter.openDirectory(root.location); } @@ -52,6 +54,7 @@ ContextMenuAutoLoader { id: reply itemName: JamiStrings.reply + iconSource: JamiResources.reply_svg onClicked: { MessagesAdapter.editId = ""; MessagesAdapter.replyToId = root.msgId; @@ -62,6 +65,7 @@ ContextMenuAutoLoader { canTrigger: transferId === "" && isOutgoing itemName: JamiStrings.edit + iconSource: JamiResources.edit_svg onClicked: { MessagesAdapter.replyToId = ""; MessagesAdapter.editId = root.msgId; @@ -73,6 +77,7 @@ ContextMenuAutoLoader { canTrigger: transferId === "" && isOutgoing itemName: JamiStrings.optionDelete + iconSource: JamiResources.delete_svg onClicked: { MessagesAdapter.editMessage(CurrentConversation.id, "", root.msgId); } diff --git a/src/app/commoncomponents/SBSMessageBase.qml b/src/app/commoncomponents/SBSMessageBase.qml index 1c35409efbfea6c4973cc9de280e50a161d21177..869dbf5cb3e0213d1a6819c3c013890ed412ddf9 100644 --- a/src/app/commoncomponents/SBSMessageBase.qml +++ b/src/app/commoncomponents/SBSMessageBase.qml @@ -277,7 +277,7 @@ Control { anchors.rightMargin: isOutgoing ? 10 : 0 anchors.leftMargin: !isOutgoing ? 10 : 0 - imageColor: JamiTheme.emojiReactPushButtonColor + imageColor: hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor normalColor: JamiTheme.primaryBackgroundColor toolTipText: JamiStrings.moreOptions anchors.verticalCenter: parent.verticalCenter @@ -290,7 +290,7 @@ Control { circled: false onClicked: { - var component = Qt.createComponent("qrc:/commoncomponents/MessageOptionsPopup.qml"); + var component = Qt.createComponent("qrc:/commoncomponents/ShowMoreMenu.qml"); var obj = component.createObject(bubble, { "emojiReactions": emojiReactions, "isOutgoing": isOutgoing, @@ -308,7 +308,8 @@ Control { PushButton { id: reply - imageColor: JamiTheme.emojiReactPushButtonColor + circled: false + imageColor: hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor normalColor: JamiTheme.primaryBackgroundColor toolTipText: JamiStrings.reply source: JamiResources.reply_svg @@ -319,7 +320,6 @@ Control { anchors.right: isOutgoing ? more.left : undefined anchors.left: !isOutgoing ? more.right : undefined visible: CurrentAccount.type !== Profile.Type.SIP && Body !== "" && (bubbleArea.bubbleHovered || hovered || more.hovered || bgHandler.hovered) - circled: false onClicked: { MessagesAdapter.editId = ""; diff --git a/src/app/commoncomponents/ShareMenu.qml b/src/app/commoncomponents/ShareMenu.qml new file mode 100644 index 0000000000000000000000000000000000000000..59721d54f8b0bcb38243d78b2fa57db0ac270f0c --- /dev/null +++ b/src/app/commoncomponents/ShareMenu.qml @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2020-2023 Savoir-faire Linux Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +import QtQuick +import net.jami.Constants 1.1 +import "contextmenu" + +BaseContextMenu { + id: root + property var modelList + signal audioRecordMessageButtonClicked + signal videoRecordMessageButtonClicked + signal showMapClicked + + property list<GeneralMenuItem> menuItems: [ + GeneralMenuItem { + id: audioMessage + + canTrigger: true + iconSource: JamiResources.message_audio_black_24dp_svg + itemName: JamiStrings.leaveAudioMessage + onClicked: { + root.audioRecordMessageButtonClicked(); + } + }, + GeneralMenuItem { + id: videoMessage + + canTrigger: true + iconSource: JamiResources.message_video_black_24dp_svg + itemName: JamiStrings.leaveVideoMessage + + onClicked: { + root.videoRecordMessageButtonClicked(); + } + }, + GeneralMenuItem { + id: shareLocation + + canTrigger: true + iconSource: JamiResources.localisation_sharing_send_pin_svg + itemName: JamiStrings.shareLocation + onClicked: { + root.showMapClicked(); + } + } + ] + + Component.onCompleted: { + root.loadMenuItems(menuItems); + } +} diff --git a/src/app/commoncomponents/SharePopup.qml b/src/app/commoncomponents/SharePopup.qml deleted file mode 100644 index 79a5d1055c50d4f09e04de899ca1e5639fc5ddf5..0000000000000000000000000000000000000000 --- a/src/app/commoncomponents/SharePopup.qml +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2023 Savoir-faire Linux Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import Qt.labs.platform -import Qt5Compat.GraphicalEffects -import net.jami.Models 1.1 -import net.jami.Adapters 1.1 -import net.jami.Constants 1.1 -import "../mainview/components" - -Popup { - id: root - padding: 0 - property list<Action> menuMoreButton - - height: childrenRect.height - width: childrenRect.width - - focus: true - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - - Rectangle { - id: rect - - color: JamiTheme.primaryBackgroundColor - border.color: JamiTheme.chatViewFooterRectangleBorderColor - border.width: 2 - radius: 5 - height: listViewMoreButton.childrenRect.height + 16 - width: listViewMoreButton.childrenRect.width + 16 - - ListView { - id: listViewMoreButton - - anchors.centerIn: parent - orientation: ListView.Vertical - - spacing: 0 - - width: contentItem.childrenRect.width - height: contentHeight - - model: menuMoreButton - - Rectangle { - z: -1 - anchors.fill: parent - color: "transparent" - } - - onCountChanged: { - for (var i = 0; i < count; i++) { - var item = listViewMoreButton.itemAtIndex(i); - item.width = listViewMoreButton.width; - } - } - - delegate: ItemDelegate { - id: control - - text: modelData.toolTip - - contentItem: RowLayout { - Rectangle { - id: image - width: 20 - height: 20 - radius: 5 - color: JamiTheme.transparentColor - ResponsiveImage { - anchors.fill: parent - source: modelData.iconSrc - color: control.hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor - } - } - Text { - Layout.alignment: Qt.AlignLeft - text: control.text - color: JamiTheme.chatViewFooterImgHoverColor - font.pixelSize: JamiTheme.menuFontSize - } - } - background: Rectangle { - color: control.hovered ? JamiTheme.showMoreButtonOpenColor : JamiTheme.transparentColor - } - - action: modelData - - onClicked: { - root.close(); - } - } - } - } - - DropShadow { - z: -1 - - width: rect.width - height: rect.height - horizontalOffset: 3.0 - verticalOffset: 3.0 - radius: rect.radius * 4 - color: JamiTheme.shadowColor - source: rect - transparentBorder: true - samples: radius + 1 - } - - background: Rectangle { - anchors.fill: parent - color: JamiTheme.transparentColor - radius: 5 - z: -1 - } - - enter: Transition { - NumberAnimation { - properties: "opacity" - from: 0.0 - to: 1.0 - duration: JamiTheme.shortFadeDuration - } - } - exit: Transition { - NumberAnimation { - properties: "opacity" - from: 1.0 - to: 0.0 - duration: JamiTheme.shortFadeDuration - } - } -} diff --git a/src/app/commoncomponents/ShowMoreMenu.qml b/src/app/commoncomponents/ShowMoreMenu.qml new file mode 100644 index 0000000000000000000000000000000000000000..fcddfc84fc57a55ca3ce63e787e30ae421dedd85 --- /dev/null +++ b/src/app/commoncomponents/ShowMoreMenu.qml @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2020-2023 Savoir-faire Linux Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +import QtQuick +import net.jami.Constants 1.1 +import Qt5Compat.GraphicalEffects +import QtQuick.Controls +import net.jami.Models 1.1 +import net.jami.Adapters 1.1 +import "contextmenu" + +BaseContextMenu { + id: root + + required property var emojiReactions + property var emojiReplied: emojiReactions.ownEmojis + + required property string msgId + required property string msgBody + required property bool isOutgoing + required property int type + required property string transferName + required property Item msgBubble + required property ListView listView + + property string location: msgBody + property bool closeWithoutAnimation: false + property var emojiPicker + + function xPositionProvider(width) { + // Use the width at function scope to retrigger property evaluation. + const listViewWidth = listView.width; + if (isOutgoing) { + const leftMargin = msgBubble.mapToItem(listView, 0, 0).x; + return width > leftMargin ? -leftMargin : -width; + } else { + const rightMargin = listViewWidth - (msgBubble.x + msgBubble.width); + return width > rightMargin ? msgBubble.width - width : msgBubble.width; + } + } + function yPositionProvider(height) { + const topOffset = msgBubble.mapToItem(listView, 0, 0).y; + if (topOffset < 0) + return -topOffset; + const bottomOffset = topOffset + height - listView.height; + if (bottomOffset > 0) + return -bottomOffset; + return 0; + } + x: xPositionProvider(width) + y: yPositionProvider(height) + + signal addMoreEmoji + onAddMoreEmoji: { + JamiQmlUtils.updateMessageBarButtonsPoints(); + openEmojiPicker(); + } + + function openEmojiPicker() { + var component = WITH_WEBENGINE ? Qt.createComponent("qrc:/webengine/emojipicker/EmojiPicker.qml") : Qt.createComponent("qrc:/nowebengine/EmojiPicker.qml"); + emojiPicker = component.createObject(root.parent, { + "listView": listView + }); + emojiPicker.emojiIsPicked.connect(function (content) { + if (emojiReplied.includes(content)) { + MessagesAdapter.removeEmojiReaction(CurrentConversation.id, content, msgId); + } else { + MessagesAdapter.addEmojiReaction(CurrentConversation.id, content, msgId); + } + }); + if (emojiPicker !== null) { + root.opacity = 0; + emojiPicker.closed.connect(() => close()); + emojiPicker.x = xPositionProvider(JamiTheme.emojiPickerWidth); + emojiPicker.y = yPositionProvider(JamiTheme.emojiPickerHeight); + emojiPicker.open(); + } else { + console.log("Error creating emojiPicker from message options popup"); + } + } + + // Close the picker when listView vertical properties change. + property real listViewHeight: listView.height + onListViewHeightChanged: close() + property bool isScrolling: listView.verticalScrollBar.active + onIsScrollingChanged: close() + + onOpened: root.closeWithoutAnimation = false + onClosed: if (emojiPicker) + emojiPicker.closeEmojiPicker() + + function getModel() { + const defaultModel = ["ðŸ‘", "👎", "😂"]; + const reactedEmojis = Array.isArray(emojiReplied) ? emojiReplied.slice(0, defaultModel.length) : []; + const uniqueEmojis = Array.from(new Set(reactedEmojis)); + const missingEmojis = defaultModel.filter(emoji => !uniqueEmojis.includes(emoji)); + return uniqueEmojis.concat(missingEmojis); + } + + property list<MenuItem> menuItems: [ + GeneralMenuItemList { + id: audioMessage + + modelList: getModel() + canTrigger: true + iconSource: JamiResources.add_reaction_svg + itemName: JamiStrings.copy + addMenuSeparatorAfter: true + messageId: msgId + }, + GeneralMenuItem { + id: copyMessage + + canTrigger: true + iconSource: JamiResources.copy_svg + itemName: JamiStrings.copy + onClicked: { + UtilsAdapter.setClipboardText(msgBody); + } + }, + GeneralMenuItem { + id: saveFile + + canTrigger: type === Interaction.Type.DATA_TRANSFER + iconSource: JamiResources.save_file_svg + itemName: JamiStrings.saveFile + onClicked: { + MessagesAdapter.copyToDownloads(root.msgId, root.transferName); + } + }, + GeneralMenuItem { + id: openLocation + + canTrigger: type === Interaction.Type.DATA_TRANSFER + iconSource: JamiResources.round_folder_24dp_svg + itemName: JamiStrings.openLocation + onClicked: { + MessagesAdapter.openDirectory(root.location); + } + }, + GeneralMenuItem { + id: removeLocally + + canTrigger: type === Interaction.Type.DATA_TRANSFER && Status === Interaction.Status.TRANSFER_FINISHED + iconSource: JamiResources.trash_black_24dp_svg + itemName: JamiStrings.removeLocally + onClicked: { + MessagesAdapter.removeFile(msgId, root.location); + ; + } + }, + GeneralMenuItem { + id: editMessage + + canTrigger: root.isOutgoing && type === Interaction.Type.TEXT + iconSource: JamiResources.edit_svg + itemName: JamiStrings.editMessage + onClicked: { + MessagesAdapter.replyToId = ""; + MessagesAdapter.editId = root.msgId; + } + }, + GeneralMenuItem { + id: deleteMessage + + canTrigger: root.isOutgoing && type === Interaction.Type.TEXT + iconSource: JamiResources.delete_svg + itemName: JamiStrings.deleteMessage + onClicked: { + MessagesAdapter.editMessage(CurrentConversation.id, "", root.msgId); + } + } + ] + + Component.onCompleted: { + root.loadMenuItems(menuItems); + } +} diff --git a/src/app/commoncomponents/contextmenu/BaseContextMenu.qml b/src/app/commoncomponents/contextmenu/BaseContextMenu.qml index fb226a6df5515ef8772c4bcdd6ee7ca1f724a3a9..58a77eaa8ba91277dd560b4f411ded24f3171b23 100644 --- a/src/app/commoncomponents/contextmenu/BaseContextMenu.qml +++ b/src/app/commoncomponents/contextmenu/BaseContextMenu.qml @@ -43,11 +43,9 @@ Menu { function loadMenuItems(menuItems) { root.addItem(menuTopBorder); - - // use the maximum text width as the preferred width for menu for (var j = 0; j < menuItems.length; ++j) { var currentItemWidth = menuItems[j].itemPreferredWidth; - if (currentItemWidth !== JamiTheme.menuItemsPreferredWidth && currentItemWidth > menuPreferredWidth) + if (currentItemWidth !== JamiTheme.menuItemsPreferredWidth && currentItemWidth > menuPreferredWidth && menuItems[j].canTrigger) menuPreferredWidth = currentItemWidth; } for (var i = 0; i < menuItems.length; ++i) { @@ -55,17 +53,28 @@ Menu { menuItems[i].parentMenu = root; root.addItem(menuItems[i]); if (menuPreferredWidth) - menuItems[i].itemPreferredWidth = menuPreferredWidth; + menuItems[i].itemRealWidth = menuPreferredWidth; if (menuItemsPreferredHeight) menuItems[i].itemPreferredHeight = menuItemsPreferredHeight; - } - if (menuItems[i].addMenuSeparatorAfter) { - // If the QML file to be loaded is a local file, - // you could omit the finishCreation() function - var menuSeparatorComponent = Qt.createComponent("GeneralMenuSeparator.qml", Component.PreferSynchronous, root); - var menuSeparatorComponentObj = menuSeparatorComponent.createObject(); - generalMenuSeparatorList.push(menuSeparatorComponentObj); - root.addItem(menuSeparatorComponentObj); + if (i !== menuItems.length - 1) { + var menuSeparatorComponent = Qt.createComponent("GeneralMenuSeparator.qml", Component.PreferSynchronous, root); + var menuSeparatorComponentObj = menuSeparatorComponent.createObject(); + generalMenuSeparatorList.push(menuSeparatorComponentObj); + root.addItem(menuSeparatorComponentObj); + } + if (menuItems[i].addMenuSeparatorAfter) { + var menuSeparatorComponent = Qt.createComponent("GeneralMenuSeparator.qml", Component.PreferSynchronous, root); + var menuSeparatorComponentObj = menuSeparatorComponent.createObject(root, { + "separatorColor": "#DEDEDE", + "separatorPreferredHeight": 0 + }); + generalMenuSeparatorList.push(menuSeparatorComponentObj); + root.addItem(menuSeparatorComponentObj); + var menuSeparatorComponent = Qt.createComponent("GeneralMenuSeparator.qml", Component.PreferSynchronous, root); + var menuSeparatorComponentObj = menuSeparatorComponent.createObject(); + generalMenuSeparatorList.push(menuSeparatorComponentObj); + root.addItem(menuSeparatorComponentObj); + } } } root.addItem(menuBottomBorder); @@ -81,24 +90,23 @@ Menu { Overlay.modal: Rectangle { color: "transparent" } + font.pointSize: JamiTheme.menuFontSize background: Rectangle { - id: container implicitWidth: menuPreferredWidth ? menuPreferredWidth : JamiTheme.menuItemsPreferredWidth - border.width: JamiTheme.menuItemsCommonBorderWidth - border.color: JamiTheme.tabbarBorderColor - color: JamiTheme.backgroundColor + color: JamiTheme.primaryBackgroundColor + radius: 5 layer.enabled: true layer.effect: DropShadow { z: -1 - horizontalOffset: 3.0 + horizontalOffset: 0.0 verticalOffset: 3.0 - radius: 16.0 - color: JamiTheme.shadowColor + radius: 6 + color: "#29000000" transparentBorder: true samples: radius + 1 } diff --git a/src/app/commoncomponents/contextmenu/ContextMenuAutoLoader.qml b/src/app/commoncomponents/contextmenu/ContextMenuAutoLoader.qml index 63e47b2ce63d645ec500073975d87a6e36c6bb0b..e5a9ffe768e87b3709467a00bf5a4cae06c30307 100644 --- a/src/app/commoncomponents/contextmenu/ContextMenuAutoLoader.qml +++ b/src/app/commoncomponents/contextmenu/ContextMenuAutoLoader.qml @@ -30,6 +30,8 @@ Loader { active: false + visible: false + function openMenu() { root.active = true; root.sourceComponent = menuComponent; diff --git a/src/app/commoncomponents/contextmenu/GeneralMenuItem.qml b/src/app/commoncomponents/contextmenu/GeneralMenuItem.qml index b425aa0f9dfe8ce69f19eb4ef82d1c0e130a3fa3..641126a925288a9141af54bacad0af2b5a5b3b14 100644 --- a/src/app/commoncomponents/contextmenu/GeneralMenuItem.qml +++ b/src/app/commoncomponents/contextmenu/GeneralMenuItem.qml @@ -1,6 +1,5 @@ /* * Copyright (C) 2020-2023 Savoir-faire Linux Inc. - * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,22 +31,26 @@ MenuItem { property alias iconSource: contextMenuItemImage.source property string iconColor: "" property bool canTrigger: true + property bool hasIcon: true property bool addMenuSeparatorAfter: false property bool autoTextSizeAdjustment: true property bool dangerous: false property BaseContextMenu parentMenu - property int itemPreferredWidth: JamiTheme.menuItemsPreferredWidth + property int itemPreferredWidth: hasIcon ? 50 + contextMenuItemText.contentWidth + contextMenuItemImage.width : 35 + contextMenuItemText.contentWidth + property int itemRealWidth: itemPreferredWidth property int itemPreferredHeight: JamiTheme.menuItemsPreferredHeight property int leftBorderWidth: JamiTheme.menuItemsCommonBorderWidth property int rightBorderWidth: JamiTheme.menuItemsCommonBorderWidth - property int itemImageLeftMargin: 24 - property int itemTextMargin: 20 + property int itemImageLeftMargin: 18 + property int itemTextMargin: 10 signal clicked property bool itemHovered: menuItemContentRect.hovered + width: itemRealWidth + contentItem: AbstractButton { id: menuItemContentRect @@ -55,10 +58,12 @@ MenuItem { id: background anchors.fill: parent - anchors.leftMargin: 1 - anchors.rightMargin: 1 + anchors.leftMargin: 6 + anchors.rightMargin: 6 + + radius: 5 - color: menuItemContentRect.hovered ? JamiTheme.hoverColor : JamiTheme.backgroundColor + color: menuItemContentRect.hovered ? JamiTheme.hoverColor : JamiTheme.primaryBackgroundColor } anchors.fill: parent @@ -76,41 +81,25 @@ MenuItem { visible: status === Image.Ready - color: iconColor !== "" ? iconColor : JamiTheme.textColor - opacity: 0.7 + color: menuItemContentRect.hovered ? JamiTheme.textColor : JamiTheme.chatViewFooterImgColor } - Text { - id: contextMenuItemText - + Item { Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft - Layout.leftMargin: contextMenuItemImage.status === Image.Ready ? itemTextMargin : itemTextMargin / 2 - Layout.rightMargin: contextMenuItemImage.status === Image.Ready ? itemTextMargin : itemTextMargin / 2 + Layout.leftMargin: contextMenuItemImage.status === Image.Ready ? itemTextMargin : itemTextMargin + Layout.rightMargin: contextMenuItemImage.status === Image.Ready ? itemImageLeftMargin : itemTextMargin Layout.preferredHeight: itemPreferredHeight Layout.fillWidth: true - text: itemName - color: dangerous ? JamiTheme.redColor : JamiTheme.textColor - font.pointSize: JamiTheme.textFontSize - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - - TextMetrics { - id: contextMenuItemTextMetrics - - font: contextMenuItemText.font - text: contextMenuItemText.text - - onBoundingRectChanged: { - var sizeToCompare = itemPreferredWidth - (contextMenuItemImage.source.toString().length > 0 ? itemTextMargin + itemImageLeftMargin + contextMenuItemImage.width : itemTextMargin / 2); - if (autoTextSizeAdjustment && boundingRect.width > sizeToCompare) { - if (boundingRect.width > JamiTheme.contextMenuItemTextMaxWidth) { - itemPreferredWidth += JamiTheme.contextMenuItemTextMaxWidth - JamiTheme.contextMenuItemTextPreferredWidth + itemTextMargin; - contextMenuItemText.elide = Text.ElideRight; - } else - itemPreferredWidth += boundingRect.width + itemTextMargin - sizeToCompare; - } - } + Text { + id: contextMenuItemText + height: parent.height + text: itemName + color: dangerous ? JamiTheme.redColor : JamiTheme.textColor + font.pointSize: JamiTheme.textFontSize + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight } } } @@ -130,7 +119,9 @@ MenuItem { anchors.leftMargin: leftBorderWidth anchors.rightMargin: rightBorderWidth - implicitWidth: itemPreferredWidth + color: JamiTheme.primaryBackgroundColor + + implicitWidth: itemRealWidth implicitHeight: itemPreferredHeight border.width: 0 @@ -141,7 +132,7 @@ MenuItem { rBorderwidth: rightBorderWidth tBorderwidth: 0 bBorderwidth: 0 - borderColor: JamiTheme.tabbarBorderColor + borderColor: JamiTheme.primaryBackgroundColor } } } diff --git a/src/app/commoncomponents/contextmenu/GeneralMenuItemList.qml b/src/app/commoncomponents/contextmenu/GeneralMenuItemList.qml new file mode 100644 index 0000000000000000000000000000000000000000..a1ff7d2eede59d0519e5471fbf67344ee2af98ad --- /dev/null +++ b/src/app/commoncomponents/contextmenu/GeneralMenuItemList.qml @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2020-2023 Savoir-faire Linux Inc. + * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import net.jami.Constants 1.1 +import "../" +import net.jami.Adapters 1.1 + +// General menu item. +// Can control top, bottom, left, right border width. +// Use onClicked slot to simulate item click event. +// Can have image icon at the left of the text. +MenuItem { + id: menuItem + + property var modelList: undefined + property string itemName: "" + property var iconSource: undefined + property string iconColor: "" + property bool canTrigger: true + property bool hasIcon: true + property bool addMenuSeparatorAfter: false + property bool autoTextSizeAdjustment: true + property bool dangerous: false + property BaseContextMenu parentMenu + property string messageId + + signal addMoreEmoji + + property int itemPreferredWidth: 207 + property int itemRealWidth: itemPreferredWidth + property int itemPreferredHeight: JamiTheme.menuItemsPreferredHeight + property int leftBorderWidth: JamiTheme.menuItemsCommonBorderWidth + property int rightBorderWidth: JamiTheme.menuItemsCommonBorderWidth + + property int itemImageLeftMargin: 18 + + signal clicked + + width: itemRealWidth + + contentItem: Item { + id: menuItemContentRect + + anchors.fill: parent + + RowLayout { + spacing: 0 + + anchors.fill: menuItemContentRect + + Rectangle { + id: contextMenuItemImage + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.leftMargin: itemImageLeftMargin + height: 36 + width: 36 + color: emojiReplied.includes(modelList[0]) ? JamiTheme.hoveredButtonColor : JamiTheme.primaryBackgroundColor + radius: 5 + + Text { + anchors.centerIn: parent + text: modelList[0] + font.pointSize: JamiTheme.emojiBubbleSize + } + + MouseArea { + anchors.fill: parent + hoverEnabled: true + onEntered: { + contextMenuItemImage.color = JamiTheme.hoveredButtonColor; + } + onExited: { + contextMenuItemImage.color = emojiReplied.includes(modelList[0]) ? JamiTheme.hoveredButtonColor : JamiTheme.primaryBackgroundColor; + } + onClicked: { + if (emojiReplied.includes(modelList[0])) { + MessagesAdapter.removeEmojiReaction(CurrentConversation.id, modelList[0], msgId); + } else { + MessagesAdapter.addEmojiReaction(CurrentConversation.id, modelList[0], msgId); + } + close(); + } + } + } + + Rectangle { + id: contextMenuItemImage2 + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.leftMargin: itemImageLeftMargin / 2 + height: 36 + width: 36 + color: emojiReplied.includes(modelList[1]) ? JamiTheme.hoveredButtonColor : JamiTheme.primaryBackgroundColor + radius: 5 + + Text { + anchors.centerIn: parent + text: modelList[1] + font.pointSize: JamiTheme.emojiBubbleSize + } + + MouseArea { + anchors.fill: parent + hoverEnabled: true + onEntered: { + contextMenuItemImage2.color = JamiTheme.hoveredButtonColor; + } + onExited: { + contextMenuItemImage2.color = emojiReplied.includes(modelList[1]) ? JamiTheme.hoveredButtonColor : JamiTheme.primaryBackgroundColor; + } + onClicked: { + if (emojiReplied.includes(modelList[1])) { + MessagesAdapter.removeEmojiReaction(CurrentConversation.id, modelList[1], msgId); + } else { + MessagesAdapter.addEmojiReaction(CurrentConversation.id, modelList[1], msgId); + } + close(); + } + } + } + + Rectangle { + id: contextMenuItemImage3 + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.leftMargin: itemImageLeftMargin / 2 + height: 36 + width: 36 + color: emojiReplied.includes(modelList[2]) ? JamiTheme.hoveredButtonColor : JamiTheme.primaryBackgroundColor + radius: 5 + + Text { + anchors.centerIn: parent + text: modelList[2] + font.pointSize: JamiTheme.emojiBubbleSize + } + + MouseArea { + anchors.fill: parent + hoverEnabled: true + onEntered: { + contextMenuItemImage3.color = JamiTheme.hoveredButtonColor; + } + onExited: { + contextMenuItemImage3.color = emojiReplied.includes(modelList[2]) ? JamiTheme.hoveredButtonColor : JamiTheme.primaryBackgroundColor; + } + onClicked: { + if (emojiReplied.includes(modelList[2])) { + MessagesAdapter.removeEmojiReaction(CurrentConversation.id, modelList[2], msgId); + } else { + MessagesAdapter.addEmojiReaction(CurrentConversation.id, modelList[2], msgId); + } + close(); + } + } + } + + PushButton { + id: contextMenuItemImage4 + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.leftMargin: itemImageLeftMargin / 2 + Layout.rightMargin: itemImageLeftMargin + height: 36 + width: 36 + imageColor: hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor + normalColor: JamiTheme.primaryBackgroundColor + radius: 5 + source: iconSource + onClicked: { + root.addMoreEmoji(); + } + } + } + } + + highlighted: true + + background: Rectangle { + id: contextMenuBackgroundRect + + anchors.fill: parent + anchors.leftMargin: leftBorderWidth + anchors.rightMargin: rightBorderWidth + + color: JamiTheme.primaryBackgroundColor + + implicitWidth: itemRealWidth + implicitHeight: itemPreferredHeight + + border.width: 0 + + CustomBorder { + commonBorder: false + lBorderwidth: leftBorderWidth + rBorderwidth: rightBorderWidth + tBorderwidth: 0 + bBorderwidth: 0 + borderColor: JamiTheme.primaryBackgroundColor + } + } +} diff --git a/src/app/commoncomponents/contextmenu/GeneralMenuSeparator.qml b/src/app/commoncomponents/contextmenu/GeneralMenuSeparator.qml index ff70c55ca8e7f2bf8eaf2ed0f86093c245b7de9d..8ef073c54ef5aca83eacacf479b16fd58c8e72e4 100644 --- a/src/app/commoncomponents/contextmenu/GeneralMenuSeparator.qml +++ b/src/app/commoncomponents/contextmenu/GeneralMenuSeparator.qml @@ -23,19 +23,24 @@ MenuSeparator { id: menuSeparator property int separatorPreferredWidth: JamiTheme.menuItemsPreferredWidth - property int separatorPreferredHeight: 1 - property string separatorColor: JamiTheme.tabbarBorderColor + property int separatorPreferredHeight: 5 + property string separatorColor: JamiTheme.primaryBackgroundColor padding: 0 topPadding: 1 bottomPadding: 1 + contentItem: Rectangle { implicitWidth: separatorPreferredWidth implicitHeight: separatorPreferredHeight color: separatorColor + radius: 5 } background: Rectangle { - color: JamiTheme.backgroundColor + width: parent.width - 10 + anchors.horizontalCenter: parent.horizontalCenter + color: separatorColor + radius: 5 } } diff --git a/src/app/constant/JamiTheme.qml b/src/app/constant/JamiTheme.qml index 5fd5dc583347884d9e9b5172dac748e2a5edde8a..1e486bf37638f4eb9ef4ff05c4e5fad33e4e5760 100644 --- a/src/app/constant/JamiTheme.qml +++ b/src/app/constant/JamiTheme.qml @@ -367,9 +367,9 @@ Item { property int avatarReadReceiptSize: 18 property int menuItemsPreferredWidth: 220 - property int menuItemsPreferredHeight: 48 + property int menuItemsPreferredHeight: 36 property int menuItemsCommonBorderWidth: 1 - property int menuBorderPreferredHeight: 8 + property int menuBorderPreferredHeight: 5 property real maximumWidthSettingsView: 516 property real settingsHeaderpreferredHeight: 64 diff --git a/src/app/mainview/components/ConversationSmartListContextMenu.qml b/src/app/mainview/components/ConversationSmartListContextMenu.qml index 2467563eca3e485cd73359ca3c21a320e1a2dfaf..ed217746ce19e69e1366669fc626d1d16b614fb7 100644 --- a/src/app/mainview/components/ConversationSmartListContextMenu.qml +++ b/src/app/mainview/components/ConversationSmartListContextMenu.qml @@ -104,7 +104,6 @@ ContextMenuAutoLoader { canTrigger: hasCall itemName: JamiStrings.endCall iconSource: JamiResources.ic_call_end_white_24dp_svg - addMenuSeparatorAfter: contactType !== Profile.Type.SIP && (contactType === Profile.Type.PENDING || !hasCall) onClicked: CallAdapter.hangUpACall(responsibleAccountId, responsibleConvUid) }, GeneralMenuItem { @@ -129,7 +128,6 @@ ContextMenuAutoLoader { canTrigger: !hasCall && contactType !== Profile.Type.SIP && !root.isBanned && isCoreDialog && root.idText !== CurrentAccount.uri itemName: JamiStrings.blockContact iconSource: JamiResources.block_black_24dp_svg - addMenuSeparatorAfter: canTrigger onClicked: { var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", { "title": JamiStrings.confirmAction, @@ -147,7 +145,6 @@ ContextMenuAutoLoader { canTrigger: root.isBanned itemName: JamiStrings.reinstateContact iconSource: JamiResources.round_remove_circle_24dp_svg - addMenuSeparatorAfter: canTrigger onClicked: MessagesAdapter.unbanConversation(responsibleConvUid) }, GeneralMenuItem { diff --git a/src/app/mainview/components/MessageBar.qml b/src/app/mainview/components/MessageBar.qml index 37bc40ccb9f8c7ec4700c8ce82ddc72d06beaa8a..eee26aa67bc7865a7db5dd36b40aa41d74227476 100644 --- a/src/app/mainview/components/MessageBar.qml +++ b/src/app/mainview/components/MessageBar.qml @@ -108,14 +108,21 @@ RowLayout { sharePopup.close(); } - popup: SharePopup { + popup: ShareMenu { id: sharePopup + onAudioRecordMessageButtonClicked: { + root.audioRecordMessageButtonClicked(); + } + onVideoRecordMessageButtonClicked: { + root.videoRecordMessageButtonClicked(); + } + onShowMapClicked: { + root.showMapClicked(); + } + parent: root + modelList: listViewMoreButton.menuMoreButton y: -160 x: -20 - - menuMoreButton: listViewMoreButton.menuMoreButton - - onClosed: messageBar.textAreaObj.forceActiveFocus() } } } diff --git a/tests/qml/src/tst_MessageOptions.qml b/tests/qml/src/tst_MessageOptions.qml index 4fb25db379a3d7c8cd824034efbaefd1a456e1ba..8385c311cc4a15c3a25340fc54ccf75d16d7ee72 100644 --- a/tests/qml/src/tst_MessageOptions.qml +++ b/tests/qml/src/tst_MessageOptions.qml @@ -51,7 +51,7 @@ Item { } function getOptionsPopup(isOutgoing, id, body, type, transferName) { - var component = Qt.createComponent("qrc:/commoncomponents/MessageOptionsPopup.qml"); + var component = Qt.createComponent("qrc:/commoncomponents/ShowMoreMenu.qml"); var obj = component.createObject(bubble, { "emojiReactions": emojiReactions, "isOutgoing": isOutgoing,