From 7f355c48b1476c5cfe370351adb7336bcf1a9ead Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 4 Nov 2016 21:34:08 +0100 Subject: [PATCH 1/2] saving work progress --- libraries/ui/src/VrMenu.cpp | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/libraries/ui/src/VrMenu.cpp b/libraries/ui/src/VrMenu.cpp index f4b365265d..790ccfd61e 100644 --- a/libraries/ui/src/VrMenu.cpp +++ b/libraries/ui/src/VrMenu.cpp @@ -12,6 +12,7 @@ #include #include +#include #include "OffscreenUi.h" @@ -217,6 +218,7 @@ void VrMenu::insertAction(QAction* before, QAction* action) { } class QQuickMenuBase; +class QQuickMenu1; void VrMenu::removeAction(QAction* action) { if (!action) { @@ -228,10 +230,33 @@ void VrMenu::removeAction(QAction* action) { qWarning("Attempted to remove menu action with no found QML object"); return; } - + + QObject* parent = action->menu(); + QObject* qmlParent = nullptr; + + QMenu* parentMenu = dynamic_cast(parent); + if (parentMenu) { + MenuUserData* MenuUserData = MenuUserData::forObject(parentMenu->menuAction()); + if (!MenuUserData) { + return; + } + qmlParent = findMenuObject(MenuUserData->uuid.toString()); + } else if (dynamic_cast(parent)) { + qmlParent = _rootMenu; + } else { + Q_ASSERT(false); + } + QObject* item = findMenuObject(userData->uuid.toString()); - QObject* menu = item->parent(); - // Proxy QuickItem requests through the QML layer - QQuickMenuBase* qmlItem = reinterpret_cast(item); - QMetaObject::invokeMethod(menu, "removeItem", Qt::DirectConnection, Q_ARG(QQuickMenuBase*, qmlItem)); + + QQuickMenu1* menu = nullptr; + QMetaObject::invokeMethod(item, "parentMenu", Qt::DirectConnection, Q_RETURN_ARG(QQuickMenu1*, menu)); + + if (!menu) { + return; + } + QQuickMenuBase* menuItem = reinterpret_cast(item); + QObject* baseMenu = reinterpret_cast(menu); + + QMetaObject::invokeMethod(baseMenu, "removeItem", Qt::DirectConnection, Q_ARG(QQuickMenuBase*, menuItem)); } From 4b087a271817766a4622a43b246fe4025bd636df Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 8 Nov 2016 19:47:44 +0000 Subject: [PATCH 2/2] fixed unable to remove menus from vrmenu context --- libraries/ui/src/VrMenu.cpp | 42 ++++++++++++------------------------ libraries/ui/src/ui/Menu.cpp | 19 +++++++++------- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/libraries/ui/src/VrMenu.cpp b/libraries/ui/src/VrMenu.cpp index 790ccfd61e..552d082aaa 100644 --- a/libraries/ui/src/VrMenu.cpp +++ b/libraries/ui/src/VrMenu.cpp @@ -59,6 +59,18 @@ public: _qml->setProperty("visible", _action->isVisible()); } + void clear() { + _qml->setProperty("checkable", 0); + _qml->setProperty("enabled", 0); + _qml->setProperty("text", 0); + _qml->setProperty("shortcut", 0); + _qml->setProperty("checked", 0); + _qml->setProperty("visible", 0); + + _action->setUserData(USER_DATA_ID, nullptr); + _qml->setUserData(USER_DATA_ID, nullptr); + } + const QUuid uuid{ QUuid::createUuid() }; @@ -231,32 +243,6 @@ void VrMenu::removeAction(QAction* action) { return; } - QObject* parent = action->menu(); - QObject* qmlParent = nullptr; - - QMenu* parentMenu = dynamic_cast(parent); - if (parentMenu) { - MenuUserData* MenuUserData = MenuUserData::forObject(parentMenu->menuAction()); - if (!MenuUserData) { - return; - } - qmlParent = findMenuObject(MenuUserData->uuid.toString()); - } else if (dynamic_cast(parent)) { - qmlParent = _rootMenu; - } else { - Q_ASSERT(false); - } - - QObject* item = findMenuObject(userData->uuid.toString()); - - QQuickMenu1* menu = nullptr; - QMetaObject::invokeMethod(item, "parentMenu", Qt::DirectConnection, Q_RETURN_ARG(QQuickMenu1*, menu)); - - if (!menu) { - return; - } - QQuickMenuBase* menuItem = reinterpret_cast(item); - QObject* baseMenu = reinterpret_cast(menu); - - QMetaObject::invokeMethod(baseMenu, "removeItem", Qt::DirectConnection, Q_ARG(QQuickMenuBase*, menuItem)); + userData->clear(); + delete userData; } diff --git a/libraries/ui/src/ui/Menu.cpp b/libraries/ui/src/ui/Menu.cpp index fcce999839..aee8b40832 100644 --- a/libraries/ui/src/ui/Menu.cpp +++ b/libraries/ui/src/ui/Menu.cpp @@ -84,7 +84,7 @@ void Menu::scanMenu(QMenu& menu, settingsAction modifySetting, Settings& setting groups.pop_back(); } -void Menu::addDisabledActionAndSeparator(MenuWrapper* destinationMenu, const QString& actionName, +void Menu::addDisabledActionAndSeparator(MenuWrapper* destinationMenu, const QString& actionName, int menuItemLocation, const QString& grouping) { QAction* actionBefore = NULL; QAction* separator; @@ -123,7 +123,7 @@ QAction* Menu::addActionToQMenuAndActionHash(MenuWrapper* destinationMenu, const QObject* receiver, const char* member, QAction::MenuRole role, - int menuItemLocation, + int menuItemLocation, const QString& grouping) { QAction* action = NULL; QAction* actionBefore = NULL; @@ -165,7 +165,7 @@ QAction* Menu::addActionToQMenuAndActionHash(MenuWrapper* destinationMenu, const QString& actionName, const QKeySequence& shortcut, QAction::MenuRole role, - int menuItemLocation, + int menuItemLocation, const QString& grouping) { QAction* actionBefore = NULL; @@ -207,7 +207,7 @@ QAction* Menu::addCheckableActionToQMenuAndActionHash(MenuWrapper* destinationMe const bool checked, const QObject* receiver, const char* member, - int menuItemLocation, + int menuItemLocation, const QString& grouping) { QAction* action = addActionToQMenuAndActionHash(destinationMenu, actionName, shortcut, receiver, member, @@ -408,6 +408,10 @@ void Menu::removeMenu(const QString& menuName) { parent->removeAction(action); } else { QMenuBar::removeAction(action); + auto offscreenUi = DependencyManager::get(); + offscreenUi->addMenuInitializer([=](VrMenu* vrMenu) { + vrMenu->removeAction(action); + }); } QMenuBar::repaint(); @@ -496,15 +500,15 @@ void Menu::setGroupingIsVisible(const QString& grouping, bool isVisible) { void Menu::addActionGroup(const QString& groupName, const QStringList& actionList, const QString& selected, QObject* receiver, const char* slot) { auto menu = addMenu(groupName); - + QActionGroup* actionGroup = new QActionGroup(menu); actionGroup->setExclusive(true); - + for (auto action : actionList) { auto item = addCheckableActionToQMenuAndActionHash(menu, action, 0, action == selected, receiver, slot); actionGroup->addAction(item); } - + QMenuBar::repaint(); } @@ -582,4 +586,3 @@ void MenuWrapper::insertAction(QAction* before, QAction* action) { vrMenu->insertAction(before, action); }); } -