/** * SPDX-FileCopyrightText: 2018-2020 Black Hat * SPDX-FileCopyrightText: 2020 Carl Schwan * * SPDX-License-Identifier: GPL-3.0-only */ import QtQuick 2.14 import QtQuick.Controls 2.14 as QQC2 import QtQuick.Layouts 1.14 import org.kde.kirigami 2.12 as Kirigami import org.kde.neochat 1.0 import NeoChat.Component 1.0 import NeoChat.Panel 1.0 import NeoChat.Dialog 1.0 import NeoChat.Page 1.0 Kirigami.ApplicationWindow { id: root property var currentRoom: null /** * Manage opening and close rooms */ QtObject { id: roomManager property var currentRoom: null property alias pageStack: root.pageStack property bool invitationOpen: false readonly property bool hasOpenRoom: currentRoom !== null signal leaveRoom(string room); signal openRoom(string room); function loadInitialRoom() { if (Config.openRoom) { const room = Controller.activeConnection.room(Config.openRoom); currentRoom = room; pageStack.push(roomPage, { 'currentRoom': room, }); } else { // TODO create welcome page } } function enterRoom(room) { let item = null; if (currentRoom != null || invitationOpen) { currentRoom = null; item = pageStack.replace(roomPage, { 'currentRoom': room, }); } else { item = pageStack.push(roomPage, { 'currentRoom': room, }); } currentRoom = room; Config.openRoom = room.id; Config.save(); return item; } function openInvitation(room) { if (currentRoom != null) { currentRoom = null; pageStack.removePage(pageStack.lastItem); } invitationOpen = true; pageStack.push("qrc:/imports/NeoChat/Page/InvitationPage.qml", {"room": room}); } function getBack() { pageStack.replace(roomPage, { 'currentRoom': currentRoom, }); } } function pushReplaceLayer(page, args) { if (pageStack.layers.depth === 2) { pageStack.layers.replace(page, args); } else { pageStack.layers.push(page, args); } } function showWindow() { root.show() root.raise() root.requestActivate() } contextDrawer: RoomDrawer { id: contextDrawer enabled: roomManager.hasOpenRoom room: roomManager.currentRoom handleVisible: enabled && pageStack.layers.depth < 2 } globalDrawer: Kirigami.GlobalDrawer { isMenu: true property bool hasLayer actions: [ Kirigami.Action { text: i18n("Explore rooms") icon.name: "compass" onTriggered: pushReplaceLayer("qrc:/imports/NeoChat/Page/JoinRoomPage.qml", {"connection": Controller.activeConnection}) enabled: pageStack.layers.currentItem.title !== i18n("Explore Rooms") }, Kirigami.Action { text: i18n("Start a Chat") icon.name: "irc-join-channel" onTriggered: pushReplaceLayer("qrc:/imports/NeoChat/Page/StartChatPage.qml", {"connection": Controller.activeConnection}) enabled: pageStack.layers.currentItem.title !== i18n("Start a Chat") }, Kirigami.Action { text: i18n("Accounts") icon.name: "im-user" onTriggered: pushReplaceLayer("qrc:/imports/NeoChat/Page/AccountsPage.qml") enabled: pageStack.layers.currentItem.title !== i18n("Accounts") }, Kirigami.Action { text: i18n("Settings") icon.name: "settings-configure" onTriggered: pushReplaceLayer("qrc:/imports/NeoChat/Page/SettingsPage.qml") enabled: pageStack.layers.currentItem.title !== i18n("Settings") }, Kirigami.Action { text: i18n("About Neochat") icon.name: "help-about" onTriggered: pushReplaceLayer(aboutPage) enabled: pageStack.layers.currentItem.title !== i18n("About") } ] } Component { id: aboutPage Kirigami.AboutPage { aboutData: Controller.aboutData } } pageStack.initialPage: LoadingPage {} Component { id: roomListComponent RoomListPage { id: roomList roomListModel: spectralRoomListModel activeConnection: Controller.activeConnection } } Connections { target: Controller onInitiated: { if (Controller.accountCount === 0) { pageStack.replace("qrc:/imports/NeoChat/Page/LoginPage.qml", {}); } else { pageStack.replace(roomListComponent, {'activeConnection': Controller.activeConnection}); roomManager.loadInitialRoom(); } } onConnectionAdded: { if (Controller.accountCount === 1) { pageStack.replace(roomListComponent); } } onConnectionDropped: { if (Controller.accountCount === 0) { pageStack.clear(); pageStack.replace("qrc:/imports/NeoChat/Page/LoginPage.qml"); } } onGlobalErrorOccured: showPassiveNotification(error + ": " + detail) onShowWindow: root.showWindow() } RoomListModel { id: spectralRoomListModel connection: Controller.activeConnection } Component { id: roomPage RoomPage {} } }