From 6748a2d21d276caed4c011ed74f9da414bc6fbd9 Mon Sep 17 00:00:00 2001 From: James Graham Date: Fri, 26 Aug 2022 19:33:20 +0000 Subject: [PATCH] Fix the reply an edit text being shown in all chat rooms when multiple windows are open Fix the reply an edit text being shown in all chat rooms when multiple windows are open. This is done by changing chatBoxHelper from a singleton to being instantiated for each instance of roompage. BUG: 454963 --- .../Component/ChatBox/AttachmentPane.qml | 12 +++++------ imports/NeoChat/Component/ChatBox/ChatBar.qml | 18 ++++++++--------- imports/NeoChat/Component/ChatBox/ChatBox.qml | 10 +++++----- .../NeoChat/Component/ChatBox/ReplyPane.qml | 6 +++--- .../Menu/Timeline/FileDelegateContextMenu.qml | 2 +- .../Timeline/MessageDelegateContextMenu.qml | 4 ++-- imports/NeoChat/Page/RoomPage.qml | 20 +++++++++++-------- src/main.cpp | 2 +- 8 files changed, 39 insertions(+), 35 deletions(-) diff --git a/imports/NeoChat/Component/ChatBox/AttachmentPane.qml b/imports/NeoChat/Component/ChatBox/AttachmentPane.qml index 2de62ff21..9d47b5620 100644 --- a/imports/NeoChat/Component/ChatBox/AttachmentPane.qml +++ b/imports/NeoChat/Component/ChatBox/AttachmentPane.qml @@ -14,14 +14,14 @@ import NeoChat.Page 1.0 Loader { id: root - property var attachmentMimetype: FileType.mimeTypeForUrl(ChatBoxHelper.attachmentPath) + property var attachmentMimetype: FileType.mimeTypeForUrl(chatBoxHelper.attachmentPath) readonly property bool hasImage: attachmentMimetype.valid && FileType.supportedImageFormats.includes(attachmentMimetype.preferredSuffix) active: visible sourceComponent: Component { Pane { id: attachmentPane - property string baseFileName: ChatBoxHelper.attachmentPath.toString().substring(ChatBoxHelper.attachmentPath.toString().lastIndexOf('/') + 1, ChatBoxHelper.attachmentPath.length) + property string baseFileName: chatBoxHelper.attachmentPath.toString().substring(chatBoxHelper.attachmentPath.toString().lastIndexOf('/') + 1, chatBoxHelper.attachmentPath.length) Kirigami.Theme.colorSet: Kirigami.Theme.View contentItem: Item { @@ -46,7 +46,7 @@ Loader { asynchronous: true cache: false // Cache is not needed. Images will rarely be shown repeatedly. smooth: height == preferredHeight && parent.height == parent.implicitHeight // Don't smooth until height animation stops - source: hasImage ? ChatBoxHelper.attachmentPath : "" + source: hasImage ? chatBoxHelper.attachmentPath : "" visible: hasImage fillMode: Image.PreserveAspectFit @@ -162,14 +162,14 @@ Loader { Component { id: imageEditorPage ImageEditorPage { - imagePath: ChatBoxHelper.attachmentPath + imagePath: chatBoxHelper.attachmentPath } } onClicked: { let imageEditor = applicationWindow().pageStack.layers.push(imageEditorPage); imageEditor.newPathChanged.connect(function(newPath) { applicationWindow().pageStack.layers.pop(); - ChatBoxHelper.attachmentPath = newPath; + chatBoxHelper.attachmentPath = newPath; }); } ToolTip.text: text @@ -180,7 +180,7 @@ Loader { icon.name: "dialog-cancel" text: i18n("Cancel") display: AbstractButton.IconOnly - onClicked: ChatBoxHelper.clearAttachment(); + onClicked: chatBoxHelper.clearAttachment(); ToolTip.text: text ToolTip.visible: hovered } diff --git a/imports/NeoChat/Component/ChatBox/ChatBar.qml b/imports/NeoChat/Component/ChatBox/ChatBar.qml index 3dd997dbc..be53a5ab3 100644 --- a/imports/NeoChat/Component/ChatBox/ChatBar.qml +++ b/imports/NeoChat/Component/ChatBox/ChatBar.qml @@ -277,14 +277,14 @@ ToolBar { } Item { - visible: !ChatBoxHelper.isReplying && (!ChatBoxHelper.hasAttachment || uploadingBusySpinner.running) + visible: !chatBoxHelper.isReplying && (!chatBoxHelper.hasAttachment || uploadingBusySpinner.running) implicitWidth: uploadButton.implicitWidth implicitHeight: uploadButton.implicitHeight ToolButton { id: uploadButton anchors.fill: parent // Matrix does not allow sending attachments in replies - visible: !ChatBoxHelper.isReplying && !ChatBoxHelper.hasAttachment && !uploadingBusySpinner.running + visible: !chatBoxHelper.isReplying && !chatBoxHelper.hasAttachment && !uploadingBusySpinner.running icon.name: "mail-attachment" text: i18n("Attach an image or file") display: AbstractButton.IconOnly @@ -296,7 +296,7 @@ ToolBar { var fileDialog = openFileDialog.createObject(ApplicationWindow.overlay) fileDialog.chosen.connect((path) => { if (!path) { return } - ChatBoxHelper.attachmentPath = path; + chatBoxHelper.attachmentPath = path; }) fileDialog.open() } @@ -379,16 +379,16 @@ ToolBar { if (!Clipboard.saveImage(localPath)) { return; } - ChatBoxHelper.attachmentPath = localPath; + chatBoxHelper.attachmentPath = localPath; } function postMessage() { checkForFancyEffectsReason(); - if (ChatBoxHelper.hasAttachment) { + if (chatBoxHelper.hasAttachment) { // send attachment but don't reset the text - actionsHandler.postMessage("", ChatBoxHelper.attachmentPath, - ChatBoxHelper.replyEventId, ChatBoxHelper.editEventId, {}, this.customEmojiModel); + actionsHandler.postMessage("", chatBoxHelper.attachmentPath, + chatBoxHelper.replyEventId, chatBoxHelper.editEventId, {}, this.customEmojiModel); currentRoom.markAllMessagesAsRead(); messageSent(); return; @@ -400,8 +400,8 @@ ToolBar { actionsHandler.postEdit(inputField.text); } else { // send normal message - actionsHandler.postMessage(inputField.text.trim(), ChatBoxHelper.attachmentPath, - ChatBoxHelper.replyEventId, ChatBoxHelper.editEventId, userAutocompleted, this.customEmojiModel); + actionsHandler.postMessage(inputField.text.trim(), chatBoxHelper.attachmentPath, + chatBoxHelper.replyEventId, chatBoxHelper.editEventId, userAutocompleted, this.customEmojiModel); } currentRoom.markAllMessagesAsRead(); inputField.clear(); diff --git a/imports/NeoChat/Component/ChatBox/ChatBox.qml b/imports/NeoChat/Component/ChatBox/ChatBox.qml index f9c3b78df..9156c5d91 100644 --- a/imports/NeoChat/Component/ChatBox/ChatBox.qml +++ b/imports/NeoChat/Component/ChatBox/ChatBox.qml @@ -127,8 +127,8 @@ Item { ReplyPane { id: replyPane - visible: ChatBoxHelper.isReplying || ChatBoxHelper.isEditing - user: ChatBoxHelper.replyUser + visible: chatBoxHelper.isReplying || chatBoxHelper.isEditing + user: chatBoxHelper.replyUser width: parent.width height: visible ? implicitHeight : 0 anchors.bottom: attachmentSeparator.top @@ -154,7 +154,7 @@ Item { AttachmentPane { id: attachmentPane - visible: ChatBoxHelper.hasAttachment + visible: chatBoxHelper.hasAttachment width: parent.width height: visible ? implicitHeight : 0 anchors.bottom: chatBarSeparator.top @@ -248,7 +248,7 @@ Item { } Connections { - target: ChatBoxHelper + target: chatBoxHelper function onShouldClearText() { root.inputFieldText = ""; @@ -277,7 +277,7 @@ Item { } function closeAll() { - ChatBoxHelper.clear(); + chatBoxHelper.clear(); chatBar.emojiPaneOpened = false; } } diff --git a/imports/NeoChat/Component/ChatBox/ReplyPane.qml b/imports/NeoChat/Component/ChatBox/ReplyPane.qml index a637ffc24..311e1e159 100644 --- a/imports/NeoChat/Component/ChatBox/ReplyPane.qml +++ b/imports/NeoChat/Component/ChatBox/ReplyPane.qml @@ -12,7 +12,7 @@ import org.kde.neochat 1.0 Loader { id: root - readonly property bool isEdit: ChatBoxHelper.isEditing + readonly property bool isEdit: chatBoxHelper.isEditing property var user: null property string avatarMediaUrl: user ? "image://mxc/" + user.avatarMediaId : "" @@ -83,7 +83,7 @@ Loader { bottomPadding: 0 text: { const stylesheet = ""; - const content = ChatBoxHelper.isReplying ? ChatBoxHelper.replyEventContent : ChatBoxHelper.editContent; + const content = chatBoxHelper.isReplying ? chatBoxHelper.replyEventContent : chatBoxHelper.editContent; return stylesheet + content; } selectByMouse: true @@ -106,7 +106,7 @@ Loader { text: i18n("Cancel") display: AbstractButton.IconOnly onClicked: { - ChatBoxHelper.clear(); + chatBoxHelper.clear(); root.replyCancelled(); } ToolTip.text: text diff --git a/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml b/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml index 63b9ac0fe..2a5623f79 100644 --- a/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml +++ b/imports/NeoChat/Menu/Timeline/FileDelegateContextMenu.qml @@ -50,7 +50,7 @@ MessageDelegateContextMenu { text: i18n("Reply") icon.name: "mail-replied-symbolic" onTriggered: { - ChatBoxHelper.replyToMessage(eventId, message, author); + chatBoxHelper.replyToMessage(eventId, message, author); } }, Kirigami.Action { diff --git a/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml b/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml index 78e88ee29..1ade0ae65 100644 --- a/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml +++ b/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml @@ -28,13 +28,13 @@ Loader { Kirigami.Action { text: i18n("Edit") icon.name: "document-edit" - onTriggered: ChatBoxHelper.edit(message, formattedBody, eventId); + onTriggered: chatBoxHelper.edit(message, formattedBody, eventId); visible: eventType.length > 0 && author.id === Controller.activeConnection.localUserId && (eventType === "emote" || eventType === "message") }, Kirigami.Action { text: i18n("Reply") icon.name: "mail-replied-symbolic" - onTriggered: ChatBoxHelper.replyToMessage(eventId, message, author); + onTriggered: chatBoxHelper.replyToMessage(eventId, message, author); }, Kirigami.Action { visible: author.id === currentRoom.localUser.id || currentRoom.canSendState("redact") diff --git a/imports/NeoChat/Page/RoomPage.qml b/imports/NeoChat/Page/RoomPage.qml index 240e2aa8a..6307db6aa 100644 --- a/imports/NeoChat/Page/RoomPage.qml +++ b/imports/NeoChat/Page/RoomPage.qml @@ -53,7 +53,7 @@ Kirigami.ScrollablePage { onCurrentRoomChanged: { hasScrolledUpBefore = false; - ChatBoxHelper.clearEditReply() + chatBoxHelper.clearEditReply() } Connections { @@ -81,6 +81,10 @@ Kirigami.ScrollablePage { connection: Controller.activeConnection } + ChatBoxHelper { + id: chatBoxHelper + } + Shortcut { sequence: StandardKey.Cancel onActivated: applicationWindow().pageStack.get(0).forceActiveFocus() @@ -262,7 +266,7 @@ Kirigami.ScrollablePage { fileDialog.chosen.connect(function(path) { if (!path) return - ChatBoxHelper.attachmentPath = path; + chatBoxHelper.attachmentPath = path; }) fileDialog.open() @@ -284,7 +288,7 @@ Kirigami.ScrollablePage { if (!Clipboard.saveImage(localPath)) { return; } - ChatBoxHelper.attachmentPath = localPath; + chatBoxHelper.attachmentPath = localPath; attachDialog.close(); } } @@ -359,7 +363,7 @@ Kirigami.ScrollablePage { DropArea { id: dropAreaFile anchors.fill: parent - onDropped: ChatBoxHelper.attachmentPath = drop.urls[0] + onDropped: chatBoxHelper.attachmentPath = drop.urls[0] } QQC2.Pane { @@ -486,7 +490,7 @@ Kirigami.ScrollablePage { icon.name: "document-edit" onClicked: { if (hoverActions.showEdit) { - ChatBoxHelper.edit(hoverActions.event.message, hoverActions.event.formattedBody, hoverActions.event.eventId) + chatBoxHelper.edit(hoverActions.event.message, hoverActions.event.formattedBody, hoverActions.event.eventId) } chatBox.focusInputField(); } @@ -496,7 +500,7 @@ Kirigami.ScrollablePage { QQC2.ToolTip.visible: hovered icon.name: "mail-replied-symbolic" onClicked: { - ChatBoxHelper.replyToMessage(hoverActions.event.eventId, hoverActions.event.message, hoverActions.event.author); + chatBoxHelper.replyToMessage(hoverActions.event.eventId, hoverActions.event.message, hoverActions.event.author); chatBox.focusInputField(); } } @@ -516,14 +520,14 @@ Kirigami.ScrollablePage { onEditLastUserMessage: { const targetMessage = messageEventModel.getLastLocalUserMessageEventId(); if (targetMessage) { - ChatBoxHelper.edit(targetMessage["message"], targetMessage["formattedBody"], targetMessage["event_id"]); + chatBoxHelper.edit(targetMessage["message"], targetMessage["formattedBody"], targetMessage["event_id"]); chatBox.focusInputField(); } } onReplyPreviousUserMessage: { const replyResponse = messageEventModel.getLatestMessageFromIndex(0); if (replyResponse && replyResponse["event_id"]) { - ChatBoxHelper.replyToMessage(replyResponse["event_id"], replyResponse["message"], replyResponse["sender_id"]); + chatBoxHelper.replyToMessage(replyResponse["event_id"], replyResponse["message"], replyResponse["sender_id"]); } } } diff --git a/src/main.cpp b/src/main.cpp index 7a09d3e99..9c4f96ee1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -195,13 +195,13 @@ int main(int argc, char *argv[]) qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "RoomManager", &RoomManager::instance()); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "FileType", &fileTypeSingleton); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "LoginHelper", login); - qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "ChatBoxHelper", &chatBoxHelper); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "UrlHelper", &urlHelper); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "EmojiModel", new EmojiModel(&app)); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "CommandModel", new CommandModel(&app)); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "AccountRegistry", &Quotient::AccountRegistry::instance()); qmlRegisterSingletonInstance("org.kde.neochat", 1, 0, "SpaceHierarchyCache", &spaceHierarchyCache); qmlRegisterType("org.kde.neochat", 1, 0, "ActionsHandler"); + qmlRegisterType("org.kde.neochat", 1, 0, "ChatBoxHelper"); qmlRegisterType("org.kde.neochat", 1, 0, "ChatDocumentHandler"); qmlRegisterType("org.kde.neochat", 1, 0, "RoomListModel"); qmlRegisterType("org.kde.neochat", 1, 0, "WebShortcutModel");