From 60bbcc7fc31b654ed8a70d7553dc0552c56765ac Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Tue, 9 Oct 2018 15:20:16 -0700 Subject: [PATCH] adding initialization of qml when keyboard ready --- interface/src/Application.cpp | 34 ++++++++++++++++++++++---------- interface/src/Application.h | 1 + libraries/ui/src/OffscreenUi.cpp | 25 +++++++++++++---------- libraries/ui/src/OffscreenUi.h | 1 + 4 files changed, 41 insertions(+), 20 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 16ab667233..f53e329e10 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1775,11 +1775,15 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo } }); + connect(offscreenUi.data(), &OffscreenUi::keyboardFocusActive, [this]() { + initializeQml(); + }); + // Make sure we don't time out during slow operations at startup updateHeartbeat(); QTimer* settingsTimer = new QTimer(); moveToNewNamedThread(settingsTimer, "Settings Thread", [this, settingsTimer]{ - // This needs to run on the settings thread, so we need to pass the `settingsTimer` as the + // This needs to run on the settings thread, so we need to pass the `settingsTimer` as the // receiver object, otherwise it will run on the application thread and trigger a warning // about trying to kill the timer on the main thread. connect(qApp, &Application::beforeAboutToQuit, settingsTimer, [this, settingsTimer]{ @@ -2327,15 +2331,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(&AndroidHelper::instance(), &AndroidHelper::enterBackground, this, &Application::enterBackground); connect(&AndroidHelper::instance(), &AndroidHelper::enterForeground, this, &Application::enterForeground); AndroidHelper::instance().notifyLoadComplete(); -#else - if (!accountManager->isLoggedIn()) { - Setting::Handle{"loginDialogPoppedUp", false}.set(true); - dialogsManager->showLoginDialog(); - QJsonObject loginData = {}; - loginData["action"] = "login dialog shown"; - UserActivityLogger::getInstance().logAction("encourageLoginDialog", loginData); - } - Setting::Handle{"loginDialogPoppedUp", false}.set(false); #endif } @@ -2883,6 +2878,25 @@ void Application::initializeRenderEngine() { extern void setupPreferences(); static void addDisplayPluginToMenu(const DisplayPluginPointer& displayPlugin, int index, bool active = false); +void Application::initializeQml() { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "initializeQml"); + return; + } +#if !defined(Q_OS_ANDROID) + auto accountManager = DependencyManager::get(); + auto dialogsManager = DependencyManager::get(); + if (!accountManager->isLoggedIn()) { + Setting::Handle{"loginDialogPoppedUp", false}.set(true); + dialogsManager->showLoginDialog(); + QJsonObject loginData = {}; + loginData["action"] = "login dialog shown"; + UserActivityLogger::getInstance().logAction("encourageLoginDialog", loginData); + } + Setting::Handle{"loginDialogPoppedUp", false}.set(false); +#endif +} + void Application::initializeUi() { AddressBarDialog::registerType(); ErrorDialog::registerType(); diff --git a/interface/src/Application.h b/interface/src/Application.h index 75260b910f..8b061dda07 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -149,6 +149,7 @@ public: void initializeGL(); void initializeDisplayPlugins(); void initializeRenderEngine(); + void initializeQml(); void initializeUi(); void updateSecondaryCameraViewFrustum(); diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 2cbd6517b0..dd4031b68d 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -637,24 +637,28 @@ public: KeyboardFocusHack() { Q_ASSERT(_mainWindow); QTimer::singleShot(200, [=] { - _hackWindow = new QWindow(); - _hackWindow->setFlags(Qt::FramelessWindowHint); - _hackWindow->setGeometry(_mainWindow->x(), _mainWindow->y(), 10, 10); - _hackWindow->show(); - _hackWindow->requestActivate(); + _window = new QWindow(); + _window->setFlags(Qt::FramelessWindowHint); + _window->setGeometry(_mainWindow->x(), _mainWindow->y(), 10, 10); + _window->show(); + _window->requestActivate(); QTimer::singleShot(200, [=] { - _hackWindow->hide(); - _hackWindow->deleteLater(); - _hackWindow = nullptr; + _window->hide(); + _window->deleteLater(); + _window = nullptr; _mainWindow->requestActivate(); + emit keyboardFocusActive(); this->deleteLater(); }); }); } +signals: + void keyboardFocusActive(); + private: QWindow* const _mainWindow { MainWindow::findMainWindow() }; - QWindow* _hackWindow { nullptr }; + QWindow* _window { nullptr }; }; void OffscreenUi::createDesktop(const QUrl& url) { @@ -673,9 +677,10 @@ void OffscreenUi::createDesktop(const QUrl& url) { menuInitializer(_vrMenu); } - // new KeyboardFocusHack(); + auto keyboardFocus = new KeyboardFocusHack(); connect(_desktop, SIGNAL(showDesktop()), this, SIGNAL(showDesktop())); emit desktopReady(); + connect(keyboardFocus, SIGNAL(keyboardFocusActive()), this, SIGNAL(keyboardFocusActive())); }); } diff --git a/libraries/ui/src/OffscreenUi.h b/libraries/ui/src/OffscreenUi.h index fbf7068b1c..46dbdbdf13 100644 --- a/libraries/ui/src/OffscreenUi.h +++ b/libraries/ui/src/OffscreenUi.h @@ -244,6 +244,7 @@ signals: // void assetDialogResponse(QString response); // void inputDialogResponse(QVariant response); void desktopReady(); + void keyboardFocusActive(); public slots: void removeModalDialog(QObject* modal);