From b117a4b8d7d9a7bc425d30d97c31e93758ad807b Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 10 May 2016 11:12:18 -0700 Subject: [PATCH] Debugging menu destruction --- libraries/script-engine/src/ScriptEngine.cpp | 40 ++++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index ba74219b4e..ea125c9a72 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -177,19 +177,51 @@ void ScriptEngine::disconnectNonEssentialSignals() { } void ScriptEngine::runDebuggable() { + static QMenuBar* menuBar { nullptr }; + static QMenu* scriptDebugMenu { nullptr }; + static size_t scriptMenuCount { 0 }; + if (!scriptDebugMenu) { + for (auto window : qApp->topLevelWidgets()) { + auto mainWindow = qobject_cast(window); + if (mainWindow) { + menuBar = mainWindow->menuBar(); + break; + } + } + if (menuBar) { + scriptDebugMenu = menuBar->addMenu("Script Debug"); + } + } + init(); _isRunning = true; _debuggable = true; _debugger = new QScriptEngineDebugger(this); _debugger->attachTo(this); - static QMenu* scriptDebugMenu = qobject_cast(qApp->activeWindow())->menuBar()->addMenu("Script Debug"); - scriptDebugMenu->addMenu(_fileNameString)->addMenu(_debugger->createStandardMenu(qApp->activeWindow())); - _debugger->action(QScriptEngineDebugger::InterruptAction)->trigger(); + + QMenu* parentMenu = scriptDebugMenu; + QMenu* scriptMenu { nullptr }; + if (parentMenu) { + ++scriptMenuCount; + scriptMenu = parentMenu->addMenu(_fileNameString); + scriptMenu->addMenu(_debugger->createStandardMenu(qApp->activeWindow())); + } else { + qWarning() << "Unable to add script debug menu"; + } + QScriptValue result = evaluate(_scriptContents, _fileNameString); _lastUpdate = usecTimestampNow(); QTimer* timer = new QTimer(this); - connect(this, &ScriptEngine::finished, [this, timer] { + connect(this, &ScriptEngine::finished, [this, timer, parentMenu, scriptMenu] { + if (scriptMenu) { + parentMenu->removeAction(scriptMenu->menuAction()); + --scriptMenuCount; + if (0 == scriptMenuCount) { + menuBar->removeAction(scriptDebugMenu->menuAction()); + scriptDebugMenu = nullptr; + } + } disconnect(timer); });