diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp index e2a3e2c3d33b003ac32c4c6963f82642d1958d39..f3f43cfa68d283d7cf42f4af6d00dd57e122f095 100644 --- a/src/plugins/debugger/qml/qmlcppengine.cpp +++ b/src/plugins/debugger/qml/qmlcppengine.cpp @@ -39,6 +39,11 @@ #include <utils/qtcassert.h> +#include <coreplugin/icore.h> +#include <QtGui/QMainWindow> +#include <QtGui/QMessageBox> +#include <QtCore/QTimer> + namespace Debugger { namespace Internal { @@ -89,13 +94,15 @@ private: DebuggerEngine *m_cppEngine; DebuggerEngine *m_activeEngine; int m_stackBoundary; + + QMessageBox *m_msg; }; QmlCppEnginePrivate::QmlCppEnginePrivate(QmlCppEngine *parent, const DebuggerStartParameters &sp) : q(parent), m_qmlEngine(createQmlEngine(sp, q)), - m_cppEngine(0), m_activeEngine(0) + m_cppEngine(0), m_activeEngine(0), m_msg(0) { setObjectName(QLatin1String("QmlCppEnginePrivate")); } @@ -588,6 +595,9 @@ void QmlCppEngine::slaveEngineStateChanged } else if (state() == InferiorStopRequested) { EDEBUG("... AN INFERIOR STOPPED EXPECTEDLY"); notifyInferiorStopOk(); + } else if (otherEngine->state() == EngineRunRequested && otherEngine == d->m_qmlEngine) { + EDEBUG("... BREAKPOINT HIT IN C++ BEFORE QML STARTUP"); + QTimer::singleShot(0, this, SLOT(skipCppBreakpoint())); } else if (state() == EngineRunRequested) { EDEBUG("... AN INFERIOR FAILED STARTUP, OTHER STOPPED EXPECTEDLY"); // wait for failure notification from other engine @@ -676,6 +686,31 @@ void QmlCppEngine::showMessage(const QString &msg, int channel, int timeout) con DebuggerEngine::showMessage(msg, channel, timeout); } +void QmlCppEngine::skipCppBreakpoint() +{ + // only used to skip breakpoint in CPP when QML not ready yet + QTC_ASSERT(d->m_cppEngine->state() == InferiorStopOk, return); + QTC_ASSERT(d->m_qmlEngine->state() == EngineRunRequested, return); + + if (!d->m_msg) { + Core::ICore * const core = Core::ICore::instance(); + d->m_msg = new QMessageBox(core->mainWindow()); + } + + if (d->m_msg->isHidden()) { + d->m_msg->setIcon(QMessageBox::Warning); + d->m_msg->setWindowTitle(tr("QML/C++ Debugging")); + d->m_msg->setText(tr("Cannot stop execution before QML engine is started. Skipping breakpoint.\nSuggestions: Move the breakpoint after QmlViewer initialization or switch to C++ only debugging")); + d->m_msg->setStandardButtons(QMessageBox::Ok); + d->m_msg->setDefaultButton(QMessageBox::Ok); + d->m_msg->setModal(false); + d->m_msg->show(); + } + + d->m_cppEngine->continueInferior(); + resetLocation(); +} + DebuggerEngine *QmlCppEngine::cppEngine() const { return d->m_cppEngine; diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h index 2f7202b3980afdb842c83067ccce7f46f50597b6..322e4a9d4473c1044bbf38ea9ab6e00e026adf22 100644 --- a/src/plugins/debugger/qml/qmlcppengine.h +++ b/src/plugins/debugger/qml/qmlcppengine.h @@ -125,6 +125,9 @@ protected: void notifyEngineRunAndInferiorRunOk(); void notifyInferiorShutdownOk(); +protected slots: + void skipCppBreakpoint(); + private: void engineStateChanged(DebuggerState newState); void setState(DebuggerState newState, bool forced = false);