diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 8df0b90f3c4f5d1653f5b5c3dcf9a774c1097177..1bcfafcbdd84ace682b5c6f0aa4d029cda9bbd73 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -28,6 +28,7 @@ **************************************************************************/ #include "breakhandler.h" +#include "breakpointmarker.h" #include "debuggeractions.h" #include "debuggerengine.h" @@ -52,6 +53,8 @@ static DebuggerPlugin *plugin() { return DebuggerPlugin::instance(); } static Breakpoints m_bp; +// FIXME this is only static because it might map to bps in the above list +static QHash<quint64,BreakpointMarker*> m_markers; ////////////////////////////////////////////////////////////////// // @@ -108,6 +111,7 @@ void BreakHandler::removeAt(int index) BreakpointData *data = at(index); QTC_ASSERT(data, return); m_bp.removeAt(index); + delete m_markers.take(data->id); delete data; } @@ -242,10 +246,33 @@ void BreakHandler::loadBreakpoints() void BreakHandler::updateMarkers() { for (int index = 0; index != size(); ++index) - at(index)->updateMarker(); + updateMarker(at(index)); emit layoutChanged(); } +void BreakHandler::updateMarker(BreakpointData * bp) +{ + BreakpointMarker *marker = m_markers.value(bp->id); + + if (marker && (bp->m_markerFileName != marker->fileName() + || bp->m_markerLineNumber != marker->lineNumber())) { + removeMarker(bp); + marker = 0; + } + + if (!marker && !bp->m_markerFileName.isEmpty() && bp->m_markerLineNumber > 0) { + marker = new BreakpointMarker(this, bp, bp->m_markerFileName, bp->m_markerLineNumber); + m_markers.insert(bp->id, marker); + } + + if (marker) + marker->setPending(bp->pending); +} +void BreakHandler::removeMarker(BreakpointData * bp) +{ + delete m_markers.take(bp->id); +} + QVariant BreakHandler::headerData(int section, Qt::Orientation orientation, int role) const { @@ -517,12 +544,14 @@ void BreakHandler::reinsertBreakpoint(BreakpointData *data) void BreakHandler::append(BreakpointData *data) { - data->m_handler = this; m_bp.append(data); } Breakpoints BreakHandler::takeRemovedBreakpoints() { + foreach(BreakpointData *bp, m_removed) { + removeMarker(bp); + } Breakpoints result = m_removed; m_removed.clear(); return result; @@ -547,7 +576,7 @@ void BreakHandler::removeBreakpointHelper(int index) BreakpointData *data = at(index); QTC_ASSERT(data, return); m_bp.removeAt(index); - data->removeMarker(); + removeMarker(data); m_removed.append(data); } @@ -576,8 +605,8 @@ void BreakHandler::toggleBreakpointEnabled(BreakpointData *data) m_enabled.removeAll(data); m_disabled.append(data); } - data->removeMarker(); // Force icon update. - data->updateMarker(); + removeMarker(data); // Force icon update. + updateMarker(data); emit layoutChanged(); m_engine->attemptBreakpointSynchronization(); } @@ -661,6 +690,9 @@ void BreakHandler::saveSessionData() void BreakHandler::loadSessionData() { QTC_ASSERT(m_engine->isSessionEngine(), return); + foreach(BreakpointData *bp, m_bp) { + delete m_markers.take(bp->id); + } qDeleteAll(m_bp); m_bp.clear(); loadBreakpoints(); @@ -696,7 +728,9 @@ void BreakHandler::initializeFromTemplate(BreakHandler *other) m_inserted.clear(); foreach(BreakpointData *data, m_bp) { if (m_engine->acceptsBreakpoint(data)) { - data->m_handler = this; + BreakpointMarker *marker = m_markers.value(data->id); + if (marker) + marker->m_handler = this; m_inserted.append(data); } } @@ -705,7 +739,9 @@ void BreakHandler::initializeFromTemplate(BreakHandler *other) void BreakHandler::storeToTemplate(BreakHandler *other) { foreach (BreakpointData *data, m_bp) { - data->m_handler = other; + BreakpointMarker *marker = m_markers.value(data->id); + if (marker) + marker->m_handler = other; data->clear(); } other->saveSessionData(); diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 39de2c9044f36a87e1b8064aaeb60d8d6ad78d15..ca7a8d649c2ac618ecd26ebe3b1774125c2eedae 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -75,6 +75,8 @@ public: int findWatchPointIndexByAddress(quint64 address) const; bool watchPointAt(quint64 address) const; void updateMarkers(); + void updateMarker(BreakpointData *); + void removeMarker(BreakpointData *); bool isActive() const; Breakpoints takeRemovedBreakpoints(); // Owned. diff --git a/src/plugins/debugger/breakpoint.cpp b/src/plugins/debugger/breakpoint.cpp index 1235e8ce14d899e1ffef9da94755edbf70828641..63581a1000c956c6fc98590db3723a8698f760f3 100644 --- a/src/plugins/debugger/breakpoint.cpp +++ b/src/plugins/debugger/breakpoint.cpp @@ -27,13 +27,9 @@ ** **************************************************************************/ +#include "breakpoint.h" #include "breakhandler.h" -#include "debuggeractions.h" -#include "debuggerengine.h" -#include "debuggerstringutils.h" -#include "threadshandler.h" -#include "stackhandler.h" #include "stackframe.h" #include <texteditor/basetextmark.h> @@ -45,111 +41,9 @@ #include <QtCore/QFileInfo> #include <QtCore/QDir> -////////////////////////////////////////////////////////////////// -// -// BreakpointMarker -// -////////////////////////////////////////////////////////////////// - -// Compare file names case insensitively on Windows. -static inline bool fileNameMatch(const QString &f1, const QString &f2) -{ -#ifdef Q_OS_WIN - return f1.compare(f2, Qt::CaseInsensitive) == 0; -#else - return f1 == f2; -#endif -} - namespace Debugger { namespace Internal { -// The red blob on the left side in the cpp editor. -class BreakpointMarker : public TextEditor::BaseTextMark -{ - Q_OBJECT -public: - BreakpointMarker(BreakpointData *data, const QString &fileName, int lineNumber) - : BaseTextMark(fileName, lineNumber) - { - m_data = data; - m_pending = true; - //qDebug() << "CREATE MARKER " << fileName << lineNumber; - } - - ~BreakpointMarker() - { - //qDebug() << "REMOVE MARKER "; - m_data = 0; - } - - QIcon icon() const - { - const BreakHandler *handler = m_data->handler(); - if (!m_data->enabled) - return handler->disabledBreakpointIcon(); - if (!handler->isActive()) - return handler->emptyIcon(); - return m_pending ? handler->pendingBreakPointIcon() : handler->breakpointIcon(); - } - - void setPending(bool pending) - { - if (pending == m_pending) - return; - m_pending = pending; - updateMarker(); - } - - void updateBlock(const QTextBlock &) - { - //qDebug() << "BREAKPOINT MARKER UPDATE BLOCK"; - } - - void removedFromEditor() - { - if (!m_data) - return; - - BreakHandler *handler = m_data->handler(); - handler->removeBreakpoint(m_data); - //handler->saveBreakpoints(); - handler->updateMarkers(); - } - - void updateLineNumber(int lineNumber) - { - if (!m_data) - return; - //if (m_data->markerLineNumber == lineNumber) - // return; - if (m_data->markerLineNumber() != lineNumber) { - m_data->setMarkerLineNumber(lineNumber); - // FIXME: Should we tell gdb about the change? - // Ignore it for now, as we would require re-compilation - // and debugger re-start anyway. - if (0 && m_data->bpLineNumber) { - if (!m_data->bpNumber.trimmed().isEmpty()) { - m_data->pending = true; - } - } - } - // Ignore updates to the "real" line number while the debugger is - // running, as this can be triggered by moving the breakpoint to - // the next line that generated code. - // FIXME: Do we need yet another data member? - if (m_data->bpNumber.trimmed().isEmpty()) { - m_data->lineNumber = lineNumber; - m_data->handler()->updateMarkers(); - } - } - -private: - BreakpointData *m_data; - bool m_pending; -}; - - ////////////////////////////////////////////////////////////////// // // BreakpointData @@ -159,22 +53,30 @@ private: const char *BreakpointData::throwFunction = "throw"; const char *BreakpointData::catchFunction = "catch"; +static quint64 nextBPId() { + /* ok to be not thread-safe + the order does not matter and only the gui + produces authoritative ids. well, for now... + */ + static quint64 i=1; + return ++i; +} + BreakpointData::BreakpointData() : - m_handler(0), enabled(true), + id(nextBPId()), enabled(true), pending(true), type(BreakpointType), ignoreCount(0), lineNumber(0), address(0), useFullPath(false), bpIgnoreCount(0), bpLineNumber(0), bpCorrectedLineNumber(0), bpAddress(0), bpMultiple(false), bpEnabled(true), - m_markerLineNumber(0), marker(0) + m_markerLineNumber(0) { } BreakpointData *BreakpointData::clone() const { BreakpointData *data = new BreakpointData(); - data->m_handler = m_handler; data->enabled = enabled; data->type = type; data->fileName = fileName; @@ -199,7 +101,6 @@ BreakpointData *BreakpointData::clone() const BreakpointData::~BreakpointData() { - removeMarker(); } void BreakpointData::clear() @@ -220,27 +121,6 @@ void BreakpointData::clear() bpState.clear(); m_markerFileName = fileName; m_markerLineNumber = lineNumber; - updateMarker(); -} - -void BreakpointData::removeMarker() -{ - BreakpointMarker *m = marker; - marker = 0; - delete m; -} - -void BreakpointData::updateMarker() -{ - if (marker && (m_markerFileName != marker->fileName() - || m_markerLineNumber != marker->lineNumber())) - removeMarker(); - - if (!marker && !m_markerFileName.isEmpty() && m_markerLineNumber > 0) - marker = new BreakpointMarker(this, m_markerFileName, m_markerLineNumber); - - if (marker) - marker->setPending(pending); } void BreakpointData::setMarkerFileName(const QString &fileName) @@ -268,44 +148,44 @@ QString BreakpointData::toToolTip() const QString rc; QTextStream str(&rc); str << "<html><body><table>" - << "<tr><td>" << BreakHandler::tr("Marker File:") + << "<tr><td>" << tr("Marker File:") << "</td><td>" << QDir::toNativeSeparators(m_markerFileName) << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Marker Line:") + << "<tr><td>" << tr("Marker Line:") << "</td><td>" << m_markerLineNumber << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Breakpoint Number:") + << "<tr><td>" << tr("Breakpoint Number:") << "</td><td>" << bpNumber << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Breakpoint Type:") + << "<tr><td>" << tr("Breakpoint Type:") << "</td><td>" - << (type == BreakpointType ? BreakHandler::tr("Breakpoint") - : type == WatchpointType ? BreakHandler::tr("Watchpoint") - : BreakHandler::tr("Unknown breakpoint type")) + << (type == BreakpointType ? tr("Breakpoint") + : type == WatchpointType ? tr("Watchpoint") + : tr("Unknown breakpoint type")) << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("State:") + << "<tr><td>" << tr("State:") << "</td><td>" << bpState << "</td></tr>" << "</table><br><hr><table>" - << "<tr><th>" << BreakHandler::tr("Property") - << "</th><th>" << BreakHandler::tr("Requested") - << "</th><th>" << BreakHandler::tr("Obtained") << "</th></tr>" - << "<tr><td>" << BreakHandler::tr("Internal Number:") + << "<tr><th>" << tr("Property") + << "</th><th>" << tr("Requested") + << "</th><th>" << tr("Obtained") << "</th></tr>" + << "<tr><td>" << tr("Internal Number:") << "</td><td>—</td><td>" << bpNumber << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("File Name:") + << "<tr><td>" << tr("File Name:") << "</td><td>" << QDir::toNativeSeparators(fileName) << "</td><td>" << QDir::toNativeSeparators(bpFileName) << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Function Name:") + << "<tr><td>" << tr("Function Name:") << "</td><td>" << funcName << "</td><td>" << bpFuncName << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Line Number:") << "</td><td>"; + << "<tr><td>" << tr("Line Number:") << "</td><td>"; if (lineNumber) str << lineNumber; str << "</td><td>"; if (bpLineNumber) str << bpLineNumber; str << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Breakpoint Address:") + << "<tr><td>" << tr("Breakpoint Address:") << "</td><td>"; formatAddress(str, address); str << "</td><td>"; formatAddress(str, bpAddress); str << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Corrected Line Number:") + << "<tr><td>" << tr("Corrected Line Number:") << "</td><td>-</td><td>"; if (bpCorrectedLineNumber > 0) { str << bpCorrectedLineNumber; @@ -313,21 +193,31 @@ QString BreakpointData::toToolTip() const str << '-'; } str << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Condition:") + << "<tr><td>" << tr("Condition:") << "</td><td>" << condition << "</td><td>" << bpCondition << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Ignore Count:") << "</td><td>"; + << "<tr><td>" << tr("Ignore Count:") << "</td><td>"; if (ignoreCount) str << ignoreCount; str << "</td><td>"; if (bpIgnoreCount) str << bpIgnoreCount; str << "</td></tr>" - << "<tr><td>" << BreakHandler::tr("Thread Specification:") + << "<tr><td>" << tr("Thread Specification:") << "</td><td>" << threadSpec << "</td><td>" << bpThreadSpec << "</td></tr>" << "</table></body></html>"; return rc; } +// Compare file names case insensitively on Windows. +static inline bool fileNameMatch(const QString &f1, const QString &f2) +{ +#ifdef Q_OS_WIN + return f1.compare(f2, Qt::CaseInsensitive) == 0; +#else + return f1 == f2; +#endif +} + bool BreakpointData::isLocatedAt(const QString &fileName_, int lineNumber_, bool useMarkerPosition) const { @@ -339,6 +229,9 @@ bool BreakpointData::isSimilarTo(const BreakpointData *needle) const { //qDebug() << "COMPARING " << toString() << " WITH " << needle->toString(); + if (id == needle->id && id != 0) + return true; + // Clear hit. if (bpNumber == needle->bpNumber && !bpNumber.isEmpty() @@ -385,13 +278,6 @@ bool BreakpointData::conditionsMatch() const return s1 == s2; } -void BreakpointData::reinsertBreakpoint() -{ - QTC_ASSERT(m_handler, return); - m_handler->reinsertBreakpoint(this); -} - } // namespace Internal } // namespace Debugger -#include "breakpoint.moc" diff --git a/src/plugins/debugger/breakpoint.h b/src/plugins/debugger/breakpoint.h index 9589fb8dc9693c0b4f60a20c92982a793de03a84..eaf6d543dcb7b92d1c8f736130222f9704933414 100644 --- a/src/plugins/debugger/breakpoint.h +++ b/src/plugins/debugger/breakpoint.h @@ -33,6 +33,7 @@ #include <QtCore/QMetaType> #include <QtCore/QList> #include <QtCore/QString> +#include <QtCore/QCoreApplication> namespace Debugger { namespace Internal { @@ -52,11 +53,7 @@ public: BreakpointData(); ~BreakpointData(); - void removeMarker(); - void updateMarker(); QString toToolTip() const; - BreakHandler *handler() { return m_handler; } - void reinsertBreakpoint(); void clear(); // Delete all generated data. bool isLocatedAt(const QString &fileName, int lineNumber, @@ -77,13 +74,13 @@ private: BreakpointData(const BreakpointData &); void operator=(const BreakpointData &); - // Our owner - BreakHandler *m_handler; // Not owned. friend class BreakHandler; public: enum Type { BreakpointType, WatchpointType }; + quint64 id; + bool enabled; // Should we talk to the debugger engine? bool pending; // Does the debugger engine know about us already? Type type; // Type of breakpoint. @@ -124,13 +121,12 @@ public: bool isSetByFunction() const { return !funcName.isEmpty(); } bool isSetByFileAndLine() const { return !fileName.isEmpty(); } -private: + Q_DECLARE_TR_FUNCTIONS(BreakHandler) + + // TODO: move those to breakhandler // Taken from either user input or gdb responses. QString m_markerFileName; // Used to locate the marker. int m_markerLineNumber; - - // Our red blob in the editor. - BreakpointMarker *marker; }; typedef QList<BreakpointData *> Breakpoints; diff --git a/src/plugins/debugger/breakpointmarker.cpp b/src/plugins/debugger/breakpointmarker.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f0ffa4d67e41769dd4e2ad00ce9849629132f264 --- /dev/null +++ b/src/plugins/debugger/breakpointmarker.cpp @@ -0,0 +1,130 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "breakpointmarker.h" +#include "breakhandler.h" + +#include "stackframe.h" + +#include <texteditor/basetextmark.h> +#include <utils/qtcassert.h> + +#include <QtCore/QByteArray> +#include <QtCore/QDebug> +#include <QtCore/QTextStream> +#include <QtCore/QFileInfo> +#include <QtCore/QDir> + +////////////////////////////////////////////////////////////////// +// +// BreakpointMarker +// +////////////////////////////////////////////////////////////////// + + +namespace Debugger { +namespace Internal { + +BreakpointMarker::BreakpointMarker(BreakHandler *handler, BreakpointData *data, + const QString &fileName, int lineNumber) + : BaseTextMark(fileName, lineNumber) + , m_handler(handler) + , m_data(data) + , m_pending(true) +{ + //qDebug() << "CREATE MARKER " << fileName << lineNumber; +} + +BreakpointMarker::~BreakpointMarker() +{ + //qDebug() << "REMOVE MARKER "; + m_data = 0; +} + +QIcon BreakpointMarker::icon() const +{ + if (!m_data->enabled) + return m_handler->disabledBreakpointIcon(); + if (!m_handler->isActive()) + return m_handler->emptyIcon(); + return m_pending ? m_handler->pendingBreakPointIcon() : m_handler->breakpointIcon(); +} + +void BreakpointMarker::setPending(bool pending) +{ + if (pending == m_pending) + return; + m_pending = pending; + updateMarker(); +} + +void BreakpointMarker::updateBlock(const QTextBlock &) +{ + //qDebug() << "BREAKPOINT MARKER UPDATE BLOCK"; +} + +void BreakpointMarker::removedFromEditor() +{ + if (!m_data) + return; + m_handler->removeBreakpoint(m_data); + //handler->saveBreakpoints(); + m_handler->updateMarkers(); +} + +void BreakpointMarker::updateLineNumber(int lineNumber) +{ + if (!m_data) + return; + //if (m_data->markerLineNumber == lineNumber) + // return; + if (m_data->markerLineNumber() != lineNumber) { + m_data->setMarkerLineNumber(lineNumber); + // FIXME: Should we tell gdb about the change? + // Ignore it for now, as we would require re-compilation + // and debugger re-start anyway. + if (0 && m_data->bpLineNumber) { + if (!m_data->bpNumber.trimmed().isEmpty()) { + m_data->pending = true; + } + } + } + // Ignore updates to the "real" line number while the debugger is + // running, as this can be triggered by moving the breakpoint to + // the next line that generated code. + // FIXME: Do we need yet another data member? + if (m_data->bpNumber.trimmed().isEmpty()) { + m_data->lineNumber = lineNumber; + m_handler->updateMarkers(); + } +} + +} // namespace Internal +} // namespace Debugger + diff --git a/src/plugins/debugger/breakpointmarker.h b/src/plugins/debugger/breakpointmarker.h new file mode 100644 index 0000000000000000000000000000000000000000..f643a96d46df5d3d5f7f17e70f8c846b68bc5163 --- /dev/null +++ b/src/plugins/debugger/breakpointmarker.h @@ -0,0 +1,65 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef DEBUGGER_BREAKPOINTMARKER_H +#define DEBUGGER_BREAKPOINTMARKER_H + +#include <QtCore/QString> +#include <QtGui/QIcon> + +#include "breakpoint.h" +#include "breakhandler.h" +#include <texteditor/basetextmark.h> + +namespace Debugger { +namespace Internal { + +// The red blob on the left side in the cpp editor. +class BreakpointMarker : public TextEditor::BaseTextMark +{ + Q_OBJECT +public: + BreakpointMarker(BreakHandler *handler, BreakpointData *data, + const QString &fileName, int lineNumber); + ~BreakpointMarker(); + QIcon icon() const; + void setPending(bool pending); + void updateBlock(const QTextBlock &); + void removedFromEditor(); + void updateLineNumber(int lineNumber); +private: + BreakHandler *m_handler; + BreakpointData *m_data; + bool m_pending; + friend class BreakHandler; +}; + +} // namespace Internal +} // namespace Debugger +#endif diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index 4c26e0c3c6f6cc8c0e277ef6d2dfa2950d7cc39b..d54bd821025108abde04af69c481add9df6ad1fe 100644 --- a/src/plugins/debugger/breakwindow.cpp +++ b/src/plugins/debugger/breakwindow.cpp @@ -28,6 +28,7 @@ **************************************************************************/ #include "breakwindow.h" +#include "breakhandler.h" #include "debuggeractions.h" #include "debuggerconstants.h" @@ -426,8 +427,12 @@ void BreakWindow::editBreakpoints(const QModelIndexList &list) const QVariant dataV = model()->data(list.at(0), BreakpointRole); QTC_ASSERT(qVariantCanConvert<BreakpointData *>(dataV), return ); BreakpointData *data = qvariant_cast<BreakpointData *>(dataV); - if (editBreakpoint(data, this)) - data->reinsertBreakpoint(); + if (editBreakpoint(data, this)) { + // FIXME: nasty MVC violation + BreakHandler * handler = qobject_cast<BreakHandler *>(model()); + if (handler) + handler->reinsertBreakpoint(data); + } return; } diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index 50b9de2f7a98948396e9a8965c58d16e501e5fdc..0dcfe624d59279b58ef067826e82e9b47645a58d 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -18,6 +18,7 @@ QT += gui \ HEADERS += breakhandler.h \ breakpoint.h \ + breakpointmarker.h \ breakwindow.h \ consolewindow.h \ debugger_global.h \ @@ -58,6 +59,7 @@ HEADERS += breakhandler.h \ SOURCES += breakhandler.cpp \ breakpoint.cpp \ + breakpointmarker.cpp \ breakwindow.cpp \ consolewindow.cpp \ debuggeractions.cpp \ diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index c554130e539d7e41f29cd10e64cf65c8096981b0..4731ce119bb88df29c0ea667419acb5643ab6c58 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -340,8 +340,7 @@ void DebuggerEnginePrivate::slotEditBreakpoint() const QVariant data = act->data(); QTC_ASSERT(qVariantCanConvert<BreakpointData *>(data), return); BreakpointData *breakPointData = qvariant_cast<BreakpointData *>(data); - if (BreakWindow::editBreakpoint(breakPointData, ICore::instance()->mainWindow())) - breakPointData->reinsertBreakpoint(); + BreakWindow::editBreakpoint(breakPointData, ICore::instance()->mainWindow()); } void DebuggerEnginePrivate::breakpointEnableDisableMarginActionTriggered() diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index c190419fb8d02347506b1d8da5d976df7f527ebd..cae06f00c89edf4812117fb42ee338ac3c24c40c 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -705,7 +705,7 @@ void QmlEngine::messageReceived(const QByteArray &message) data->pending = false; data->bpFileName = file; data->bpLineNumber = line; - data->updateMarker(); + handler->updateMarker(data); } } } diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp index 09ac194e3d0e9c1a885260500c859cb64fda0e09..b6f3ff35547501e972bc10c5fe499fbdea000310 100644 --- a/src/plugins/debugger/script/scriptengine.cpp +++ b/src/plugins/debugger/script/scriptengine.cpp @@ -655,7 +655,7 @@ bool ScriptEngine::checkForBreakCondition(bool byFunction) data->setMarkerLineNumber(lineNumber); data->setMarkerFileName(fileName); data->pending = false; - data->updateMarker(); + breakHandler()->updateMarker(data); } notifyInferiorSpontaneousStop(); SDEBUG("Stopped at " << lineNumber << fileName);