Fix for race condition when switching between Main Menu and Audio Menu

This commit is contained in:
Anthony J. Thibault 2017-02-16 12:52:46 -08:00
parent 03b6280ed0
commit 5b1f150171
6 changed files with 35 additions and 48 deletions

View file

@ -97,10 +97,12 @@ FocusScope {
menuPopperUpper.closeLastMenu(); menuPopperUpper.closeLastMenu();
} }
function setRootMenu(menu) { function setRootMenu(rootMenu, subMenu) {
tabletMenu.rootMenu = menu tabletMenu.subMenu = subMenu;
tabletMenu.rootMenu = rootMenu;
buildMenu() buildMenu()
} }
function buildMenu() { function buildMenu() {
// Build submenu if specified. // Build submenu if specified.
if (subMenu !== "") { if (subMenu !== "") {

View file

@ -83,7 +83,7 @@ FocusScope {
} }
function recalcSize() { function recalcSize() {
if (model.count !== count || !visible) { if (!model || model.count !== count || !visible) {
return; return;
} }

View file

@ -6,7 +6,9 @@ Item {
objectName: "tabletRoot" objectName: "tabletRoot"
property string username: "Unknown user" property string username: "Unknown user"
property var eventBridge; property var eventBridge;
property string option: ""
property var rootMenu;
property string subMenu: ""
signal showDesktop(); signal showDesktop();
@ -14,8 +16,13 @@ Item {
option = value; option = value;
} }
function setMenuProperties(rootMenu, subMenu) {
tabletRoot.rootMenu = rootMenu;
tabletRoot.subMenu = subMenu;
}
function loadSource(url) { 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; loader.source = url;
} }
@ -78,8 +85,8 @@ Item {
if (loader.item.hasOwnProperty("sendToScript")) { if (loader.item.hasOwnProperty("sendToScript")) {
loader.item.sendToScript.connect(tabletRoot.sendToScript); loader.item.sendToScript.connect(tabletRoot.sendToScript);
} }
if (loader.item.hasOwnProperty("subMenu")) { if (loader.item.hasOwnProperty("setRootMenu")) {
loader.item.subMenu = option; loader.item.setRootMenu(tabletRoot.rootMenu, tabletRoot.subMenu);
} }
loader.item.forceActiveFocus(); loader.item.forceActiveFocus();
} }

View file

@ -19,17 +19,22 @@ Windows.ScrollingWindow {
objectName: "tabletRoot" objectName: "tabletRoot"
property string username: "Unknown user" property string username: "Unknown user"
property var eventBridge; property var eventBridge;
property var rootMenu;
property string subMenu: ""
shown: false shown: false
resizable: false resizable: false
signal showDesktop(); signal showDesktop();
function setOption(value) { function setMenuProperties(rootMenu, subMenu) {
option = value; tabletRoot.rootMenu = rootMenu;
tabletRoot.subMenu = subMenu;
} }
function loadSource(url) { 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; loader.source = url;
} }
@ -94,6 +99,9 @@ Windows.ScrollingWindow {
if (loader.item.hasOwnProperty("sendToScript")) { if (loader.item.hasOwnProperty("sendToScript")) {
loader.item.sendToScript.connect(tabletRoot.sendToScript); loader.item.sendToScript.connect(tabletRoot.sendToScript);
} }
if (loader.item.hasOwnProperty("setRootMenu")) {
loader.item.setRootMenu(tabletRoot.rootMenu, tabletRoot.subMenu);
}
loader.item.forceActiveFocus(); loader.item.forceActiveFocus();
} }
} }

View file

@ -293,16 +293,14 @@ void TabletProxy::gotoMenuScreen(const QString& submenu) {
} }
if (root) { if (root) {
if (_state != State::Menu) { removeButtonsFromHomeScreen();
removeButtonsFromHomeScreen(); auto offscreenUi = DependencyManager::get<OffscreenUi>();
QMetaObject::invokeMethod(root, "setOption", Q_ARG(const QVariant&, QVariant(submenu))); QObject* menu = offscreenUi->getRootMenu();
auto loader = root->findChild<QQuickItem*>("loader"); QMetaObject::invokeMethod(root, "setMenuProperties", Q_ARG(QVariant, QVariant::fromValue(menu)), Q_ARG(const QVariant&, QVariant(submenu)));
QObject::connect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToMenuScreen()), Qt::DirectConnection); QMetaObject::invokeMethod(root, "loadSource", Q_ARG(const QVariant&, QVariant(VRMENU_SOURCE_URL)));
QMetaObject::invokeMethod(root, "loadSource", Q_ARG(const QVariant&, QVariant(VRMENU_SOURCE_URL))); _state = State::Menu;
_state = State::Menu; emit screenChanged(QVariant("Menu"), QVariant(VRMENU_SOURCE_URL));
emit screenChanged(QVariant("Menu"), QVariant(VRMENU_SOURCE_URL)); QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true)));
QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true)));
}
} }
} }
@ -484,33 +482,6 @@ QObject* TabletProxy::getTabletSurface() {
return _qmlOffscreenSurface; 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<QQuickItem*>("loader");
if (!loader) {
return;
}
QQuickItem* VrMenu = loader->findChild<QQuickItem*>("tabletMenu");
if (VrMenu) {
auto offscreenUi = DependencyManager::get<OffscreenUi>();
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() { void TabletProxy::removeButtonsFromHomeScreen() {
auto tablet = getQmlTablet(); auto tablet = getQmlTablet();
for (auto& buttonProxy : _tabletButtonProxies) { for (auto& buttonProxy : _tabletButtonProxies) {

View file

@ -182,7 +182,6 @@ signals:
protected slots: protected slots:
void addButtonsToHomeScreen(); void addButtonsToHomeScreen();
void addButtonsToMenuScreen();
void desktopWindowClosed(); void desktopWindowClosed();
protected: protected:
void removeButtonsFromHomeScreen(); void removeButtonsFromHomeScreen();