// SPDX-FileCopyrightText: 2017 Konstantinos Sideris // SPDX-FileCopyrightText: 2021 Nheko Contributors // // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include #include #include #include "UserSettingsPage.h" #include "ui/OverlayModal.h" #include "jdenticoninterface.h" class ChatPage; class RegisterPage; class LoginPage; class WelcomePage; class LoadingIndicator; class OverlayModal; class SnackBar; class TrayIcon; class UserSettings; namespace mtx { namespace requests { struct CreateRoom; } } namespace dialogs { class CreateRoom; class InviteUsers; class JoinRoom; class LeaveRoom; class Logout; class MemberList; class ReCaptcha; } class MainWindow : public QMainWindow { Q_OBJECT Q_PROPERTY(int x READ x CONSTANT) Q_PROPERTY(int y READ y CONSTANT) Q_PROPERTY(int width READ width CONSTANT) Q_PROPERTY(int height READ height CONSTANT) public: explicit MainWindow(QWidget *parent = nullptr); static MainWindow *instance() { return instance_; } void saveCurrentWindowSize(); void openLeaveRoomDialog(const QString &room_id); void openInviteUsersDialog(std::function callback); void openCreateRoomDialog( std::function callback); void openJoinRoomDialog(std::function callback); void hideOverlay(); void showSolidOverlayModal(QWidget *content, QFlags flags = Qt::AlignCenter); void showTransparentOverlayModal(QWidget *content, QFlags flags = Qt::AlignTop | Qt::AlignHCenter); protected: void closeEvent(QCloseEvent *event) override; bool event(QEvent *event) override; private slots: //! Handle interaction with the tray icon. void iconActivated(QSystemTrayIcon::ActivationReason reason); //! Show the welcome page in the main window. void showWelcomePage(); //! Show the login page in the main window. void showLoginPage(); //! Show the register page in the main window. void showRegisterPage(); //! Show user settings page. void showUserSettingsPage(); //! Show the chat page and start communicating with the given access token. void showChatPage(); void showOverlayProgressBar(); void removeOverlayProgressBar(); virtual void setWindowTitle(int notificationCount); signals: void focusChanged(const bool focused); void reload(); private: void showDialog(QWidget *dialog); bool hasActiveUser(); void restoreWindowSize(); //! Check if there is an open dialog. bool hasActiveDialogs() const; //! Check if the current page supports the "minimize to tray" functionality. bool pageSupportsTray() const; static MainWindow *instance_; //! The initial welcome screen. WelcomePage *welcome_page_; //! The login screen. LoginPage *login_page_; //! The register page. RegisterPage *register_page_; //! A stacked widget that handles the transitions between widgets. QStackedWidget *pageStack_; //! The main chat area. ChatPage *chat_page_; UserSettingsPage *userSettingsPage_; QSharedPointer userSettings_; //! Tray icon that shows the unread message count. TrayIcon *trayIcon_; //! Notifications display. SnackBar *snackBar_ = nullptr; //! Overlay modal used to project other widgets. OverlayModal *modal_ = nullptr; LoadingIndicator *spinner_ = nullptr; };