return 0;
}
+bool DebuggerEngine::canWatchWidgets() const
+{
+ return false;
+}
+
+bool DebuggerEngine::acceptsWatchesWhileRunning() const
+{
+ return false;
+}
+
bool DebuggerEngine::isSynchronous() const
{
return false;
virtual void setRegisterValue(int regnr, const QString &value);
virtual void addOptionPages(QList<Core::IOptionsPage*> *) const;
virtual unsigned debuggerCapabilities() const;
+ virtual bool canWatchWidgets() const;
+ virtual bool acceptsWatchesWhileRunning() const;
virtual bool isSynchronous() const;
virtual QByteArray qtNamespace() const;
void runEngine() {}
void shutdownEngine() {}
void shutdownInferior() {}
- unsigned debuggerCapabilities() const { return 0; }
+ unsigned debuggerCapabilities() const { return AddWatcherCapability; }
bool acceptsBreakpoint(BreakpointId) const { return false; }
bool acceptsDebuggerCommands() const { return false; }
};
return caps | SnapshotCapability;
}
+bool GdbEngine::canWatchWidgets() const
+{
+ return true;
+}
+
void GdbEngine::continueInferiorInternal()
{
QTC_ASSERT(state() == InferiorStopOk, qDebug() << state());
virtual void runEngine();
virtual unsigned debuggerCapabilities() const;
+ virtual bool canWatchWidgets() const;
virtual void detachDebugger();
virtual void shutdownEngine();
virtual void shutdownInferior();
return d->m_cppEngine->debuggerCapabilities();
}
+bool QmlCppEngine::canWatchWidgets() const
+{
+ return d->m_activeEngine->canWatchWidgets();
+}
+
+bool QmlCppEngine::acceptsWatchesWhileRunning() const
+{
+ return d->m_activeEngine->acceptsWatchesWhileRunning();
+}
+
bool QmlCppEngine::isSynchronous() const
{
return d->m_activeEngine->isSynchronous();
void setRegisterValue(int regnr, const QString &value);
unsigned debuggerCapabilities() const;
+ virtual bool canWatchWidgets() const;
+ virtual bool acceptsWatchesWhileRunning() const;
bool isSynchronous() const;
QByteArray qtNamespace() const;
DebuggerEngine::showMessage(msg, channel, timeout);
}
+bool QmlEngine::acceptsWatchesWhileRunning() const
+{
+ return true;
+}
+
void QmlEngine::closeConnection()
{
disconnect(&d->m_adapter, SIGNAL(connectionStartupFailed()),
void showMessage(const QString &msg, int channel = LogDebug,
int timeout = -1) const;
void filterApplicationMessage(const QString &msg, int channel);
+ virtual bool acceptsWatchesWhileRunning() const;
public slots:
void messageReceived(const QByteArray &message);
// Disable editing if debuggee is positively running.
const bool isRunning = engine() && engine()->state() == InferiorRunOk;
- if (isRunning)
+ if (isRunning && engine() && !engine()->acceptsWatchesWhileRunning())
return notEditable;
const WatchData &data = *watchItem(idx);
if (data.isSomethingNeeded() && data.iname.contains('.')) {
MODEL_DEBUG("SOMETHING NEEDED: " << data.toString());
if (!m_engine->isSynchronous()) {
+ WatchModel *model = modelForIName(data.iname);
+ QTC_ASSERT(model, return);
+ model->insertData(data);
+
m_engine->updateWatchData(data);
} else {
m_engine->showMessage(QLatin1String("ENDLESS LOOP: SOMETHING NEEDED: ")
#include <QtGui/QMenu>
#include <QtGui/QPainter>
#include <QtGui/QResizeEvent>
+#include <QtGui/QInputDialog>
/////////////////////////////////////////////////////////////////////
//
const bool actionsEnabled = engine->debuggerActionsEnabled();
const unsigned engineCapabilities = engine->debuggerCapabilities();
- const bool canHandleWatches =
- actionsEnabled && (engineCapabilities & AddWatcherCapability);
+ const bool canHandleWatches = engineCapabilities & AddWatcherCapability;
const DebuggerState state = engine->state();
+ const bool canInsertWatches = (state==InferiorStopOk) || ((state==InferiorRunOk) && engine->acceptsWatchesWhileRunning());
QMenu menu;
QAction *actInsertNewWatchItem = menu.addAction(tr("Insert New Watch Item"));
- actInsertNewWatchItem->setEnabled(canHandleWatches);
+ actInsertNewWatchItem->setEnabled(canHandleWatches && canInsertWatches);
QAction *actSelectWidgetToWatch = menu.addAction(tr("Select Widget to Watch"));
- actSelectWidgetToWatch->setEnabled(canHandleWatches);
+ actSelectWidgetToWatch->setEnabled(canHandleWatches && (engine->canWatchWidgets()));
// Offer to open address pointed to or variable address.
const bool createPointerActions = pointerValue && pointerValue != address;
if (act == actAdjustColumnWidths) {
resizeColumnsToContents();
} else if (act == actInsertNewWatchItem) {
- watchExpression(QString());
+ bool ok;
+ QString newExp = QInputDialog::getText(this, tr("Enter watch expression"),
+ tr("Expression:"), QLineEdit::Normal,
+ QString(), &ok);
+ if (ok && !newExp.isEmpty()) {
+ watchExpression(newExp);
+ }
} else if (act == actOpenMemoryEditAtVariableAddress) {
currentEngine()->openMemoryView(address);
} else if (act == actOpenMemoryEditAtPointerValue) {