diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 08341eb530950770b4e840748cebef6c3a7f7fa6..ab2172fba794abca6ab47d6194d224622f2dcb11 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -1096,9 +1096,10 @@ void CdbEngine::assignValueInDebugger(const WatchData *w, const QString &expr, c v.toString(); } // Update view - if (WatchData *fwd = watchHandler()->findItem(w->iname)) { - fwd->setValue(newValueObtained); - watchHandler()->insertData(*fwd); + if (const WatchData *fwd = watchHandler()->findItem(w->iname)) { + WatchData modified = *fwd; + modified.setValue(newValueObtained); + watchHandler()->insertData(modified); watchHandler()->updateWatchers(); } success = true; @@ -1319,6 +1320,7 @@ bool CdbEngine::attemptBreakpointSynchronizationI(QString *errorMessage) } break; case BreakpointRemoveRequested: + handler->notifyBreakpointRemoveProceeding(id); handler->notifyBreakpointRemoveOk(id); break; case BreakpointInserted: diff --git a/src/plugins/debugger/cdb2/cdbengine2.cpp b/src/plugins/debugger/cdb2/cdbengine2.cpp index 25d4d8055a95522d986e064797517c4ce914d0ad..f89383bf366b1646ec70a4929a9f462d4284c8a8 100644 --- a/src/plugins/debugger/cdb2/cdbengine2.cpp +++ b/src/plugins/debugger/cdb2/cdbengine2.cpp @@ -41,12 +41,14 @@ #include "debuggercore.h" #include "registerhandler.h" #include "debuggeragents.h" +#include "debuggertooltip.h" #include "cdbparsehelpers.h" #include "watchutils.h" #include "gdb/gdbmi.h" #include "shared/cdbsymbolpathlisteditor.h" #include <coreplugin/icore.h> +#include <texteditor/itexteditor.h> #include <utils/synchronousprocess.h> #include <utils/winutils.h> @@ -328,9 +330,26 @@ void CdbEngine::syncOperateByInstruction(bool operateByInstruction) void CdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos) { + if (debug) + qDebug() << Q_FUNC_INFO; + // Need a stopped debuggee and a cpp file in a valid frame + if (state() != InferiorStopOk || !isCppEditor(editor) || stackHandler()->currentIndex() < 0) + return; + // Determine expression and function + int line; + int column; + QString function; + const QString exp = cppExpressionAt(editor, cursorPos, &line, &column, &function); + // Are we in the current stack frame + if (function.isEmpty() || exp.isEmpty() || function != stackHandler()->currentFrame().function) + return; + // No numerical or any other expressions [yet] + if (!(exp.at(0).isLetter() || exp.at(0) == QLatin1Char('_'))) + return; + const QByteArray iname = QByteArray("local.") + exp.toAscii(); + const QModelIndex index = watchHandler()->itemIndex(iname); + Q_UNUSED(index) Q_UNUSED(mousePos) - Q_UNUSED(editor) - Q_UNUSED(cursorPos) } void CdbEngine::setupEngine() @@ -1678,6 +1697,7 @@ void CdbEngine::attemptBreakpointSynchronization() } break; case BreakpointRemoveRequested: + handler->notifyBreakpointRemoveProceeding(id); handler->notifyBreakpointRemoveOk(id); break; case BreakpointInserted: diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index bdb6eb2060d893348a9e7e72a07546d97e84d46b..8fb8fd5f6fe94efe23265de1709fa69a93e9f93d 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3268,22 +3268,20 @@ bool GdbEngine::supportsThreads() const bool GdbEngine::showToolTip() { - QByteArray iname = tooltipIName(m_toolTipExpression); + const QByteArray iname = tooltipIName(m_toolTipExpression); if (!debuggerCore()->boolSetting(UseToolTipsInMainEditor)) { watchHandler()->removeData(iname); return true; } - WatchModel *model = watchHandler()->model(TooltipsWatch); - WatchItem *item = model->findItem(iname, model->rootItem()); - if (!item) { + const QModelIndex index = watchHandler()->itemIndex(iname); + if (!index.isValid()) { watchHandler()->removeData(iname); hideDebuggerToolTip(); return false; } - QModelIndex index = model->watchIndex(item); - showDebuggerToolTip(m_toolTipPos, model, index, m_toolTipExpression); + showDebuggerToolTip(m_toolTipPos, watchHandler()->model(TooltipsWatch), index, m_toolTipExpression); return true; } diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 484b3a2a9032fc60b819d664d9554e908f5e85fe..4c8f3eaf134cd80d8ed39a2fb123b4a2eb7cf8e8 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1590,13 +1590,29 @@ WatchModel *WatchHandler::modelForIName(const QByteArray &iname) const return 0; } -WatchData *WatchHandler::findItem(const QByteArray &iname) const +const WatchData *WatchHandler::watchData(WatchType type, const QModelIndex &index) const +{ + if (index.isValid()) + if (const WatchModel *m = model(type)) + return m->watchItem(index); + return 0; +} + +const WatchData *WatchHandler::findItem(const QByteArray &iname) const { const WatchModel *model = modelForIName(iname); QTC_ASSERT(model, return 0); return model->findItem(iname, model->m_root); } +QModelIndex WatchHandler::itemIndex(const QByteArray &iname) const +{ + if (const WatchModel *model = modelForIName(iname)) + if (WatchItem *item = model->findItem(iname, model->m_root)) + return model->watchIndex(item); + return QModelIndex(); +} + void WatchHandler::setFormat(const QByteArray &type, int format) { if (format == -1) diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h index 3bffa6470dcadff3b3f1ba98bece1d47167e0fc7..2b5f8bcc76b98f42bf6cd68a322ac190cae44cf5 100644 --- a/src/plugins/debugger/watchhandler.h +++ b/src/plugins/debugger/watchhandler.h @@ -87,7 +87,6 @@ private: void fetchMore(const QModelIndex &parent); friend class WatchHandler; - friend class GdbEngine; WatchItem *watchItem(const QModelIndex &) const; QModelIndex watchIndex(const WatchItem *needle) const; @@ -151,7 +150,10 @@ public: void insertData(const WatchData &data); void insertBulkData(const QList<WatchData> &data); void removeData(const QByteArray &iname); - WatchData *findItem(const QByteArray &iname) const; + + const WatchData *watchData(WatchType type, const QModelIndex &) const; + const WatchData *findItem(const QByteArray &iname) const; + QModelIndex itemIndex(const QByteArray &iname) const; static void loadSessionData(); static void saveSessionData();