Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 1 file). Show all
Unified · Split
| @@ -177,19 +177,51 @@ void ScriptEngine::disconnectNonEssentialSignals() { · 176 unmodified lines | ||
| 177 | 177 | } |
| 178 | 178 | |
| 179 | 179 | void ScriptEngine::runDebuggable() { |
| 180 | + static QMenuBar* menuBar { nullptr }; | |
| 181 | + static QMenu* scriptDebugMenu { nullptr }; | |
| 182 | + static size_t scriptMenuCount { 0 }; | |
| 183 | + if (!scriptDebugMenu) { | |
| 184 | + for (auto window : qApp->topLevelWidgets()) { | |
| 185 | + auto mainWindow = qobject_cast<QMainWindow*>(window); | |
| 186 | + if (mainWindow) { | |
| 187 | + menuBar = mainWindow->menuBar(); | |
| 188 | + break; | |
| 189 | + } | |
| 190 | + } | |
| 191 | + if (menuBar) { | |
| 192 | + scriptDebugMenu = menuBar->addMenu("Script Debug"); | |
| 193 | + } | |
| 194 | + } | |
| 195 | + | |
| 180 | 196 | init(); |
| 181 | 197 | _isRunning = true; |
| 182 | 198 | _debuggable = true; |
| 183 | 199 | _debugger = new QScriptEngineDebugger(this); |
| 184 | 200 | _debugger->attachTo(this); |
| 185 | − static QMenu* scriptDebugMenu = qobject_cast<QMainWindow*>(qApp->activeWindow())->menuBar()->addMenu("Script Debug"); | |
| 186 | − scriptDebugMenu->addMenu(_fileNameString)->addMenu(_debugger->createStandardMenu(qApp->activeWindow())); | |
| 187 | − _debugger->action(QScriptEngineDebugger::InterruptAction)->trigger(); | |
| 201 | + | |
| 202 | + QMenu* parentMenu = scriptDebugMenu; | |
| 203 | + QMenu* scriptMenu { nullptr }; | |
| 204 | + if (parentMenu) { | |
| 205 | + ++scriptMenuCount; | |
| 206 | + scriptMenu = parentMenu->addMenu(_fileNameString); | |
| 207 | + scriptMenu->addMenu(_debugger->createStandardMenu(qApp->activeWindow())); | |
| 208 | + } else { | |
| 209 | + qWarning() << "Unable to add script debug menu"; | |
| 210 | + } | |
| 211 | + | |
| 188 | 212 | QScriptValue result = evaluate(_scriptContents, _fileNameString); |
| 189 | 213 | |
| 190 | 214 | _lastUpdate = usecTimestampNow(); |
| 191 | 215 | QTimer* timer = new QTimer(this); |
| 192 | − connect(this, &ScriptEngine::finished, [this, timer] { | |
| 216 | + connect(this, &ScriptEngine::finished, [this, timer, parentMenu, scriptMenu] { | |
| 217 | + if (scriptMenu) { | |
| 218 | + parentMenu->removeAction(scriptMenu->menuAction()); | |
| 219 | + --scriptMenuCount; | |
| 220 | + if (0 == scriptMenuCount) { | |
| 221 | + menuBar->removeAction(scriptDebugMenu->menuAction()); | |
| 222 | + scriptDebugMenu = nullptr; | |
| 223 | + } | |
| 224 | + } | |
| 193 | 225 | disconnect(timer); |
| 194 | 226 | }); |
| 195 | 227 | |