From 56d0411b0a8bce305220adbf12f6b859abf9f431 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 17 Nov 2016 12:04:41 +0100 Subject: AutocompleteLineEdit --- .../package/contents/ui/AutocompleteLineEdit.qml | 144 +++++++++++++++++++++ components/package/contents/ui/FocusComposer.qml | 35 +++-- 2 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 components/package/contents/ui/AutocompleteLineEdit.qml (limited to 'components/package/contents/ui') diff --git a/components/package/contents/ui/AutocompleteLineEdit.qml b/components/package/contents/ui/AutocompleteLineEdit.qml new file mode 100644 index 00000000..173a006c --- /dev/null +++ b/components/package/contents/ui/AutocompleteLineEdit.qml @@ -0,0 +1,144 @@ +/* + Copyright (C) 2016 Christian Mollekopf, + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +import QtQuick 2.7 +import QtQuick.Controls 1.4 +import QtQuick.Controls 2.0 as Controls2 +import QtQuick.Layouts 1.1 +import QtQuick.Dialogs 1.0 + +import org.kde.kirigami 1.0 as Kirigami + +TextField { + id: textField + + property string searchTerm + property variant model + onTextChanged: { + if (text.length >= 2) { + searchTerm = text + startCompleting() + } else { + searchTerm = "" + abort() + } + } + Keys.onDownPressed: { + listView.incrementCurrentIndex() + } + Keys.onUpPressed: { + listView.decrementCurrentIndex() + } + Keys.onRightPressed: { + startCompleting() + } + Keys.onTabPressed: { + if (popup.visible) { + listView.incrementCurrentIndex() + } else { + event.accepted = false + } + } + Keys.onReturnPressed: { + accept() + } + Keys.onEscapePressed: { + abort() + } + + function startCompleting() { + if (!popup.visible) { + popup.open() + listView.currentIndex = -1 + } + } + + function accept() { + textField.text = listView.currentItem.text; + popup.close() + } + + function abort() { + popup.close() + } + + Controls2.Popup { + id: popup + x: 0 + y: textField.y + textField.height + padding: 0 + contentWidth: rect.width + contentHeight: rect.height + + Rectangle { + color: Kirigami.Theme.backgroundColor + id: rect + anchors.top: popup.top + anchors.left: popup.left + height: listView.contentHeight + width: textField.width + border.color: "Black" + radius: 5 + ScrollView { + id: scrollView + anchors.fill: parent + ListView { + id: listView + height: childrenRect.height + width: scrollView.width + interactive: true + model: textField.model + delegate: Kirigami.AbstractListItem { + id: listDelegate + property string text: model.text + + width: listView.width + height: textField.height + + enabled: true + supportsMouseEvents: true + + checked: listView.currentIndex == index + onClicked: { + listView.currentIndex = model.index + accept() + } + + //Content + Item { + width: parent.width + height: parent.height + + Column { + anchors { + verticalCenter: parent.verticalCenter + left: parent.left + } + + Text{ + text: model.text + color: listDelegate.checked ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor + } + } + } + } + } + } + } + } +} diff --git a/components/package/contents/ui/FocusComposer.qml b/components/package/contents/ui/FocusComposer.qml index 741faeba..f2ec2826 100644 --- a/components/package/contents/ui/FocusComposer.qml +++ b/components/package/contents/ui/FocusComposer.qml @@ -93,29 +93,30 @@ Controls2.Popup { text: "To" } - RowLayout { - Layout.fillWidth: true - - Controls.TextField { - id: to + AutocompleteLineEdit { + id: to - Layout.fillWidth: true + Layout.fillWidth: true - text: composer.to + text: composer.to + onTextChanged: { + composer.to = text; + } - onTextChanged: { - composer.to = text; - } + model: composer.recepientAutocompletionModel + onSearchTermChanged: { + composer.recepientSearchString = searchTerm } } + Kirigami.Label { text: "Cc" visible: cc.visible } - Controls.TextField { + AutocompleteLineEdit { id: cc Layout.fillWidth: true @@ -127,6 +128,11 @@ Controls2.Popup { onTextChanged: { composer.cc = text; } + + model: composer.recepientAutocompletionModel + onSearchTermChanged: { + composer.recepientSearchString = searchTerm + } } Kirigami.Label { @@ -135,7 +141,7 @@ Controls2.Popup { visible: bcc.visible } - Controls.TextField { + AutocompleteLineEdit { id: bcc Layout.fillWidth: true @@ -147,6 +153,11 @@ Controls2.Popup { onTextChanged: { composer.bcc = text; } + + model: composer.recepientAutocompletionModel + onSearchTermChanged: { + composer.recepientSearchString = searchTerm + } } } -- cgit v1.2.3