diff --git a/interface/resources/qml/ConnectionFailureDialog.qml b/interface/resources/qml/ConnectionFailureDialog.qml new file mode 100644 index 0000000000..0d5bdfd38d --- /dev/null +++ b/interface/resources/qml/ConnectionFailureDialog.qml @@ -0,0 +1,14 @@ +import QtQuick.Dialogs 1.2 as OriginalDialogs + +import "dialogs" + +MessageDialog { + id: root + objectName: "ConnectionFailureDialog" + + title: "No Connection" + text: "Unable to connect to this domain. Click the 'GO TO' button on the toolbar to visit another domain." + buttons: OriginalDialogs.StandardButton.Ok + icon: OriginalDialogs.StandardIcon.Warning + defaultButton: OriginalDialogs.StandardButton.NoButton; +} diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9f137d79a1..0351df0bc8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -882,8 +882,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo UserActivityLogger::getInstance().logAction("launch", properties); - _connectionMonitor.init(); - // Tell our entity edit sender about our known jurisdictions _entityEditSender.setServerJurisdictions(&_entityServerJurisdictions); _entityEditSender.setMyAvatar(myAvatar.get()); @@ -1376,6 +1374,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo } } + _connectionMonitor.init(); + // After all of the constructor is completed, then set firstRun to false. firstRun.set(false); } diff --git a/interface/src/ConnectionMonitor.cpp b/interface/src/ConnectionMonitor.cpp index 4061209127..fcb1908994 100644 --- a/interface/src/ConnectionMonitor.cpp +++ b/interface/src/ConnectionMonitor.cpp @@ -13,34 +13,42 @@ #include "ui/DialogsManager.h" -#include #include #include -#include +#include +// Because the connection monitor is created at startup, the time we wait on initial load +// should be longer to allow the application to initialize. +static const int ON_INITIAL_LOAD_DISPLAY_AFTER_DISCONNECTED_FOR_X_MS = 10000; static const int DISPLAY_AFTER_DISCONNECTED_FOR_X_MS = 5000; void ConnectionMonitor::init() { // Connect to domain disconnected message auto nodeList = DependencyManager::get(); const DomainHandler& domainHandler = nodeList->getDomainHandler(); - connect(&domainHandler, &DomainHandler::disconnectedFromDomain, this, &ConnectionMonitor::disconnectedFromDomain); - connect(&domainHandler, &DomainHandler::connectedToDomain, this, &ConnectionMonitor::connectedToDomain); + connect(&domainHandler, &DomainHandler::resetting, this, &ConnectionMonitor::startTimer); + connect(&domainHandler, &DomainHandler::disconnectedFromDomain, this, &ConnectionMonitor::startTimer); + connect(&domainHandler, &DomainHandler::connectedToDomain, this, &ConnectionMonitor::stopTimer); + connect(&domainHandler, &DomainHandler::domainConnectionRefused, this, &ConnectionMonitor::stopTimer); _timer.setSingleShot(true); - _timer.setInterval(DISPLAY_AFTER_DISCONNECTED_FOR_X_MS); if (!domainHandler.isConnected()) { - _timer.start(); + _timer.start(ON_INITIAL_LOAD_DISPLAY_AFTER_DISCONNECTED_FOR_X_MS); } - auto dialogsManager = DependencyManager::get(); - connect(&_timer, &QTimer::timeout, dialogsManager.data(), &DialogsManager::indicateDomainConnectionFailure); + connect(&_timer, &QTimer::timeout, this, []() { + qDebug() << "ConnectionMonitor: Showing connection failure window"; + DependencyManager::get()->setDomainConnectionFailureVisibility(true); + }); } -void ConnectionMonitor::disconnectedFromDomain() { - _timer.start(); +void ConnectionMonitor::startTimer() { + qDebug() << "ConnectionMonitor: Starting timer"; + _timer.start(DISPLAY_AFTER_DISCONNECTED_FOR_X_MS); } -void ConnectionMonitor::connectedToDomain(const QString& name) { +void ConnectionMonitor::stopTimer() { + qDebug() << "ConnectionMonitor: Stopping timer"; _timer.stop(); + DependencyManager::get()->setDomainConnectionFailureVisibility(false); } diff --git a/interface/src/ConnectionMonitor.h b/interface/src/ConnectionMonitor.h index ddd80c4af5..e3d393163b 100644 --- a/interface/src/ConnectionMonitor.h +++ b/interface/src/ConnectionMonitor.h @@ -23,8 +23,8 @@ public: void init(); private slots: - void disconnectedFromDomain(); - void connectedToDomain(const QString& name); + void startTimer(); + void stopTimer(); private: QTimer _timer; diff --git a/interface/src/ui/ConnectionFailureDialog.cpp b/interface/src/ui/ConnectionFailureDialog.cpp new file mode 100644 index 0000000000..560c76629b --- /dev/null +++ b/interface/src/ui/ConnectionFailureDialog.cpp @@ -0,0 +1,3 @@ +#include "ConnectionFailureDialog.h" + +HIFI_QML_DEF(ConnectionFailureDialog) diff --git a/interface/src/ui/ConnectionFailureDialog.h b/interface/src/ui/ConnectionFailureDialog.h new file mode 100644 index 0000000000..94cab7d11d --- /dev/null +++ b/interface/src/ui/ConnectionFailureDialog.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +class ConnectionFailureDialog : public OffscreenQmlDialog { + Q_OBJECT + HIFI_QML_DECL +}; \ No newline at end of file diff --git a/interface/src/ui/DialogsManager.cpp b/interface/src/ui/DialogsManager.cpp index 2be4793b92..679fb7f59d 100644 --- a/interface/src/ui/DialogsManager.cpp +++ b/interface/src/ui/DialogsManager.cpp @@ -21,6 +21,7 @@ #include "AddressBarDialog.h" #include "BandwidthDialog.h" #include "CachesSizeDialog.h" +#include "ConnectionFailureDialog.h" #include "DiskCacheEditor.h" #include "DomainConnectionDialog.h" #include "HMDToolsDialog.h" @@ -59,8 +60,12 @@ void DialogsManager::showFeed() { emit setUseFeed(true); } -void DialogsManager::indicateDomainConnectionFailure() { - OffscreenUi::information("No Connection", "Unable to connect to this domain. Click the 'GO TO' button on the toolbar to visit another domain."); +void DialogsManager::setDomainConnectionFailureVisibility(bool visible) { + if (visible) { + ConnectionFailureDialog::show(); + } else { + ConnectionFailureDialog::hide(); + } } void DialogsManager::toggleDiskCacheEditor() { diff --git a/interface/src/ui/DialogsManager.h b/interface/src/ui/DialogsManager.h index dfd787bce8..e89bc43020 100644 --- a/interface/src/ui/DialogsManager.h +++ b/interface/src/ui/DialogsManager.h @@ -44,7 +44,7 @@ public slots: void toggleAddressBar(); void showAddressBar(); void showFeed(); - void indicateDomainConnectionFailure(); + void setDomainConnectionFailureVisibility(bool visible); void toggleDiskCacheEditor(); void toggleLoginDialog(); void showLoginDialog(); diff --git a/libraries/ui/src/OffscreenQmlElement.h b/libraries/ui/src/OffscreenQmlElement.h index 87b404a4bd..4e07fcccd9 100644 --- a/libraries/ui/src/OffscreenQmlElement.h +++ b/libraries/ui/src/OffscreenQmlElement.h @@ -22,6 +22,7 @@ private: \ public: \ static void registerType(); \ static void show(std::function f = [](QQmlContext*, QObject*) {}); \ + static void hide(); \ static void toggle(std::function f = [](QQmlContext*, QObject*) {}); \ static void load(std::function f = [](QQmlContext*, QObject*) {}); \ private: @@ -33,6 +34,7 @@ protected: \ public: \ static void registerType(); \ static void show(); \ + static void hide(); \ static void toggle(); \ static void load(); \ private: @@ -50,6 +52,11 @@ private: offscreenUi->show(QML, NAME, f); \ } \ \ + void x::hide() { \ + auto offscreenUi = DependencyManager::get(); \ + offscreenUi->hide(NAME); \ + } \ + \ void x::toggle(std::function f) { \ auto offscreenUi = DependencyManager::get(); \ offscreenUi->toggle(QML, NAME, f); \ @@ -70,6 +77,11 @@ private: auto offscreenUi = DependencyManager::get(); \ offscreenUi->show(QML, NAME, f); \ } \ + void x::hide() { \ + auto offscreenUi = DependencyManager::get(); \ + offscreenUi->hide(NAME); \ + } \ + \ void x::toggle() { \ auto offscreenUi = DependencyManager::get(); \ offscreenUi->toggle(QML, NAME, f); \