5b213e6144
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
122 lines
4 KiB
QML
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(); }
|
|
}
|
|
|
|
}
|
|
}
|