possible fix to windows assert

This commit is contained in:
ZappoMan 2014-02-25 20:23:38 -08:00
parent d4c36acd7d
commit 42ddc82ac4
7 changed files with 74 additions and 37 deletions

View file

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

View file

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

View file

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

View file

@ -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,

View file

@ -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()) {

View file

@ -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;

View file

@ -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__) */