diff --git a/kirigami-icons.qrc b/kirigami-icons.qrc index f257fc1..3dfbf63 100644 --- a/kirigami-icons.qrc +++ b/kirigami-icons.qrc @@ -1,58 +1,59 @@ 3rdparty/breeze-icons/icons/index.theme 3rdparty/breeze-icons/icons/actions/22/application-menu.svg 3rdparty/breeze-icons/icons/actions/22/bookmark-remove.svg 3rdparty/breeze-icons/icons/actions/22/document-decrypt.svg 3rdparty/breeze-icons/icons/actions/22/contact-new.svg 3rdparty/breeze-icons/icons/actions/22/dialog-close.svg 3rdparty/breeze-icons/icons/actions/22/folder-sync.svg 3rdparty/breeze-icons/icons/actions/22/go-next.svg 3rdparty/breeze-icons/icons/actions/22/go-previous.svg 3rdparty/breeze-icons/icons/actions/22/go-up.svg 3rdparty/breeze-icons/icons/actions/22/handle-left.svg 3rdparty/breeze-icons/icons/actions/22/handle-right.svg 3rdparty/breeze-icons/icons/actions/22/help-about.svg 3rdparty/breeze-icons/icons/actions/22/mail-invitation.svg 3rdparty/breeze-icons/icons/actions/22/overflow-menu.svg 3rdparty/breeze-icons/icons/actions/22/system-shutdown.svg 3rdparty/breeze-icons/icons/actions/22/view-list-icons.svg 3rdparty/breeze-icons/icons/actions/22/go-parent-folder.svg 3rdparty/breeze-icons/icons/places/22/folder.svg 3rdparty/breeze-icons/icons/mimetypes/22/text-x-plain.svg 3rdparty/breeze-icons/icons/actions/22/tab-close.svg 3rdparty/breeze-icons/icons/actions/22/password-show-on.svg 3rdparty/breeze-icons/icons/actions/22/password-show-off.svg 3rdparty/breeze-icons/icons/actions/22/settings-configure.svg 3rdparty/breeze-icons/icons/actions/22/lock.svg 3rdparty/breeze-icons/icons/emotes/22/face-smile.svg 3rdparty/breeze-icons/icons/actions/16/document-send.svg + 3rdparty/breeze-icons/icons/actions/16/search.svg 3rdparty/breeze-icons/icons/actions/symbolic/document-send-symbolic.svg 3rdparty/breeze-icons/icons/actions/symbolic/go-next-symbolic.svg 3rdparty/breeze-icons/icons/actions/symbolic/go-previous-symbolic.svg 3rdparty/breeze-icons/icons/actions/symbolic/edit-symbolic.svg 3rdparty/breeze-icons/icons/mimetypes/64/image-jpeg.svg 3rdparty/breeze-icons/icons/mimetypes/64/video-mp4.svg 3rdparty/breeze-icons/icons/mimetypes/64/x-office-document.svg 3rdparty/breeze-icons/icons/mimetypes/64/audio-mp3.svg 3rdparty/breeze-icons/icons/mimetypes/22/text-x-plain.svg diff --git a/src/qml/RosterPage.qml b/src/qml/RosterPage.qml index 50f5334..4574688 100644 --- a/src/qml/RosterPage.qml +++ b/src/qml/RosterPage.qml @@ -1,131 +1,163 @@ /* * Kaidan - A user-friendly XMPP client for every device! * * Copyright (C) 2016-2019 Kaidan developers and contributors * (see the LICENSE file for a full list of copyright authors) * * Kaidan 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 3 of the License, or * (at your option) any later version. * * In addition, as a special exception, the author of Kaidan gives * permission to link the code of its release with the OpenSSL * project's "OpenSSL" library (or with modified versions of it that * use the same license as the "OpenSSL" library), and distribute the * linked executables. You must obey the GNU General Public License in * all respects for all of the code used other than "OpenSSL". If you * modify this file, you may extend this exception to your version of * the file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. * * Kaidan 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 Kaidan. If not, see . */ import QtQuick 2.7 import QtQuick.Layouts 1.3 -import QtQuick.Controls 2.0 as Controls +import QtQuick.Controls 2.3 as Controls import org.kde.kirigami 2.0 as Kirigami import im.kaidan.kaidan 1.0 import "elements" Kirigami.ScrollablePage { title: { kaidan.connectionState === Enums.StateConnecting ? qsTr("Connecting…") : kaidan.connectionState === Enums.StateDisconnected ? qsTr("Offline") : qsTr("Contacts") } + leftPadding: 0 + topPadding: 0 + rightPadding: 0 + bottomPadding: 0 RosterAddContactSheet { id: addContactSheet jid: "" } RosterRemoveContactSheet { id: removeContactSheet jid: "" } mainAction: Kirigami.Action { text: qsTr("Add new contact") iconName: "contact-new" onTriggered: { if (addContactSheet.sheetOpen) addContactSheet.close() else addContactSheet.open() } } + rightAction: Kirigami.Action { + text: qsTr("Search contacts") + iconName: "search" + onTriggered: { + if (searchField.visible) { + searchField.visible = false + } else { + searchField.visible = true + } + } + } + + header: Item { + height: searchField.visible ? searchField.height : 0 + Controls.TextField { + id: searchField + width: parent.width + visible: false + focus: visible + placeholderText: qsTr("Search…") + onVisibleChanged: text = "" + } + } + ListView { verticalLayoutDirection: ListView.TopToBottom model: kaidan.rosterModel delegate: RosterListItem { id: rosterItem + visible: { + model.jid.toLowerCase().includes(searchField.displayText.toLowerCase()) || + model.name.toLowerCase().includes(searchField.displayText.toLowerCase()) + } + height: visible ? 65 : 0 name: model.name ? model.name : model.jid jid: model.jid lastMessage: model.lastMessage presenceType: kaidan.presenceCache.getPresenceType(model.jid) statusMsg: kaidan.presenceCache.getStatusText(model.jid) unreadMessages: model.unreadMessages avatarImagePath: kaidan.avatarStorage.getAvatarUrl(model.jid) backgroundColor: { if (!Kirigami.Settings.isMobile && kaidan.messageModel.chatPartner === model.jid) { Kirigami.Theme.highlightColor } else { Kirigami.Theme.backgroundColor } } onClicked: { + searchField.visible = false // We need to cache the chatName, because changing the chatPartner in the // message model will in some cases also update the roster model. That // will then remove this item and readd an updated version of it, so // model.* won't work anymore after this. var chatName = model.name ? model.name : model.jid kaidan.messageModel.chatPartner = model.jid pageStack.push(chatPage, { "chatName": chatName }) } actions: [ Kirigami.Action { iconName: "bookmark-remove" onTriggered: { removeContactSheet.jid = model.jid; removeContactSheet.open(); } } ] function newPresenceArrived(jid) { if (jid === model.jid) { - rosterItem.presenceType = kaidan.presenceCache. - getPresenceType(model.jid) - rosterItem.statusMsg = kaidan.presenceCache. - getStatusText(model.jid) + rosterItem.presenceType = kaidan.presenceCache.getPresenceType(model.jid) + rosterItem.statusMsg = kaidan.presenceCache.getStatusText(model.jid) } } function xmppUriReceived(uri) { // 'xmpp:' has length of 5 addContactSheet.jid = uri.substr(5) addContactSheet.open() } Component.onCompleted: { kaidan.presenceCache.presenceChanged.connect(newPresenceArrived) kaidan.xmppUriReceived.connect(xmppUriReceived) } Component.onDestruction: { kaidan.presenceCache.presenceChanged.disconnect(newPresenceArrived) kaidan.xmppUriReceived.disconnect(xmppUriReceived) } } } }