diff --git a/resources/qml/Completer.qml b/resources/qml/Completer.qml index 7074de81..647e4d85 100644 --- a/resources/qml/Completer.qml +++ b/resources/qml/Completer.qml @@ -11,6 +11,8 @@ Popup { property var completer property bool bottomToTop: true + signal completionClicked(string completion) + function up() { if (bottomToTop) down_(); @@ -76,6 +78,13 @@ Popup { height: chooser.childrenRect.height + 4 implicitWidth: chooser.childrenRect.width + 4 + MouseArea { + anchors.fill: parent + hoverEnabled: true + onEntered: popup.currentIndex = model.index + onClicked: popup.completionClicked(completer.completionAt(model.index)) + } + DelegateChooser { id: chooser diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml index 4f5b4b4c..7a033f5b 100644 --- a/resources/qml/MessageInput.qml +++ b/resources/qml/MessageInput.qml @@ -70,6 +70,11 @@ Rectangle { property int completerTriggeredAt: -1 + function insertCompletion(completion) { + textArea.remove(completerTriggeredAt, cursorPosition); + textArea.insert(cursorPosition, completion); + } + placeholderText: qsTr("Write a message...") placeholderTextColor: colors.buttonText color: colors.text @@ -87,6 +92,7 @@ Rectangle { } onSelectionStartChanged: TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text) onSelectionEndChanged: TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text) + // Ensure that we get escape key press events first. Keys.onShortcutOverride: event.accepted = (completerTriggeredAt != -1 && (event.key === Qt.Key_Escape || event.key === Qt.Key_Tab || event.key === Qt.Key_Enter)) Keys.onPressed: { if (event.matches(StandardKey.Paste)) { @@ -116,8 +122,7 @@ Rectangle { popup.completerName = ""; popup.close(); if (currentCompletion) { - textArea.remove(completerTriggeredAt, cursorPosition); - textArea.insert(cursorPosition, currentCompletion); + textArea.insertCompletion(currentCompletion); event.accepted = true; return ; } @@ -146,7 +151,11 @@ Rectangle { } target: TimelineManager } - // Ensure that we get escape key press events first. + + Connections { + onCompletionClicked: textArea.insertCompletion(completion) + target: popup + } Completer { id: popup