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();
}
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 !== "") {

View file

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

View file

@ -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();
}

View file

@ -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();
}
}

View file

@ -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<QQuickItem*>("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<OffscreenUi>();
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<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() {
auto tablet = getQmlTablet();
for (auto& buttonProxy : _tabletButtonProxies) {

View file

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