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)
}
}
}
}