Improve the code for completions

This commit is contained in:
James Graham
2026-02-03 18:03:43 +00:00
parent 234d823366
commit 80047acf87
5 changed files with 39 additions and 45 deletions

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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();
}
}
}
}

View File

@@ -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);
}

View File

@@ -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.