From fea0cfbf4ea64b81b4045371afe4127868923aab Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sun, 11 Jan 2026 17:39:27 -0500 Subject: [PATCH] Fix opening message menus for popup windows We were previously assuming that we always want to parent these menus to RoomPage, but that only exists on the main window. If you tried to open the menu for say - the search window - then it would confusingly still open on the main menu. Thankfully the way to fix this is simple, by passing a parent QtObject around. --- src/app/qml/NeochatMaximizeComponent.qml | 2 +- src/app/qml/RoomPage.qml | 4 ++-- src/app/roommanager.cpp | 5 +++-- src/app/roommanager.h | 6 ++++-- src/messagecontent/CodeComponent.qml | 2 +- src/messagecontent/QuoteComponent.qml | 2 +- src/messagecontent/StateComponent.qml | 2 +- src/messagecontent/TextComponent.qml | 4 ++-- src/timeline/HiddenDelegate.qml | 2 +- src/timeline/MessageDelegate.qml | 2 +- 10 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/app/qml/NeochatMaximizeComponent.qml b/src/app/qml/NeochatMaximizeComponent.qml index b465cabaa..702901b6f 100644 --- a/src/app/qml/NeochatMaximizeComponent.qml +++ b/src/app/qml/NeochatMaximizeComponent.qml @@ -156,7 +156,7 @@ Components.AlbumMaximizeComponent { onItemRightClicked: { const event = root.currentRoom.findEvent(root.currentEventId); - RoomManager.viewEventMenu(event, root.currentRoom) + RoomManager.viewEventMenu(root.QQC2.Overlay.overlay, event, root.currentRoom) } onSaveItem: { diff --git a/src/app/qml/RoomPage.qml b/src/app/qml/RoomPage.qml index c5edc0bf3..7ccb13330 100644 --- a/src/app/qml/RoomPage.qml +++ b/src/app/qml/RoomPage.qml @@ -349,8 +349,8 @@ Kirigami.Page { }); } - function onShowDelegateMenu(eventId: string, author, messageComponentType, plainText: string, richText: string, mimeType: string, progressInfo, isThread: bool, selectedText: string, hoveredLink: string) { - (delegateContextMenu.createObject(root, { + function onShowDelegateMenu(parent: QtObject, eventId: string, author, messageComponentType, plainText: string, richText: string, mimeType: string, progressInfo, isThread: bool, selectedText: string, hoveredLink: string) { + (delegateContextMenu.createObject(parent, { author: author, eventId: eventId, plainText: plainText, diff --git a/src/app/roommanager.cpp b/src/app/roommanager.cpp index feaf3b90f..73da9aa10 100644 --- a/src/app/roommanager.cpp +++ b/src/app/roommanager.cpp @@ -282,14 +282,15 @@ void RoomManager::viewEventSource(const QString &eventId) Q_EMIT showEventSource(eventId); } -void RoomManager::viewEventMenu(const RoomEvent *event, NeoChatRoom *room, const QString &selectedText, const QString &hoveredLink) +void RoomManager::viewEventMenu(QObject *parent, const RoomEvent *event, NeoChatRoom *room, const QString &selectedText, const QString &hoveredLink) { if (!event) { qWarning() << "Tried to open event menu with empty event"; return; } - Q_EMIT showDelegateMenu(event->id(), + Q_EMIT showDelegateMenu(parent, + event->id(), room->qmlSafeMember(event->senderId()), MessageComponentType::typeForEvent(*event), EventHandler::plainBody(room, event), diff --git a/src/app/roommanager.h b/src/app/roommanager.h index e2b8fac3d..ff569e419 100644 --- a/src/app/roommanager.h +++ b/src/app/roommanager.h @@ -233,7 +233,8 @@ public: /** * @brief Show a context menu for the given event. */ - Q_INVOKABLE void viewEventMenu(const RoomEvent *event, NeoChatRoom *room, const QString &selectedText = {}, const QString &hoveredLink = {}); + Q_INVOKABLE void + viewEventMenu(QObject *parent, const RoomEvent *event, NeoChatRoom *room, const QString &selectedText = {}, const QString &hoveredLink = {}); /** * @brief Set a URL to be loaded as the initial room. @@ -306,7 +307,8 @@ Q_SIGNALS: /** * @brief Request to show a menu for the given event. */ - void showDelegateMenu(const QString &eventId, + void showDelegateMenu(QObject *parent, + const QString &eventId, const NeochatRoomMember *author, MessageComponentType::Type messageComponentType, const QString &plainText, diff --git a/src/messagecontent/CodeComponent.qml b/src/messagecontent/CodeComponent.qml index 0c2be60a2..e595be491 100644 --- a/src/messagecontent/CodeComponent.qml +++ b/src/messagecontent/CodeComponent.qml @@ -132,7 +132,7 @@ QQC2.Control { acceptedDevices: PointerDevice.TouchScreen onLongPressed: { const event = root.Message.room.findEvent(root.eventId); - RoomManager.viewEventMenu(event, root.Message.room, root.Message.selectedText, root.Message.hoveredLink); + RoomManager.viewEventMenu(root.QQC2.Overlay.overlay, event, root.Message.room, root.Message.selectedText, root.Message.hoveredLink); } } diff --git a/src/messagecontent/QuoteComponent.qml b/src/messagecontent/QuoteComponent.qml index 26a69542d..4b2b8d324 100644 --- a/src/messagecontent/QuoteComponent.qml +++ b/src/messagecontent/QuoteComponent.qml @@ -68,7 +68,7 @@ QQC2.Control { acceptedButtons: Qt.LeftButton onLongPressed: { const event = root.Message.room.findEvent(root.eventId); - RoomManager.viewEventMenu(event, root.Message.room, root.Message.selectedText, root.Message.hoveredLink); + RoomManager.viewEventMenu(root.QQC2.Overlay.overlay, event, root.Message.room, root.Message.selectedText, root.Message.hoveredLink); } } } diff --git a/src/messagecontent/StateComponent.qml b/src/messagecontent/StateComponent.qml index 34d789592..d2d3be2f1 100644 --- a/src/messagecontent/StateComponent.qml +++ b/src/messagecontent/StateComponent.qml @@ -91,7 +91,7 @@ RowLayout { return; } const event = root.Message.room.findEvent(root.modelData.eventId); - RoomManager.viewEventMenu(event, root.Message.room, root.author, "", ""); + RoomManager.viewEventMenu(root.QQC2.Overlay.overlay, event, root.Message.room, root.author, "", ""); } } } diff --git a/src/messagecontent/TextComponent.qml b/src/messagecontent/TextComponent.qml index 26bf3532b..e1c5b6ec4 100644 --- a/src/messagecontent/TextComponent.qml +++ b/src/messagecontent/TextComponent.qml @@ -99,7 +99,7 @@ TextEdit { acceptedDevices: PointerDevice.TouchScreen onLongPressed: { const event = root.Message.room.findEvent(root.eventId); - RoomManager.viewEventMenu(event, root.Message.room, root.Message.selectedText, root.Message.hoveredLink); + RoomManager.viewEventMenu(root.QQC2.Overlay.overlay, event, root.Message.room, root.Message.selectedText, root.Message.hoveredLink); } } TapHandler { @@ -108,7 +108,7 @@ TextEdit { gesturePolicy: TapHandler.WithinBounds onTapped: { const event = root.Message.room.findEvent(root.eventId); - RoomManager.viewEventMenu(event, root.Message.room, root.Message.selectedText, root.Message.hoveredLink); + RoomManager.viewEventMenu(root.QQC2.Overlay.overlay, event, root.Message.room, root.Message.selectedText, root.Message.hoveredLink); } } } diff --git a/src/timeline/HiddenDelegate.qml b/src/timeline/HiddenDelegate.qml index 501aa2e02..a0ae54570 100644 --- a/src/timeline/HiddenDelegate.qml +++ b/src/timeline/HiddenDelegate.qml @@ -95,7 +95,7 @@ TimelineDelegate { function showMessageMenu(): void { let event = root.Message.room.findEvent(root.eventId); - RoomManager.viewEventMenu(event, root.room, ""); + RoomManager.viewEventMenu(root.QQC2.Overlay.overlay, event, root.room, ""); } } } diff --git a/src/timeline/MessageDelegate.qml b/src/timeline/MessageDelegate.qml index ebe07bb4c..6e7d5e157 100644 --- a/src/timeline/MessageDelegate.qml +++ b/src/timeline/MessageDelegate.qml @@ -234,7 +234,7 @@ MessageDelegateBase { function showMessageMenu(): void { let event = root.ListView.view.model.findEvent(root.eventId); - RoomManager.viewEventMenu(event, root.room, root.Message.selectedText, root.Message.hoveredLink); + RoomManager.viewEventMenu(root.QQC2.Overlay.overlay, event, root.room, root.Message.selectedText, root.Message.hoveredLink); } } }