From 80047acf871b98d6f29297f570b23bc5bb24ad07 Mon Sep 17 00:00:00 2001 From: James Graham Date: Tue, 3 Feb 2026 18:03:43 +0000 Subject: [PATCH] Improve the code for completions --- src/app/qml/UserMenu.qml | 2 +- src/chatbar/ChatBar.qml | 4 +- src/chatbar/ChatBarCore.qml | 67 ++++++++++++-------------- src/chatbar/CompletionMenu.qml | 4 -- src/messagecontent/AuthorComponent.qml | 7 +-- 5 files changed, 39 insertions(+), 45 deletions(-) diff --git a/src/app/qml/UserMenu.qml b/src/app/qml/UserMenu.qml index ac30a6b4c..8d8aa450c 100644 --- a/src/app/qml/UserMenu.qml +++ b/src/app/qml/UserMenu.qml @@ -16,7 +16,7 @@ KirigamiComponents.ConvergentContextMenu { id: root required property Kirigami.ApplicationWindow window - required property var author + required property NeochatRoomMember author headerContentItem: RowLayout { id: detailRow diff --git a/src/chatbar/ChatBar.qml b/src/chatbar/ChatBar.qml index bab100818..db2316848 100644 --- a/src/chatbar/ChatBar.qml +++ b/src/chatbar/ChatBar.qml @@ -61,9 +61,9 @@ Item { target: root.currentRoom.mainCache function onMentionAdded(text: string, hRef: string): void { - completionMenu.complete(text, hRef); + core.completionModel.insertCompletion(text, hRef); // move the focus back to the chat bar - contentModel.refocusCurrentComponent(); + core.model.refocusCurrentComponent(); } } diff --git a/src/chatbar/ChatBarCore.qml b/src/chatbar/ChatBarCore.qml index 7e7115e58..4f9ad0078 100644 --- a/src/chatbar/ChatBarCore.qml +++ b/src/chatbar/ChatBarCore.qml @@ -23,9 +23,34 @@ QQC2.Control { required property real maxAvailableWidth - Message.contentModel: contentModel + readonly property ChatBarMessageContentModel model: ChatBarMessageContentModel { + type: root.chatBarType + room: root.room + sendMessageWithEnter: NeoChatConfig.sendMessageWith === 0 + } - onActiveFocusChanged: contentModel.refocusCurrentComponent() + readonly property LibNeoChat.CompletionModel completionModel: LibNeoChat.CompletionModel { + room: root.room + type: root.chatBarType + textItem: root.model.focusedTextItem + roomListModel: RoomManager.roomListModel + userListModel: RoomManager.userListModel + + onIsCompletingChanged: { + if (!isCompleting) { + return; + } + + let dialog = Qt.createComponent('org.kde.neochat.chatbar', 'CompletionMenu').createObject(root.model.focusedTextItem.textItem, { + model: root.completionModel, + keyHelper: root.model.keyHelper + }).open(); + } + } + + Message.contentModel: root.model + + onActiveFocusChanged: root.model.refocusCurrentComponent() implicitWidth: root.maxAvailableWidth - (root.maxAvailableWidth >= (parent?.width ?? 0) ? Kirigami.Units.largeSpacing * 2 : 0) topPadding: Kirigami.Units.smallSpacing @@ -38,9 +63,9 @@ QQC2.Control { maxAvailableWidth: root.maxAvailableWidth - Kirigami.Units.largeSpacing * 2 room: root.room - contentModel: chatContentView.model + contentModel: root.model - onClicked: contentModel.refocusCurrentComponent() + onClicked: root.model.refocusCurrentComponent() } Kirigami.Separator { Layout.fillWidth: true @@ -58,7 +83,7 @@ QQC2.Control { ColumnLayout { readonly property real visibleTop: chatScrollView.QQC2.ScrollBar.vertical.position * chatScrollView.contentHeight readonly property real visibleBottom: chatScrollView.QQC2.ScrollBar.vertical.position * chatScrollView.contentHeight + chatScrollView.QQC2.ScrollBar.vertical.size * chatScrollView.contentHeight - readonly property rect cursorRectInColumn: mapFromItem(contentModel.focusedTextItem.textItem, contentModel.focusedTextItem.cursorRectangle); + readonly property rect cursorRectInColumn: mapFromItem(root.model.focusedTextItem.textItem, root.model.focusedTextItem.cursorRectangle); onCursorRectInColumnChanged: { if (chatScrollView.QQC2.ScrollBar.vertical.visible) { if (cursorRectInColumn.y < visibleTop) { @@ -74,12 +99,7 @@ QQC2.Control { Repeater { id: chatContentView - model: ChatBarMessageContentModel { - id: contentModel - type: root.chatBarType - room: root.room - sendMessageWithEnter: NeoChatConfig.sendMessageWith === 0 - } + model: root.model delegate: BaseMessageComponentChooser { rightAnchorMargin: chatScrollView.QQC2.ScrollBar.vertical.visible ? chatScrollView.QQC2.ScrollBar.vertical.width : 0 @@ -89,7 +109,7 @@ QQC2.Control { } SendBar { room: root.room - contentModel: chatContentView.model + contentModel: root.model } } } @@ -105,27 +125,4 @@ QQC2.Control { width: 1 } } - - QtObject { - id: _private - - property LibNeoChat.CompletionModel completionModel: LibNeoChat.CompletionModel { - room: root.room - type: root.chatBarType - textItem: contentModel.focusedTextItem - roomListModel: RoomManager.roomListModel - userListModel: RoomManager.userListModel - - onIsCompletingChanged: { - if (!isCompleting) { - return; - } - - let dialog = Qt.createComponent('org.kde.neochat.chatbar', 'CompletionMenu').createObject(contentModel.focusedTextItem.textItem, { - model: _private.completionModel, - keyHelper: contentModel.keyHelper - }).open(); - } - } - } } diff --git a/src/chatbar/CompletionMenu.qml b/src/chatbar/CompletionMenu.qml index 97c3ada7e..49239a003 100644 --- a/src/chatbar/CompletionMenu.qml +++ b/src/chatbar/CompletionMenu.qml @@ -68,10 +68,6 @@ QQC2.Popup { completions.decrementCurrentIndex(); } - function complete(text: string, hRef: string) { - model.insertCompletion(text, hRef); - } - function completeCurrent() { model.insertCompletion(completions.currentItem.replacedText, completions.currentItem.hRef); } diff --git a/src/messagecontent/AuthorComponent.qml b/src/messagecontent/AuthorComponent.qml index 0de091289..fdf4c0704 100644 --- a/src/messagecontent/AuthorComponent.qml +++ b/src/messagecontent/AuthorComponent.qml @@ -20,11 +20,12 @@ RowLayout { /** * @brief The message author. * - * A Quotient::RoomMember object. + * A NeochatRoomMember object (which is just a QML safe wrapper around + * Quotient::RoomMember). * - * @sa Quotient::RoomMember + * @sa NeochatRoomMember, Quotient::RoomMember */ - required property var author + required property NeochatRoomMember author /** * @brief The timestamp of the event as a neoChatDateTime.