diff --git a/app/package/contents/ui/ActionDelegate.qml b/app/package/contents/ui/ActionDelegate.qml index ef03df1..862f49f 100644 --- a/app/package/contents/ui/ActionDelegate.qml +++ b/app/package/contents/ui/ActionDelegate.qml @@ -1,27 +1,27 @@ /* Copyright (C) 2012 Lasath Fernando Copyright (C) 2012 David Edmundson This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ import QtQuick 2.1 -import org.kde.kirigami 1.0 as Kirigami +import org.kde.kirigami 2.1 as Kirigami Kirigami.Label { wrapMode: Text.Wrap width: view.width text: "* " + model.senderAlias + " " + model.text + "" } diff --git a/app/package/contents/ui/ContactList.qml b/app/package/contents/ui/ContactList.qml index a18fb31..5a5bddb 100644 --- a/app/package/contents/ui/ContactList.qml +++ b/app/package/contents/ui/ContactList.qml @@ -1,193 +1,193 @@ /** * Copyright 2016 Martin Klapetek * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 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 Library 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.3 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.1 import org.kde.people 1.0 as KPeople import org.kde.plasma.private.kpeoplehelper 1.0 import org.kde.kquickcontrolsaddons 2.0 as ExtraComponents import org.kde.plasma.core 2.1 as PlasmaCore -import org.kde.kirigami 1.0 as Kirigami +import org.kde.kirigami 2.1 as Kirigami import org.kde.telepathy 0.1 ListView { id: contactsList property bool delegateSelected: false property string numberToCall property alias requiredProperties: kpeopleProxyModel.requiredProperties property QtObject sourceModel property string filterRegExp property bool executeDefaultAction: false signal contactClicked(string personUri) section.property: "display" section.criteria: ViewSection.FirstCharacter clip: true focus: true model: PlasmaCore.SortFilterModel { id: plasmaSortFilterModel sourceModel: KPeople.PersonsSortFilterProxyModel { id: kpeopleProxyModel sourceModel: contactsList.sourceModel } sortRole: "display" filterRole: "display" filterRegExp: ".*" + contactsList.filterRegExp + ".*" sortOrder: Qt.AscendingOrder } boundsBehavior: Flickable.StopAtBounds // highlightRangeMode: ListView.ApplyRange // highlight: PlasmaComponents.Highlight { // // } highlightMoveDuration: 0 KPeople.PersonActions { id: personActionsModel } onCurrentIndexChanged: print("---> " + currentIndex); delegate: Kirigami.AbstractListItem { supportsMouseEvents: true height: actionsRow.visible ? units.gridUnit * 6 : units.gridUnit * 3 enabled: true clip: true opacity: contactsList.delegateSelected && contactsList.currentIndex != index ? 0.4 : 1 onClicked: { contactsList.currentIndex = index; personActionsModel.personUri = model.personUri; if (contactsList.executeDefaultAction) { personActionsModel.triggerAction(0); } else { actionsListProxy.sourceModel = personActionsModel; } contactsList.contactClicked(model.personUri); } Item { anchors.fill: parent // Clear the actions model when index is switched Connections { target: contactsList onCurrentIndexChanged: { if (contactsList.currentIndex != index) { actionsListProxy.sourceModel = null; } } } ColumnLayout { anchors.fill: parent RowLayout { id: mainLayout Layout.fillHeight: true Layout.maximumHeight: units.gridUnit * 3 Layout.fillWidth: true ExtraComponents.QPixmapItem { id: avatarLabel Layout.maximumWidth: parent.height Layout.minimumWidth: parent.height Layout.fillHeight: true pixmap: model.decoration fillMode: ExtraComponents.QPixmapItem.PreserveAspectFit smooth: true } ColumnLayout { Layout.fillHeight: true Layout.fillWidth: true Kirigami.Label { id: nickLabel Layout.fillWidth: true text: model.display elide: Text.ElideRight } Kirigami.Label { id: dataLabel Layout.fillWidth: true text: model.phoneNumber !== undefined ? model.phoneNumber : (model.accountDisplayName !== undefined ? model.accountDisplayName : "") elide: Text.ElideRight visible: dataLabel.text != nickLabel.text opacity: 0.4 } } } RowLayout { id: actionsRow Layout.fillWidth: true Layout.fillHeight: true visible: actionsList.count > 0 ListView { id: actionsList Layout.fillWidth: true Layout.fillHeight: true orientation: ListView.Horizontal model: PlasmaCore.SortFilterModel { id: actionsListProxy filterRole: "actionType" filterCallback: function(source_row, value) { return value == KPeople.ActionType.TextChatAction; } } delegate: Button { Layout.fillWidth: true text: model.display iconSource: model.iconName onClicked: { personActionsModel.triggerAction(actionsListProxy.mapRowToSource(index)); } } } } } } } // CustomSectionScroller { // listView: contactsList // } } diff --git a/app/package/contents/ui/ConversationPage.qml b/app/package/contents/ui/ConversationPage.qml index a715f06..98778d7 100644 --- a/app/package/contents/ui/ConversationPage.qml +++ b/app/package/contents/ui/ConversationPage.qml @@ -1,281 +1,280 @@ /** * Copyright 2016 Martin Klapetek * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 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 Library 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.5 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.1 import org.kde.plasma.core 2.1 as PlasmaCore -import org.kde.kirigami 1.0 as Kirigami +import org.kde.kirigami 2.1 as Kirigami import org.kde.plasma.extras 2.0 as PlasmaExtras // import org.kde.plasma.private.spacebar 1.0 import org.kde.telepathy 0.1 Kirigami.Page { id: conversationPage anchors.fill: parent // This is somewhat a hack, the type should be Conversation // but QML does not allow for uncreatable types to be property // types, so needs to be QtObject instead property QtObject conversation property string pageName: "conversationPage" signal insertEmoji(var emoji); signal focusTextInput(); EmojisModel { id: emojisModel } Kirigami.OverlaySheet { id: emojisRect - z: 300 GridView { id: emojisGridView width: conversationPage.width height: conversationPage.height / 3 clip: true property int iconSize: units.roundToIconSize(cellWidth) model: emojisModel cellWidth: Math.floor(width / 10) cellHeight: cellWidth delegate: MouseArea { height: emojisGridView.iconSize width: emojisGridView.iconSize onClicked: { conversationPage.insertEmoji(model.emojiText); emojisRect.close(); conversationPage.focusTextInput(); } PlasmaCore.IconItem { height: emojisGridView.iconSize width: emojisGridView.iconSize source: model.emojiFullPath } } } } Loader { anchors.fill: parent active: conversation !== null sourceComponent: conversationComponent } Component { id: conversationComponent ColumnLayout { anchors.fill: parent spacing: 2 RowLayout { Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter PlasmaCore.IconItem { source: conversation.presenceIcon } Kirigami.Label { Layout.fillWidth: true text: conversation.title } Button { text: i18nc("Close an active conversation", "Close") onClicked: { conversation.messages.visibleToUser = false; conversation.requestClose(); root.pageStack.pop(); } } } Rectangle { Layout.fillWidth: true height: 1 color: "#888888" //FIXME use theme color opacity: 0.4 } ListView { id: view property bool followConversation: true Layout.fillWidth: true Layout.fillHeight: true boundsBehavior: Flickable.StopAtBounds section.property: "senderAlias" section.delegate: Kirigami.Label { anchors.right: parent.right anchors.left: parent.left height: paintedHeight * 1.5 horizontalAlignment: section === conversation.title ? Text.AlignLeft : Text.AlignRight verticalAlignment: Text.AlignBottom text: section font.bold: true } clip: true add: Transition { id: addTrans NumberAnimation { properties: "x" //FIXME: this doesn't seem to do what it should from: addTrans.ViewTransition.item.isIncoming ? -100 : 100 duration: 60 } PropertyAnimation { properties: "opacity" from: 0.0 to: 1.0 duration: 60 } } //we need this so that scrolling down to the last element works properly //this means that all the list is in memory cacheBuffer: Math.max(0, contentHeight) delegate: Loader { Component.onCompleted: { switch (model.type) { case MessagesModel.MessageTypeOutgoing: case MessagesModel.MessageTypeIncoming: source = "TextDelegate.qml" break; case MessagesModel.MessageTypeAction: source = "ActionDelegate.qml"; break; } } } model: conversation.messages Connections { target: conversation.messages onRowsInserted: { if (view.followConversation) { view.positionViewAtEnd(); } } } onMovementEnded: followConversation = atYEnd //we only follow the conversation if moved to the end onContentHeightChanged: { if (followConversation && contentHeight > height) { view.positionViewAtEnd() } } onAtYBeginningChanged: { if (atYBeginning) { model.fetchMoreHistory(); } } Component.onCompleted: { conversation.messages.visibleToUser = true; } Component.onDestruction: { conversation.messages.visibleToUser = false; } } Kirigami.Label { id: statusMessageLabel Layout.fillWidth: true Layout.maximumHeight: height text: conversation.isContactTyping ? i18nc("Contact is composing a message", "%1 is typing...", conversation.title) : "" height: text.length == 0 ? 0 : paintedHeight Behavior on height { NumberAnimation {} } } RowLayout { EmojiTextArea { id: emojiTextArea Layout.fillWidth: true Layout.minimumHeight: sendButton.height Layout.maximumHeight: emojiTextArea.lineCount * emojiTextArea.lineSpacing + units.largeSpacing emojisAutocompletionModel: emojisModel Connections { target: conversationPage onInsertEmoji: { emojiTextArea.insert(emojiTextArea.cursorPosition, emoji + " "); } onFocusTextInput: { emojiTextArea.forceActiveFocus(); } } } Button { id: emojisButton Layout.maximumWidth: implicitWidth / 2 text: ":)" onClicked: { emojisRect.open(); } } Button { id: sendButton enabled: conversation !== null text: conversation.account !== null && conversation.account.online ? i18nc("Button label; Send message", "Send") : i18nc("Button label; Connect first and then send message", "Connect and Send") onClicked: { view.model.sendNewMessage(emojisHandler.getText()) messageTextField.text = ""; } } } } } } diff --git a/app/package/contents/ui/EmojiTextArea.qml b/app/package/contents/ui/EmojiTextArea.qml index 96c1a7c..b752769 100644 --- a/app/package/contents/ui/EmojiTextArea.qml +++ b/app/package/contents/ui/EmojiTextArea.qml @@ -1,158 +1,158 @@ /** * Copyright 2016 Martin Klapetek * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 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 Library 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.5 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.1 import org.kde.telepathy 0.1 -import org.kde.kirigami 1.0 as Kirigami +import org.kde.kirigami 2.1 as Kirigami import org.kde.plasma.core 2.1 as PlasmaCore TextArea { id: messageTextField verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff wrapMode: TextEdit.WordWrap textFormat: TextEdit.RichText property int acc: -1 property alias emojisAutocompletionModel: emojisAutocompletionFilter.sourceModel property alias lineSpacing: fontMetrics.lineSpacing FontMetrics { id: fontMetrics font: messageTextField.font } TextAreaEmojisHandler { id: emojisHandler textArea: messageTextField } Rectangle { id: autoSuggest color: "white" width: parent.width height: Math.min(emojiAutocompletionView.count * 32, 32 * 9) visible: false y: -height - units.smallSpacing clip: true function hide() { emojisAutocompletionFilter.filterString = ""; messageTextField.acc = -1; autoSuggest.visible = false; } ListView { id: emojiAutocompletionView anchors.fill: parent model: PlasmaCore.SortFilterModel { id: emojisAutocompletionFilter filterRole: "emojiText" sortRole: "emojiText" } delegate: MouseArea { width: parent.width - units.smallSpacing height: 32 x: units.smallSpacing z: 250 onClicked: { messageTextField.selectWord(); messageTextField.remove(messageTextField.selectionStart, messageTextField.selectionEnd); messageTextField.insert(messageTextField.cursorPosition, model.emojiText.substr(1) + " "); autoSuggest.visible = false; messageTextField.acc = -1; emojisAutocompletionFilter.filterString = ""; } PlasmaCore.IconItem { id: emojiIcon height: 24 width: 24 anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter source: model.emojiFullPath } Kirigami.Label { anchors.left: emojiIcon.right anchors.right: parent.right anchors.verticalCenter: emojiIcon.verticalCenter anchors.margins: units.largeSpacing textFormat: Text.StyledText text: model.emojiText ? model.emojiText.replace(emojisAutocompletionFilter.filterString, "" + emojisAutocompletionFilter.filterString + "") : ""; } } } } Keys.onPressed: { if (event.text == ":") { if (acc > 0) { autoSuggest.hide(); } else { acc = 0; } return; } if (acc == -1) { return; } if (event.key == Qt.Key_Space || event.key == Qt.Key_Escape) { autoSuggest.hide(); } acc++; if (event.key == Qt.Key_Backspace) { emojisAutocompletionFilter.filterString = emojisAutocompletionFilter.filterString.slice(0, -1); if (emojisAutocompletionFilter.filterString.length == 0) { autoSuggest.hide(); } } else { emojisAutocompletionFilter.filterString = emojisAutocompletionFilter.filterString + event.text; } if (acc >= 2) { autoSuggest.visible = true; } } Keys.onReturnPressed: { if (event.modifiers == Qt.NoModifier) { if (conversation.canSendMessages) { view.model.sendNewMessage(emojisHandler.getText()); text = ""; } else { // TODO better text showPassiveNotification(i18n("You need to connect first"), 3000); } } else if (event.modifiers != Qt.NoModifier) { event.accepted = false; } } } diff --git a/app/package/contents/ui/MainPage.qml b/app/package/contents/ui/MainPage.qml index 8fba599..588b99a 100644 --- a/app/package/contents/ui/MainPage.qml +++ b/app/package/contents/ui/MainPage.qml @@ -1,157 +1,157 @@ /** * Copyright 2016 Martin Klapetek * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 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 Library 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.3 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.1 import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.kirigami 1.0 as Kirigami +import org.kde.kirigami 2.1 as Kirigami import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.telepathy 0.1 as KTp Kirigami.Page { anchors.fill: parent title: "Your Conversations" mainAction: Kirigami.Action { text: "Start New Conversation" iconName: "document-edit" onTriggered: { if (root.pageStack.depth == 2) { root.pageStack.pop(); } root.pageStack.push(newConversationPageComponent); print("Action button clicked") } } Loader { anchors.fill: parent active: telepathyManager.ready sourceComponent: mainModelComponent } Component { id: mainModelComponent ColumnLayout { id: rootLayout anchors.fill: parent ListView { Layout.fillHeight: true Layout.fillWidth: true clip: true model: PlasmaCore.SortFilterModel { id: plasmaSortFilterModel sortRole: "lastMessageDate" sortOrder: Qt.DescendingOrder sourceModel: KTp.MainLogModel { id: mainModel onNewRequestedChannel: { if (root.pageStack.currentPage.pageName === "newConversationPage" || openIncomingChannel) { root.pageStack.pop(); root.pageStack.push(conversationPageComponent); root.pageStack.currentPage.conversation = mainModel.data(index.row, "conversation"); openIncomingChannel = false; } } Component.onCompleted: { telepathyManager.registerClient(mainModel, "SpaceBar"); telepathyManager.registerClient(mainModel.observerProxy(), "SpaceBarObserverProxy"); mainModel.setAccountManager(telepathyManager.accountManager); } Component.onDestruction: { telepathyManager.unregisterClient(mainModel); } } } delegate: Kirigami.AbstractListItem { supportsMouseEvents: true onClicked: { if (root.pageStack.depth == 2) { root.pageStack.pop(); } root.pageStack.push(conversationPageComponent); root.pageStack.currentItem.conversation = model.conversation; // If the account is online, request a channel if (mainModel.canChat(accountId)) { mainModel.startChat(accountId, contactId); } } Rectangle { anchors.fill: parent color: "white" opacity: 0.8 visible: model.hasUnreadMessages } ColumnLayout { id: messageLayout width: parent.width PlasmaExtras.Heading { Layout.fillWidth: true text: { var t = model.contactDisplayName === "" ? model.contactId : model.contactDisplayName; if (model.hasUnreadMessages) { t += " "; t += i18nc("N unread messages", "(%1 unread)", model.unreadMessagesCount); } return t; } wrapMode: Text.WordWrap elide: Text.ElideRight maximumLineCount: 1 level: 4 } Kirigami.Label { Layout.fillWidth: true text: model.lastMessageText wrapMode: Text.WordWrap elide: Text.ElideRight maximumLineCount: 2 } Kirigami.Label { Layout.fillWidth: true text: Qt.formatDateTime(model.lastMessageDate) wrapMode: Text.WordWrap elide: Text.ElideRight maximumLineCount: 1 } } } } } } } diff --git a/app/package/contents/ui/NewConversationPage.qml b/app/package/contents/ui/NewConversationPage.qml index 59d72c4..d9f2c8b 100644 --- a/app/package/contents/ui/NewConversationPage.qml +++ b/app/package/contents/ui/NewConversationPage.qml @@ -1,77 +1,77 @@ /** * Copyright 2016 Martin Klapetek * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 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 Library 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.3 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.1 import org.kde.plasma.private.kpeoplehelper 1.0 -import org.kde.kirigami 1.0 as Kirigami +import org.kde.kirigami 2.1 as Kirigami import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.telepathy 0.1 Kirigami.Page { anchors.fill: parent focus: true property string pageName: "newConversationPage" GridLayout { anchors.fill: parent columns: 2 PlasmaExtras.Title { Layout.columnSpan: 2 Layout.fillWidth: true text: i18n("Start New Conversation") } Kirigami.Label { Layout.alignment: Qt.AlignRight text: i18n("To:") } TextField { id: toInputField Layout.alignment: Qt.AlignLeft Layout.fillWidth: true } PlasmaExtras.ScrollArea { Layout.fillWidth: true Layout.fillHeight: true Layout.columnSpan: 2 verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff contentItem: ContactList { id: contactListView requiredProperties: ["phoneNumber", "telepathy-contactUri"] executeDefaultAction: true filterRegExp: toInputField.text sourceModel: KPeopleHelper { id: contactsModel } onContactClicked: { root.requestedChannel = personUri; } } } } } diff --git a/app/package/contents/ui/main.qml b/app/package/contents/ui/main.qml index 5bdb303..80082ce 100644 --- a/app/package/contents/ui/main.qml +++ b/app/package/contents/ui/main.qml @@ -1,148 +1,148 @@ /** * Copyright 2016 Martin Klapetek * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 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 Library 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.3 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.1 import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.kirigami 1.0 as Kirigami +import org.kde.kirigami 2.1 as Kirigami Kirigami.ApplicationWindow { id: root width: 500 height: 800 visible: true property string requestedChannel globalDrawer: Kirigami.GlobalDrawer { title: "SpaceBar" titleIcon: "spacebar" // bannerImageSource: "banner.jpg" actions: [ // Kirigami.ActionGroup { // text: "View" // iconName: "view-list-icons" // Action { // text: "action 1" // } // Action { // text: "action 2" // } // Action { // text: "action 3" // } // }, Action { text: "Show All Conversations" iconName: "view-list-details" checkable: true checked: true enabled: false onTriggered: { print("Action checked:" + checked) } exclusiveGroup: filterOptions }, Action { text: "Show Only SMS" iconName: "view-list-details" checkable: true checked: false enabled: false onTriggered: { print("Action checked:" + checked) } exclusiveGroup: filterOptions }, Action { text: "Show Only IM Chat" iconName: "view-list-details" checkable: true checked: false enabled: false onTriggered: { print("Action checked:" + checked) } exclusiveGroup: filterOptions } ] ExclusiveGroup { id: filterOptions } // RadioButton { // exclusiveGroup: filterOptions // checked: true // text: "All Conversations" // enabled: false // } // RadioButton { // exclusiveGroup: filterOptions // text: "Only SMS" // enabled: false // } // RadioButton { // exclusiveGroup: filterOptions // text: "Only IM Chat" // enabled: false // } } contextDrawer: Kirigami.ContextDrawer { id: contextDrawer } pageStack.initialPage: mainPageComponent // Component { // id: settingsComponent // Kirigami.Page { // objectName: "settingsPage" // Rectangle { // anchors.fill: parent // } // } // } //Main app content Component { id: mainPageComponent MainPage {} } Component { id: conversationPageComponent ConversationPage {} } Component { id: newConversationPageComponent NewConversationPage { id: newConversationPage } } Component.onCompleted: { telepathyManager.addTextChatFeatures(); telepathyManager.becomeReady(); } }