// SPDX-FileCopyrightText: 2017 Konstantinos Sideris // SPDX-FileCopyrightText: 2021 Nheko Contributors // SPDX-FileCopyrightText: 2022 Nheko Contributors // SPDX-FileCopyrightText: 2023 Nheko Contributors // // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include #include #include #include "UserSettingsPage.h" #include "dock/Dock.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 final : public QQuickView { Q_OBJECT public: explicit MainWindow(QWindow *parent = nullptr); static MainWindow *instance() { 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 Q_INVOKABLE void addPerRoomWindow(const QString &room, QWindow *window); Q_INVOKABLE void removePerRoomWindow(const QString &room, QWindow *window); QWindow *windowForRoom(const QString &room); QString focusedRoom() const; protected: void closeEvent(QCloseEvent *event); bool event(QEvent *event) override; // HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu void mousePressEvent(QMouseEvent *) override; private slots: //! Handle interaction with the tray icon. void iconActivated(QSystemTrayIcon::ActivationReason reason); virtual void setWindowTitle(int notificationCount); signals: // HACK: https://bugreports.qt.io/browse/QTBUG-83972, qtwayland cannot auto hide menu void hideMenu(); 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_; Dock *dock_; MxcImageProvider *imgProvider = nullptr; QMultiHash roomWindows_; #ifdef NHEKO_DBUS_SYS bool dbusAvailable_{false}; #endif };