diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f1825b2c4a..3b2173f05e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -767,6 +767,7 @@ void Application::initializeUi() { AddressBarDialog::registerType(); LoginDialog::registerType(); MessageDialog::registerType(); + VrMenu::registerType(); auto offscreenUi = DependencyManager::get(); offscreenUi->create(_glWidget->context()->contextHandle()); @@ -775,6 +776,8 @@ void Application::initializeUi() { offscreenUi->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/")); offscreenUi->load("Root.qml"); offscreenUi->load("RootMenu.qml"); + VrMenu::load(); + VrMenu::executeQueuedLambdas(); offscreenUi->setMouseTranslator([this](const QPointF& p){ if (OculusManager::isConnected()) { glm::vec2 pos = _applicationOverlay.screenToOverlay(toGlm(p)); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index c467658fc4..868fa9270c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -975,7 +975,9 @@ bool Menu::menuItemExists(const QString& menu, const QString& menuitem) { MenuWrapper::MenuWrapper(QMenu* menu) : _realMenu(menu) { - VrMenu::instance()->addMenu(menu); + VrMenu::executeOrQueue([=](VrMenu* vrMenu) { + vrMenu->addMenu(menu); + }); _backMap[menu] = this; } @@ -997,18 +999,24 @@ void MenuWrapper::addSeparator() { void MenuWrapper::addAction(QAction* action) { _realMenu->addAction(action); - VrMenu::instance()->addAction(_realMenu, action); + VrMenu::executeOrQueue([=](VrMenu* vrMenu) { + vrMenu->addAction(_realMenu, action); + }); } QAction* MenuWrapper::addAction(const QString& menuName) { QAction* action = _realMenu->addAction(menuName); - VrMenu::instance()->addAction(_realMenu, action); + VrMenu::executeOrQueue([=](VrMenu* vrMenu) { + vrMenu->addAction(_realMenu, action); + }); return action; } QAction* MenuWrapper::addAction(const QString& menuName, const QObject* receiver, const char* member, const QKeySequence& shortcut) { QAction* action = _realMenu->addAction(menuName, receiver, member, shortcut); - VrMenu::instance()->addAction(_realMenu, action); + VrMenu::executeOrQueue([=](VrMenu* vrMenu) { + vrMenu->addAction(_realMenu, action); + }); return action; } @@ -1018,7 +1026,9 @@ void MenuWrapper::removeAction(QAction* action) { void MenuWrapper::insertAction(QAction* before, QAction* action) { _realMenu->insertAction(before, action); - VrMenu::instance()->insertAction(before, action); + VrMenu::executeOrQueue([=](VrMenu* vrMenu) { + vrMenu->insertAction(before, action); + }); } QHash MenuWrapper::_backMap; diff --git a/libraries/ui/src/VrMenu.cpp b/libraries/ui/src/VrMenu.cpp index 04c2cb0b30..5c0f8fb732 100644 --- a/libraries/ui/src/VrMenu.cpp +++ b/libraries/ui/src/VrMenu.cpp @@ -42,7 +42,7 @@ private: qmlObject->setUserData(USER_DATA_ID, this); qmlObject->setObjectName(uuid.toString()); // Make sure we can find it again in the future - Q_ASSERT(VrMenu::instance()->findMenuObject(uuid.toString())); + Q_ASSERT(VrMenu::_instance->findMenuObject(uuid.toString())); } }; @@ -57,14 +57,25 @@ HIFI_QML_DEF_LAMBDA(VrMenu, [&](QQmlContext* context, QObject* newItem) { }); VrMenu* VrMenu::_instance{ nullptr }; +static QQueue> queuedLambdas; -VrMenu* VrMenu::instance() { - if (!_instance) { - VrMenu::registerType(); - VrMenu::load(); - Q_ASSERT(_instance); +void VrMenu::executeOrQueue(std::function f) { + if (_instance) { + foreach(std::function priorLambda, queuedLambdas) { + priorLambda(_instance); + } + f(_instance); + } else { + queuedLambdas.push_back(f); } - return _instance; +} + +void VrMenu::executeQueuedLambdas() { + Q_ASSERT(_instance); + foreach(std::function f, queuedLambdas) { + f(_instance); + } + queuedLambdas.clear(); } VrMenu::VrMenu(QQuickItem* parent) : QQuickItem(parent) { @@ -72,6 +83,7 @@ VrMenu::VrMenu(QQuickItem* parent) : QQuickItem(parent) { this->setEnabled(false); } + // QML helper functions QObject* addMenu(QObject* parent, const QString& text) { // FIXME add more checking here to ensure no name conflicts diff --git a/libraries/ui/src/VrMenu.h b/libraries/ui/src/VrMenu.h index 7fe0d33cc4..06a16588af 100644 --- a/libraries/ui/src/VrMenu.h +++ b/libraries/ui/src/VrMenu.h @@ -26,7 +26,8 @@ class VrMenu : public QQuickItem { HIFI_QML_DECL_LAMBDA public: - static VrMenu* instance(); + static void executeOrQueue(std::function f); + static void executeQueuedLambdas(); VrMenu(QQuickItem* parent = nullptr); void addMenu(QMenu* menu); void addAction(QMenu* parent, QAction* action);