From 4ef44b8e93b3a0039c857d58d1af2e73ab2f7b49 Mon Sep 17 00:00:00 2001 From: Tobias Fella Date: Sun, 5 Nov 2023 22:49:36 +0100 Subject: [PATCH] Track online status per connection --- src/controller.cpp | 19 ------------------- src/controller.h | 9 --------- src/neochatconnection.cpp | 20 ++++++++++++++++++++ src/neochatconnection.h | 12 ++++++++++++ src/qml/RoomPage.qml | 4 ++-- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/controller.cpp b/src/controller.cpp index 9b10bab33..23285ffae 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -326,20 +326,6 @@ void Controller::setActiveConnection(NeoChatConnection *connection) m_connection = connection; if (connection != nullptr) { NeoChatConfig::self()->setActiveConnection(connection->userId()); - connect(connection, &NeoChatConnection::networkError, this, [this]() { - if (!m_isOnline) { - return; - } - m_isOnline = false; - Q_EMIT isOnlineChanged(false); - }); - connect(connection, &NeoChatConnection::syncDone, this, [this] { - if (m_isOnline) { - return; - } - m_isOnline = true; - Q_EMIT isOnlineChanged(true); - }); connect(connection, &NeoChatConnection::requestFailed, this, [](BaseJob *job) { if (dynamic_cast(job) && job->jsonData()["errcode"_ls].toString() == "M_TOO_LARGE"_ls) { RoomManager::instance().warning(i18n("File too large to download."), i18n("Contact your matrix server administrator for support.")); @@ -357,11 +343,6 @@ void Controller::saveWindowGeometry() WindowController::instance().saveGeometry(); } -bool Controller::isOnline() const -{ - return m_isOnline; -} - // TODO: Remove in favor of RoomManager::joinRoom void Controller::joinRoom(const QString &alias) { diff --git a/src/controller.h b/src/controller.h index 9572b8bb0..107daf8e4 100644 --- a/src/controller.h +++ b/src/controller.h @@ -51,11 +51,6 @@ class Controller : public QObject */ Q_PROPERTY(bool supportSystemTray READ supportSystemTray CONSTANT) - /** - * @brief Whether NeoChat is currently able to connect to the server. - */ - Q_PROPERTY(bool isOnline READ isOnline NOTIFY isOnlineChanged) - /** * @brief Whether NeoChat is running as a flatpak. * @@ -108,8 +103,6 @@ public: [[nodiscard]] bool supportSystemTray() const; - bool isOnline() const; - /** * @brief Sets the QNetworkProxy for the application. * @@ -138,7 +131,6 @@ private: void loadSettings(); void saveSettings() const; - bool m_isOnline = true; QMap m_notificationCounts; Quotient::AccountRegistry m_accountRegistry; @@ -164,7 +156,6 @@ Q_SIGNALS: void activeConnectionChanged(); void passwordStatus(Controller::PasswordStatus status); void userConsentRequired(QUrl url); - void isOnlineChanged(bool isOnline); void accountsLoadingChanged(); public Q_SLOTS: diff --git a/src/neochatconnection.cpp b/src/neochatconnection.cpp index 2621f0f16..f55817186 100644 --- a/src/neochatconnection.cpp +++ b/src/neochatconnection.cpp @@ -31,6 +31,12 @@ NeoChatConnection::NeoChatConnection(QObject *parent) Q_EMIT labelChanged(); } }); + connect(this, &NeoChatConnection::syncDone, this, [this] { + setIsOnline(true); + }); + connect(this, &NeoChatConnection::networkError, this, [this]() { + setIsOnline(false); + }); } NeoChatConnection::NeoChatConnection(const QUrl &server, QObject *parent) @@ -252,4 +258,18 @@ QString NeoChatConnection::encryptionKey() const return query.value(0).toString(); } +bool NeoChatConnection::isOnline() const +{ + return m_isOnline; +} + +void NeoChatConnection::setIsOnline(bool isOnline) +{ + if (isOnline == m_isOnline) { + return; + } + m_isOnline = isOnline; + Q_EMIT isOnlineChanged(); +} + #include "moc_neochatconnection.cpp" diff --git a/src/neochatconnection.h b/src/neochatconnection.h index 1ed62f0df..4323289cf 100644 --- a/src/neochatconnection.h +++ b/src/neochatconnection.h @@ -26,6 +26,11 @@ class NeoChatConnection : public Quotient::Connection Q_PROPERTY(QString deviceKey READ deviceKey CONSTANT) Q_PROPERTY(QString encryptionKey READ encryptionKey CONSTANT) + /** + * @brief Whether NeoChat is currently able to connect to the server. + */ + Q_PROPERTY(bool isOnline READ isOnline WRITE setIsOnline NOTIFY isOnlineChanged) + public: NeoChatConnection(QObject *parent = nullptr); NeoChatConnection(const QUrl &server, QObject *parent = nullptr); @@ -73,6 +78,13 @@ public: QString deviceKey() const; QString encryptionKey() const; + bool isOnline() const; + Q_SIGNALS: void labelChanged(); + void isOnlineChanged(); + +private: + bool m_isOnline = true; + void setIsOnline(bool isOnline); }; diff --git a/src/qml/RoomPage.qml b/src/qml/RoomPage.qml index 58084b7df..61e070b4f 100644 --- a/src/qml/RoomPage.qml +++ b/src/qml/RoomPage.qml @@ -94,9 +94,9 @@ Kirigami.Page { } Connections { - target: Controller + target: root.connection function onIsOnlineChanged() { - if (!Controller.isOnline) { + if (!root.connection.isOnline) { banner.text = i18n("NeoChat is offline. Please check your network connection."); banner.visible = true; banner.type = Kirigami.MessageType.Error;