diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 55a077c54b9b9c095a5c2c8ee0ba55e63c1c8eba..a4e645de48b0c86a31651b90632b1539672e859d 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -52,19 +52,38 @@ namespace Debugger { namespace Internal { BreakHandler::BreakHandler() - : m_breakpointIcon(_(":/debugger/images/breakpoint_16.png")), - m_disabledBreakpointIcon(_(":/debugger/images/breakpoint_disabled_16.png")), - m_pendingBreakPointIcon(_(":/debugger/images/breakpoint_pending_16.png")), - //m_emptyIcon(_(":/debugger/images/watchpoint.png")), - m_emptyIcon(_(":/debugger/images/breakpoint_pending_16.png")), - //m_emptyIcon(_(":/debugger/images/debugger_empty_14.png")), - m_watchpointIcon(_(":/debugger/images/watchpoint.png")), - m_syncTimerId(-1) + : m_syncTimerId(-1) {} BreakHandler::~BreakHandler() {} +QIcon BreakHandler::breakpointIcon() +{ + static QIcon icon(_(":/debugger/images/breakpoint_16.png")); + return icon; +} + +QIcon BreakHandler::disabledBreakpointIcon() +{ + static QIcon icon(_(":/debugger/images/breakpoint_disabled_16.png")); + return icon; +} + +QIcon BreakHandler::pendingBreakPointIcon() +{ + static QIcon icon(_(":/debugger/images/breakpoint_pending_16.png")); + return icon; +} + +QIcon BreakHandler::emptyIcon() +{ + static QIcon icon(_(":/debugger/images/breakpoint_pending_16.png")); + //static QIcon icon(_(":/debugger/images/watchpoint.png")); + //static QIcon icon(_(":/debugger/images/debugger_empty_14.png")); + return icon; +} + int BreakHandler::columnCount(const QModelIndex &parent) const { return parent.isValid() ? 0 : 8; @@ -358,6 +377,7 @@ QVariant BreakHandler::data(const QModelIndex &mi, int role) const return QVariant(); BreakpointId id = findBreakpointByIndex(mi); + //qDebug() << "DATA: " << id << role << mi.column(); ConstIterator it = m_storage.find(id); QTC_ASSERT(it != m_storage.end(), return QVariant()); const BreakpointParameters &data = it->data; @@ -369,43 +389,45 @@ QVariant BreakHandler::data(const QModelIndex &mi, int role) const return QString::number(id); //return QString("%1 - %2").arg(id).arg(response.number); } - if (role == Qt::DecorationRole) { - if (data.isWatchpoint()) - return m_watchpointIcon; - if (!data.enabled) - return m_disabledBreakpointIcon; - return it->isPending() ? m_pendingBreakPointIcon : m_breakpointIcon; - } + if (role == Qt::DecorationRole) + return it->icon(); break; case 1: if (role == Qt::DisplayRole) { - const QString str = it->isPending() - ? data.functionName : response.functionName; - return str.isEmpty() ? empty : str; + if (!response.functionName.isEmpty()) + return response.functionName; + if (!data.functionName.isEmpty()) + return data.functionName; + return empty; } break; case 2: if (role == Qt::DisplayRole) { - QString str = it->isPending() - ? data.fileName : response.fileName; - str = QFileInfo(str).fileName(); + QString str; + if (!response.fileName.isEmpty()) + str = response.fileName; + if (str.isEmpty() && !data.fileName.isEmpty()) + str = response.fileName; + if (str.isEmpty()) { + QString s = QFileInfo(str).fileName(); + if (!s.isEmpty()) + str = s; + } // FIXME: better? //if (data.multiple && str.isEmpty() && !response.fileName.isEmpty()) // str = response.fileName; - str = str.isEmpty() ? empty : str; - if (data.useFullPath) - str = QDir::toNativeSeparators(QLatin1String("/.../") + str); - return str; + if (!str.isEmpty()) + return str; + return empty; } break; case 3: if (role == Qt::DisplayRole) { - // FIXME: better? - //if (data.multiple && str.isEmpty() && !reponse.fileName.isEmpty()) - // str = response.lineNumber; - const int nr = it->isPending() - ? data.lineNumber : response.lineNumber; - return nr ? QString::number(nr) : empty; + if (response.lineNumber > 0) + return response.lineNumber; + if (data.lineNumber > 0) + return data.lineNumber; + return empty; } if (role == Qt::UserRole + 1) return data.lineNumber; @@ -532,8 +554,9 @@ void BreakHandler::setMarkerFileAndLine(BreakpointId id, return; it->response.fileName = fileName; it->response.lineNumber = lineNumber; + it->destroyMarker(); updateMarker(id); - scheduleSynchronization(); + emit layoutChanged(); } BreakpointState BreakHandler::state(BreakpointId id) const @@ -558,6 +581,7 @@ void BreakHandler::setEngine(BreakpointId id, DebuggerEngine *value) QTC_ASSERT(!it->engine, return); it->engine = value; it->state = BreakpointInsertRequested; + it->response = BreakpointResponse(); updateMarker(id); scheduleSynchronization(); } @@ -721,6 +745,7 @@ void BreakHandler::removeBreakpoint(BreakpointId id) QTC_ASSERT(it != m_storage.end(), return); if (it->state == BreakpointInserted) { setState(id, BreakpointRemoveRequested); + scheduleSynchronization(); } else if (it->state == BreakpointNew) { it->state = BreakpointDead; cleanupBreakpoint(id); @@ -809,11 +834,7 @@ QIcon BreakHandler::icon(BreakpointId id) const { ConstIterator it = m_storage.find(id); QTC_ASSERT(it != m_storage.end(), return pendingBreakPointIcon()); - if (!it->data.enabled) - return m_disabledBreakpointIcon; - if (it->state == BreakpointInserted) - return breakpointIcon(); - return pendingBreakPointIcon(); + return it->icon(); } void BreakHandler::scheduleSynchronization() @@ -845,6 +866,7 @@ void BreakHandler::gotoLocation(BreakpointId id) const void BreakHandler::updateLineNumberFromMarker(BreakpointId id, int lineNumber) { Iterator it = m_storage.find(id); + it->response.pending = false; QTC_ASSERT(it != m_storage.end(), return); //if (data.markerLineNumber == lineNumber) // return; @@ -867,6 +889,7 @@ void BreakHandler::updateLineNumberFromMarker(BreakpointId id, int lineNumber) it->data.lineNumber = lineNumber; } updateMarker(id); + emit layoutChanged(); } BreakpointIds BreakHandler::allBreakpointIds() const @@ -914,7 +937,6 @@ void BreakHandler::setResponse(BreakpointId id, const BreakpointResponse &data) Iterator it = m_storage.find(id); QTC_ASSERT(it != m_storage.end(), return); it->response = data; - updateMarker(id); //qDebug() << "SET RESPONSE: " << id << it->state << it->needsChange(); if (it->state == BreakpointChangeProceeding || it->state == BreakpointInsertProceeding) { @@ -923,6 +945,8 @@ void BreakHandler::setResponse(BreakpointId id, const BreakpointResponse &data) else setState(id, BreakpointInserted); } + it->destroyMarker(); + updateMarker(id); } void BreakHandler::setBreakpointData(BreakpointId id, const BreakpointParameters &data) @@ -932,6 +956,7 @@ void BreakHandler::setBreakpointData(BreakpointId id, const BreakpointParameters if (data == it->data) return; it->data = data; + it->destroyMarker(); updateMarker(id); layoutChanged(); } @@ -977,15 +1002,15 @@ static void formatAddress(QTextStream &str, quint64 address) static QString stateToString(BreakpointState state) { switch (state) { - case BreakpointNew: return "new"; - case BreakpointInsertRequested: return "insertion requested"; - case BreakpointInsertProceeding: return "insertion proceeding"; - case BreakpointChangeRequested: return "change requested"; - case BreakpointChangeProceeding: return "change proceeding"; - case BreakpointInserted: return "breakpoint inserted"; - case BreakpointRemoveRequested: return "removal requested"; - case BreakpointRemoveProceeding: return "removal is proceeding"; - case BreakpointDead: return "dead"; + case BreakpointNew: return "New"; + case BreakpointInsertRequested: return "Insertion requested"; + case BreakpointInsertProceeding: return "Insertion proceeding"; + case BreakpointChangeRequested: return "Change requested"; + case BreakpointChangeProceeding: return "Change proceeding"; + case BreakpointInserted: return "Breakpoint inserted"; + case BreakpointRemoveRequested: return "Removal requested"; + case BreakpointRemoveProceeding: return "Removal proceeding"; + case BreakpointDead: return "Dead"; default: return "<invalid state>"; } }; @@ -1008,6 +1033,17 @@ bool BreakHandler::BreakpointItem::isLocatedAt return lineNumber == line && fileNameMatch(fileName, response.fileName); } +QIcon BreakHandler::BreakpointItem::icon() const +{ + // FIXME: This seems to be called on each cursor blink as soon as the + // cursor is near a line with a breakpoint marker (+/- 2 lines or so). + if (!data.enabled) + return BreakHandler::disabledBreakpointIcon(); + if (state == BreakpointInserted) + return BreakHandler::breakpointIcon(); + return BreakHandler::pendingBreakPointIcon(); +} + QString BreakHandler::BreakpointItem::toToolTip() const { QString t; @@ -1053,6 +1089,8 @@ QString BreakHandler::BreakpointItem::toToolTip() const << "</td><td>" << t << "</td></tr>" << "<tr><td>" << tr("Extra Information:") << "</td><td>" << response.extra << "</td></tr>" + << "<tr><td>" << tr("Pending:") + << "</td><td>" << (response.pending ? "True" : "False") << "</td></tr>" << "</table><br><hr><table>" << "<tr><th>" << tr("Property") << "</th><th>" << tr("Requested") diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 05fdd0f6c1731fe14a1c481afd5e7f5333f0153c..32e2d61de9afdabefa297c4a5a6611556b833a8b 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -83,10 +83,10 @@ public: bool hasWatchpointAt(quint64 address) const; void updateMarkers(); - QIcon breakpointIcon() const { return m_breakpointIcon; } - QIcon disabledBreakpointIcon() const { return m_disabledBreakpointIcon; } - QIcon pendingBreakPointIcon() const { return m_pendingBreakPointIcon; } - QIcon emptyIcon() const { return m_emptyIcon; } + static QIcon breakpointIcon(); + static QIcon disabledBreakpointIcon(); + static QIcon pendingBreakPointIcon(); + static QIcon emptyIcon(); void toggleBreakpoint(const QString &fileName, int lineNumber, quint64 address = 0); BreakpointId findBreakpointByFileAndLine(const QString &fileName, @@ -167,12 +167,6 @@ private: void updateMarker(BreakpointId id); void cleanupBreakpoint(BreakpointId id); - const QIcon m_breakpointIcon; - const QIcon m_disabledBreakpointIcon; - const QIcon m_pendingBreakPointIcon; - const QIcon m_emptyIcon; - const QIcon m_watchpointIcon; - struct BreakpointItem { BreakpointItem(); @@ -185,6 +179,7 @@ private: QString toToolTip() const; QString markerFileName() const; int markerLineNumber() const; + QIcon icon() const; BreakpointParameters data; BreakpointState state; // Current state of breakpoint. diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 01a06569696abbe204e606628c553a1b318c0608..1a5a0833fd087c8ba04fae7ebc51c66896f34598 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2036,6 +2036,7 @@ void GdbEngine::updateBreakpointDataFromOutput(BreakpointId id, const GdbMi &bkp response.multiple = false; response.enabled = true; + response.pending = false; response.condition.clear(); QByteArray file, fullName; foreach (const GdbMi &child, bkpt.children()) {