// SPDX-FileCopyrightText: 2017 Konstantinos Sideris // SPDX-FileCopyrightText: 2021 Nheko Contributors // SPDX-FileCopyrightText: 2022 Nheko Contributors // // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include #include #include #include "UserSettingsPage.h" #include "jdenticoninterface.h" class ChatPage; class RegisterPage; class WelcomePage; class TrayIcon; class UserSettings; class MxcImageProvider; namespace mtx { namespace requests { struct CreateRoom; } } namespace dialogs { class CreateRoom; class InviteUsers; class MemberList; class ReCaptcha; } class MainWindow : public QQuickView { Q_OBJECT QML_ELEMENT QML_SINGLETON public: explicit MainWindow(QWindow *parent); static MainWindow *instance() { return instance_; } static MainWindow *create(QQmlEngine *qmlEngine, QJSEngine *) { // The instance has to exist before it is used. We cannot replace it. Q_ASSERT(instance_); // The engine has to have the same thread affinity as the singleton. Q_ASSERT(qmlEngine->thread() == instance_->thread()); // There can only be one engine accessing the singleton. static QJSEngine *s_engine = nullptr; if (s_engine) Q_ASSERT(qmlEngine == s_engine); else s_engine = qmlEngine; QJSEngine::setObjectOwnership(instance_, QJSEngine::CppOwnership); return instance_; } void saveCurrentWindowSize(); void openJoinRoomDialog(std::function callback); MxcImageProvider *imageProvider() { return imgProvider; } //! Show the chat page and start communicating with the given access token. void showChatPage(); #ifdef NHEKO_DBUS_SYS bool dbusAvailable() const { return dbusAvailable_; } #endif protected: void closeEvent(QCloseEvent *event); bool event(QEvent *event) override; private slots: //! Handle interaction with the tray icon. void iconActivated(QSystemTrayIcon::ActivationReason reason); virtual void setWindowTitle(int notificationCount); signals: void reload(); void secretsChanged(); void showNotification(QString msg); void switchToChatPage(); void switchToWelcomePage(); void switchToLoginPage(QString error); private: void showDialog(QWidget *dialog); bool hasActiveUser(); void restoreWindowSize(); //! Check if the current page supports the "minimize to tray" functionality. bool pageSupportsTray() const; void registerQmlTypes(); static MainWindow *instance_; //! The initial welcome screen. WelcomePage *welcome_page_; //! The register page. RegisterPage *register_page_; //! The main chat area. ChatPage *chat_page_; QSharedPointer userSettings_; //! Tray icon that shows the unread message count. TrayIcon *trayIcon_; MxcImageProvider *imgProvider = nullptr; #ifdef NHEKO_DBUS_SYS bool dbusAvailable_{false}; #endif };