kdeconnect-kde/smsapp/qml/ConversationList.qml
Simon Redman 5b213e6144 [SMS App] Improve filter
Summary:
- Allow filter box to handle keystrokes passed to the ListView
 - This is a little cheesy, but fixes T8341

- Pin filter box to always be visible

- Clear filter on Esc

Test Plan:
- Try typing a contact you would like to search for
 - Before: Every time you type a new letter, the filter box would lose focus and you would have to click it to give it focus again
 - Now: You can type smoothly

- Try scrolling the list
 - Before: The filter box disappeared off the top of the screen
 - Now: The filter box is always visible

- Try pressing escape
 - Before: Nothing
 - Now: Filter clears

- Bonus: When using the arrow keys to navigate, before the filter was manually handling those and the view would not loop. Now, the view loops if you try to select an item past the beginning or end (Easiest to see with highlighting from D17612)

Reviewers: #kde_connect, apol

Reviewed By: #kde_connect, apol

Subscribers: kdeconnect

Tags: #kde_connect

Maniphest Tasks: T8341

Differential Revision: https://phabricator.kde.org/D17614
2018-12-17 09:25:56 -07:00

122 lines
4 KiB
QML

/**
* Copyright (C) 2018 Aleix Pol Gonzalez <aleixpol@kde.org>
* Copyright (C) 2018 Nicolas Fella <nicolas.fella@gmx.de>
* Copyright (C) 2018 Simon Redman <simon@ergotech.com>
*
* 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) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* 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, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1
import org.kde.people 1.0
import org.kde.kirigami 2.2 as Kirigami
import org.kde.kdeconnect 1.0
import org.kde.kdeconnect.sms 1.0
Kirigami.ScrollablePage
{
footer: ComboBox {
id: devicesCombo
enabled: count > 0
model: DevicesSortProxyModel {
id: devicesModel
//TODO: make it possible to filter if they can do sms
sourceModel: DevicesModel { displayFilter: DevicesModel.Paired | DevicesModel.Reachable }
onRowsInserted: if (devicesCombo.currentIndex < 0) {
devicesCombo.currentIndex = 0
}
}
textRole: "display"
}
Label {
text: i18n("No devices available")
anchors.centerIn: parent
visible: !devicesCombo.enabled
}
readonly property QtObject device: devicesCombo.currentIndex >= 0 ? devicesModel.data(devicesModel.index(devicesCombo.currentIndex, 0), DevicesModel.DeviceRole) : null
Component {
id: chatView
ConversationDisplay {}
}
ListView {
id: view
currentIndex: 0
model: QSortFilterProxyModel {
sortOrder: Qt.DescendingOrder
sortRole: ConversationListModel.DateRole
filterCaseSensitivity: Qt.CaseInsensitive
sourceModel: ConversationListModel {
deviceId: device ? device.id() : ""
}
}
header: TextField {
/**
* Used as the filter of the list of messages
*/
id: filter
placeholderText: i18n("Filter...")
width: parent.width
z: 10
onTextChanged: {
view.model.setFilterFixedString(filter.text);
view.currentIndex = 0
}
onAccepted: {
view.currentItem.startChat()
}
Keys.onReturnPressed: {
event.accepted = true
filter.onAccepted()
}
Keys.onEscapePressed: {
event.accepted = filter.text != ""
filter.text = ""
}
Shortcut {
sequence: "Ctrl+F"
onActivated: filter.forceActiveFocus()
}
}
headerPositioning: ListView.OverlayHeader
Keys.forwardTo: [headerItem]
delegate: Kirigami.BasicListItem
{
hoverEnabled: true
label: i18n("<b>%1</b> <br> %2", display, toolTip)
icon: decoration
function startChat() {
applicationWindow().pageStack.push(chatView, {
personUri: model.personUri,
phoneNumber: address,
conversationId: model.conversationId,
device: device})
}
onClicked: { startChat(); }
}
}
}