From 42ddc82ac460e7ce0067ffd17ffe7e89b8c0ddd2 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Feb 2014 20:23:38 -0800 Subject: [PATCH] possible fix to windows assert --- interface/src/Application.cpp | 14 +++++++-- interface/src/Application.h | 1 + interface/src/Menu.cpp | 32 ++++++++++++++++++-- interface/src/Menu.h | 30 ++++++++++++------ libraries/script-engine/src/ScriptEngine.cpp | 18 +++-------- libraries/script-engine/src/ScriptEngine.h | 8 ++--- libraries/shared/src/AbstractMenuInterface.h | 8 ++--- 7 files changed, 74 insertions(+), 37 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index efbbd04fc7..28c2c4f57e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4240,6 +4240,11 @@ void Application::removeScriptName(const QString& fileNameString) { _activeScripts.removeOne(fileNameString); } +void Application::cleanupScriptMenuItem(const QString& scriptMenuName) { + Menu::getInstance()->removeAction(Menu::getInstance()->getActiveScriptsMenu(), scriptMenuName); +} + + void Application::loadScript(const QString& fileNameString) { _activeScripts.append(fileNameString); QByteArray fileNameAscii = fileNameString.toLocal8Bit(); @@ -4268,9 +4273,11 @@ void Application::loadScript(const QString& fileNameString) { // start the script on a new thread... bool wantMenuItems = true; // tells the ScriptEngine object to add menu items for itself - ScriptEngine* scriptEngine = new ScriptEngine(script, wantMenuItems, fileName, Menu::getInstance(), - &_controllerScriptingInterface); - scriptEngine->setupMenuItems(); + ScriptEngine* scriptEngine = new ScriptEngine(script, wantMenuItems, fileName, &_controllerScriptingInterface); + + // add a stop menu itm + Menu::getInstance()->addActionToQMenuAndActionHash(Menu::getInstance()->getActiveScriptsMenu(), + scriptEngine->getScriptMenuName(), 0, scriptEngine, SLOT(stop())); // setup the packet senders and jurisdiction listeners of the script engine's scripting interfaces so // we can use the same ones from the application. @@ -4302,6 +4309,7 @@ void Application::loadScript(const QString& fileNameString) { connect(scriptEngine, SIGNAL(finished(const QString&)), scriptEngine, SLOT(deleteLater())); connect(workerThread, SIGNAL(finished()), workerThread, SLOT(deleteLater())); connect(scriptEngine, SIGNAL(finished(const QString&)), this, SLOT(removeScriptName(const QString&))); + connect(scriptEngine, SIGNAL(cleanupMenuItem(const QString&)), this, SLOT(cleanupScriptMenuItem(const QString&))); // when the application is about to quit, stop our script engine so it unwinds properly connect(this, SIGNAL(aboutToQuit()), scriptEngine, SLOT(stop())); diff --git a/interface/src/Application.h b/interface/src/Application.h index 97233a092d..869c7edc39 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -291,6 +291,7 @@ private slots: void parseVersionXml(); void removeScriptName(const QString& fileNameString); + void cleanupScriptMenuItem(const QString& scriptMenuName); private: void resetCamerasOnResizeGL(Camera& camera, int width, int height); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 563d722152..6149cbb12a 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -679,7 +679,7 @@ void Menu::addDisabledActionAndSeparator(QMenu* destinationMenu, const QString& } QAction* Menu::addActionToQMenuAndActionHash(QMenu* destinationMenu, - const QString actionName, + const QString& actionName, const QKeySequence& shortcut, const QObject* receiver, const char* member, @@ -716,7 +716,7 @@ QAction* Menu::addActionToQMenuAndActionHash(QMenu* destinationMenu, } QAction* Menu::addCheckableActionToQMenuAndActionHash(QMenu* destinationMenu, - const QString actionName, + const QString& actionName, const QKeySequence& shortcut, const bool checked, const QObject* receiver, @@ -1509,3 +1509,31 @@ void Menu::removeMenuItem(const QString& menu, const QString& menuitem) { QMenuBar::repaint(); }; + +/** + +void Menu::invokeAddActionToQMenuAndActionHash(QMenu* destinationMenu, const QString actionName, + const QKeySequence& shortcut, const QObject* receiver, const char* member) { + + qDebug() << "about to call QMetaObject::invokeMethod(this, \"addActionToQMenuAndActionHash\"...)"; + + QMetaObject::invokeMethod(this, "addActionToQMenuAndActionHash", + Q_ARG(QMenu*, destinationMenu), + Q_ARG(const QString&, actionName), + Q_ARG(const QKeySequence&, shortcut), + Q_ARG(const QObject*, receiver), + Q_ARG(const char*, member) + ); +} + +void Menu::invokeRemoveAction(QMenu* menu, const QString& actionName) { + + qDebug() << "about to call QMetaObject::invokeMethod(this, \"removeAction\"...)"; + + QMetaObject::invokeMethod(this, "removeAction", + Q_ARG(QMenu*, menu), + Q_ARG(const QString&, actionName) + ); +} + +**/ diff --git a/interface/src/Menu.h b/interface/src/Menu.h index ffb2fdaf42..0fd89476f9 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -57,7 +57,7 @@ class MetavoxelEditor; class VoxelStatsDialog; class MenuItemProperties; -class Menu : public QMenuBar, public AbstractMenuInterface { +class Menu : public QMenuBar /*, public AbstractMenuInterface*/ { Q_OBJECT public: static Menu* getInstance(); @@ -92,20 +92,32 @@ public: // User Tweakable PPS from Voxel Server int getMaxVoxelPacketsPerSecond() const { return _maxVoxelPacketsPerSecond; } - virtual QMenu* getActiveScriptsMenu() { return _activeScriptsMenu;} - virtual QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, + bool goToDestination(QString destination); + void goToOrientation(QString orientation); + void goToDomain(const QString newDomain); + + QMenu* getActiveScriptsMenu() { return _activeScriptsMenu;} + + /** + virtual void invokeAddActionToQMenuAndActionHash(QMenu* destinationMenu, const QString actionName, const QKeySequence& shortcut = 0, const QObject* receiver = NULL, + const char* member = NULL); + virtual void invokeRemoveAction(QMenu* menu, const QString& actionName); + **/ + +public slots: + QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, + const QString& actionName, + const QKeySequence& shortcut = 0, + const QObject* receiver = NULL, const char* member = NULL, QAction::MenuRole role = QAction::NoRole, int menuItemLocation = UNSPECIFIED_POSITION); - virtual void removeAction(QMenu* menu, const QString& actionName); - bool goToDestination(QString destination); - void goToOrientation(QString orientation); - void goToDomain(const QString newDomain); -public slots: + void removeAction(QMenu* menu, const QString& actionName); + void loginForCurrentDomain(); void bandwidthDetails(); void voxelStatsDetails(); @@ -156,7 +168,7 @@ private: void addDisabledActionAndSeparator(QMenu* destinationMenu, const QString& actionName); QAction* addCheckableActionToQMenuAndActionHash(QMenu* destinationMenu, - const QString actionName, + const QString& actionName, const QKeySequence& shortcut = 0, const bool checked = false, const QObject* receiver = NULL, diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index d4cb4cce13..e08317f8b4 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -42,7 +42,6 @@ static QScriptValue soundConstructor(QScriptContext* context, QScriptEngine* eng ScriptEngine::ScriptEngine(const QString& scriptContents, bool wantMenuItems, const QString& fileNameString, - AbstractMenuInterface* menu, AbstractControllerScriptingInterface* controllerScriptingInterface) : _isAvatar(false), _avatarIdentityTimer(NULL), @@ -69,7 +68,6 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, bool wantMenuItems, co _scriptMenuName.append(_scriptNumber); } _scriptNumber++; - _menu = menu; _controllerScriptingInterface = controllerScriptingInterface; } @@ -105,16 +103,9 @@ void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectNa registerGlobalObject(objectName, _avatarData); } - -void ScriptEngine::setupMenuItems() { - if (_menu && _wantMenuItems) { - _menu->addActionToQMenuAndActionHash(_menu->getActiveScriptsMenu(), _scriptMenuName, 0, this, SLOT(stop())); - } -} - -void ScriptEngine::cleanMenuItems() { - if (_menu && _wantMenuItems) { - _menu->removeAction(_menu->getActiveScriptsMenu(), _scriptMenuName); +void ScriptEngine::cleanupMenuItems() { + if (_wantMenuItems) { + emit cleanupMenuItem(_scriptMenuName); } } @@ -172,7 +163,6 @@ void ScriptEngine::init() { _voxelsScriptingInterface.getVoxelPacketSender()->setProcessCallIntervalHint(VISUAL_DATA_CALLBACK_USECS); _particlesScriptingInterface.getParticlePacketSender()->setProcessCallIntervalHint(VISUAL_DATA_CALLBACK_USECS); - //qDebug() << "Script:\n" << _scriptContents << "\n"; } void ScriptEngine::registerGlobalObject(const QString& name, QObject* object) { @@ -301,7 +291,7 @@ void ScriptEngine::run() { } } - cleanMenuItems(); + cleanupMenuItems(); // If we were on a thread, then wait till it's done if (thread()) { diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 72ac848bff..0ce5437d90 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -33,7 +33,7 @@ class ScriptEngine : public QObject { Q_OBJECT public: ScriptEngine(const QString& scriptContents = NO_SCRIPT, bool wantMenuItems = false, - const QString& scriptMenuName = QString(""), AbstractMenuInterface* menu = NULL, + const QString& scriptMenuName = QString(""), AbstractControllerScriptingInterface* controllerScriptingInterface = NULL); ~ScriptEngine(); @@ -47,8 +47,8 @@ public: /// sets the script contents, will return false if failed, will fail if script is already running bool setScriptContents(const QString& scriptContents); - void setupMenuItems(); - void cleanMenuItems(); + const QString& getScriptMenuName() const { return _scriptMenuName; } + void cleanupMenuItems(); void registerGlobalObject(const QString& name, QObject* object); /// registers a global object by name @@ -76,6 +76,7 @@ signals: void willSendVisualDataCallback(); void scriptEnding(); void finished(const QString& fileNameString); + void cleanupMenuItem(const QString& menuItemString); protected: QString _scriptContents; @@ -103,7 +104,6 @@ private: bool _wantMenuItems; QString _scriptMenuName; QString _fileNameString; - AbstractMenuInterface* _menu; static int _scriptNumber; Quat _quatLibrary; Vec3 _vec3Library; diff --git a/libraries/shared/src/AbstractMenuInterface.h b/libraries/shared/src/AbstractMenuInterface.h index b64422a4eb..7d9e83827c 100644 --- a/libraries/shared/src/AbstractMenuInterface.h +++ b/libraries/shared/src/AbstractMenuInterface.h @@ -20,14 +20,12 @@ class QKeySequence; class AbstractMenuInterface { public: virtual QMenu* getActiveScriptsMenu() = 0; - virtual QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, + virtual void invokeAddActionToQMenuAndActionHash(QMenu* destinationMenu, const QString actionName, const QKeySequence& shortcut = 0, const QObject* receiver = NULL, - const char* member = NULL, - QAction::MenuRole role = QAction::NoRole, - int menuItemLocation = -1) = 0; - virtual void removeAction(QMenu* menu, const QString& actionName) = 0; + const char* member = NULL) = 0; + virtual void invokeRemoveAction(QMenu* menu, const QString& actionName) = 0; }; #endif /* defined(__hifi__AbstractMenuInterface__) */