From 5b1f150171d9601939e4cd179385da32e3524c01 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 16 Feb 2017 12:52:46 -0800 Subject: [PATCH] Fix for race condition when switching between Main Menu and Audio Menu --- .../resources/qml/hifi/tablet/TabletMenu.qml | 6 ++- .../qml/hifi/tablet/TabletMenuView.qml | 2 +- .../resources/qml/hifi/tablet/TabletRoot.qml | 15 +++++-- .../resources/qml/hifi/tablet/WindowRoot.qml | 14 ++++-- .../src/TabletScriptingInterface.cpp | 45 ++++--------------- .../src/TabletScriptingInterface.h | 1 - 6 files changed, 35 insertions(+), 48 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/TabletMenu.qml b/interface/resources/qml/hifi/tablet/TabletMenu.qml index c154ac0f49..e0deab64b6 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenu.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenu.qml @@ -97,10 +97,12 @@ FocusScope { menuPopperUpper.closeLastMenu(); } - function setRootMenu(menu) { - tabletMenu.rootMenu = menu + function setRootMenu(rootMenu, subMenu) { + tabletMenu.subMenu = subMenu; + tabletMenu.rootMenu = rootMenu; buildMenu() } + function buildMenu() { // Build submenu if specified. if (subMenu !== "") { diff --git a/interface/resources/qml/hifi/tablet/TabletMenuView.qml b/interface/resources/qml/hifi/tablet/TabletMenuView.qml index 1845396230..92e7f59524 100644 --- a/interface/resources/qml/hifi/tablet/TabletMenuView.qml +++ b/interface/resources/qml/hifi/tablet/TabletMenuView.qml @@ -83,7 +83,7 @@ FocusScope { } function recalcSize() { - if (model.count !== count || !visible) { + if (!model || model.count !== count || !visible) { return; } diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index 78d3d8cabe..1fb31e5619 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -6,7 +6,9 @@ Item { objectName: "tabletRoot" property string username: "Unknown user" property var eventBridge; - property string option: "" + + property var rootMenu; + property string subMenu: "" signal showDesktop(); @@ -14,8 +16,13 @@ Item { option = value; } + function setMenuProperties(rootMenu, subMenu) { + tabletRoot.rootMenu = rootMenu; + tabletRoot.subMenu = subMenu; + } + function loadSource(url) { - loader.source = ""; // HACK: make sure we load the qml fresh each time. + loader.source = ""; // make sure we load the qml fresh each time. loader.source = url; } @@ -78,8 +85,8 @@ Item { if (loader.item.hasOwnProperty("sendToScript")) { loader.item.sendToScript.connect(tabletRoot.sendToScript); } - if (loader.item.hasOwnProperty("subMenu")) { - loader.item.subMenu = option; + if (loader.item.hasOwnProperty("setRootMenu")) { + loader.item.setRootMenu(tabletRoot.rootMenu, tabletRoot.subMenu); } loader.item.forceActiveFocus(); } diff --git a/interface/resources/qml/hifi/tablet/WindowRoot.qml b/interface/resources/qml/hifi/tablet/WindowRoot.qml index bc65aa67bf..5f842df7b7 100644 --- a/interface/resources/qml/hifi/tablet/WindowRoot.qml +++ b/interface/resources/qml/hifi/tablet/WindowRoot.qml @@ -19,17 +19,22 @@ Windows.ScrollingWindow { objectName: "tabletRoot" property string username: "Unknown user" property var eventBridge; + + property var rootMenu; + property string subMenu: "" + shown: false resizable: false signal showDesktop(); - function setOption(value) { - option = value; + function setMenuProperties(rootMenu, subMenu) { + tabletRoot.rootMenu = rootMenu; + tabletRoot.subMenu = subMenu; } function loadSource(url) { - loader.source = ""; // HACK: make sure we load the qml fresh each time. + loader.source = ""; // make sure we load the qml fresh each time. loader.source = url; } @@ -94,6 +99,9 @@ Windows.ScrollingWindow { if (loader.item.hasOwnProperty("sendToScript")) { loader.item.sendToScript.connect(tabletRoot.sendToScript); } + if (loader.item.hasOwnProperty("setRootMenu")) { + loader.item.setRootMenu(tabletRoot.rootMenu, tabletRoot.subMenu); + } loader.item.forceActiveFocus(); } } diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index 0e048206e6..a28bfc2f4b 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -293,16 +293,14 @@ void TabletProxy::gotoMenuScreen(const QString& submenu) { } if (root) { - if (_state != State::Menu) { - removeButtonsFromHomeScreen(); - QMetaObject::invokeMethod(root, "setOption", Q_ARG(const QVariant&, QVariant(submenu))); - auto loader = root->findChild("loader"); - QObject::connect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToMenuScreen()), Qt::DirectConnection); - QMetaObject::invokeMethod(root, "loadSource", Q_ARG(const QVariant&, QVariant(VRMENU_SOURCE_URL))); - _state = State::Menu; - emit screenChanged(QVariant("Menu"), QVariant(VRMENU_SOURCE_URL)); - QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); - } + removeButtonsFromHomeScreen(); + auto offscreenUi = DependencyManager::get(); + QObject* menu = offscreenUi->getRootMenu(); + QMetaObject::invokeMethod(root, "setMenuProperties", Q_ARG(QVariant, QVariant::fromValue(menu)), Q_ARG(const QVariant&, QVariant(submenu))); + QMetaObject::invokeMethod(root, "loadSource", Q_ARG(const QVariant&, QVariant(VRMENU_SOURCE_URL))); + _state = State::Menu; + emit screenChanged(QVariant("Menu"), QVariant(VRMENU_SOURCE_URL)); + QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); } } @@ -484,33 +482,6 @@ QObject* TabletProxy::getTabletSurface() { return _qmlOffscreenSurface; } -void TabletProxy::addButtonsToMenuScreen() { - QObject* root = nullptr; - if (!_toolbarMode && _qmlTabletRoot) { - root = _qmlTabletRoot; - } else if (_toolbarMode && _desktopWindow) { - root = _desktopWindow->asQuickItem(); - } - - if (!root) { - return; - } - - auto loader = root->findChild("loader"); - if (!loader) { - return; - } - - QQuickItem* VrMenu = loader->findChild("tabletMenu"); - if (VrMenu) { - auto offscreenUi = DependencyManager::get(); - QObject* menu = offscreenUi->getRootMenu(); - QMetaObject::invokeMethod(VrMenu, "setRootMenu", Qt::AutoConnection, Q_ARG(QVariant, QVariant::fromValue(menu))); - } - - QObject::disconnect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToMenuScreen())); -} - void TabletProxy::removeButtonsFromHomeScreen() { auto tablet = getQmlTablet(); for (auto& buttonProxy : _tabletButtonProxies) { diff --git a/libraries/script-engine/src/TabletScriptingInterface.h b/libraries/script-engine/src/TabletScriptingInterface.h index 3a095e5575..6c4633a161 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.h +++ b/libraries/script-engine/src/TabletScriptingInterface.h @@ -182,7 +182,6 @@ signals: protected slots: void addButtonsToHomeScreen(); - void addButtonsToMenuScreen(); void desktopWindowClosed(); protected: void removeButtonsFromHomeScreen();