From 09a36151918455d88019eb95478740b6becf6a88 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 6 Apr 2011 14:07:09 +0200 Subject: [PATCH] Debugger: Fix change-indication of registers. Emit dataChanged() on changed values. --- src/plugins/debugger/cdb/cdbengine.cpp | 2 +- src/plugins/debugger/registerhandler.cpp | 36 +++++++++++++++++++----- src/plugins/debugger/registerhandler.h | 2 ++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 30699e87fd3..c368951c03f 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -1660,7 +1660,7 @@ void CdbEngine::handleRegisters(const CdbExtensionCommandPtr &reply) registers.reserve(value.childCount()); foreach (const GdbMi &gdbmiReg, value.children()) registers.push_back(parseRegister(gdbmiReg)); - registerHandler()->setRegisters(registers); + registerHandler()->setAndMarkRegisters(registers); } else { showMessage(QString::fromLatin1("Parse error in registers response."), LogError); qWarning("Parse error in registers response:\n%s", reply->reply.constData()); diff --git a/src/plugins/debugger/registerhandler.cpp b/src/plugins/debugger/registerhandler.cpp index 31c8174618f..f935290efba 100644 --- a/src/plugins/debugger/registerhandler.cpp +++ b/src/plugins/debugger/registerhandler.cpp @@ -34,7 +34,6 @@ #include "registerhandler.h" #include "watchdelegatewidgets.h" - ////////////////////////////////////////////////////////////////// // // RegisterHandler @@ -146,21 +145,44 @@ bool RegisterHandler::isEmpty() const return m_registers.isEmpty(); } +// Compare register sets by name +static inline bool compareRegisterSet(const Registers &r1, const Registers &r2) +{ + if (r1.size() != r2.size()) + return false; + const int size = r1.size(); + for (int r = 0; r < size; r++) + if (r1.at(r).name != r2.at(r).name) + return false; + return true; +} + void RegisterHandler::setRegisters(const Registers ®isters) { m_registers = registers; + const int size = m_registers.size(); + for (int r = 0; r < size; r++) + m_registers[r].changed = false; calculateWidth(); reset(); } void RegisterHandler::setAndMarkRegisters(const Registers ®isters) { - const Registers old = m_registers; - m_registers = registers; - for (int i = qMin(m_registers.size(), old.size()); --i >= 0; ) - m_registers[i].changed = m_registers[i].value != old[i].value; - calculateWidth(); - reset(); + if (!compareRegisterSet(m_registers, registers)) { + setRegisters(registers); + return; + } + const int size = m_registers.size(); + for (int r = 0; r < size; r++) { + if (m_registers.at(r).value != registers.at(r).value) { + // Indicate red if values change, keep changed. + m_registers[r].changed = m_registers[r].changed || !m_registers.at(r).value.isEmpty(); + m_registers[r].value = registers.at(r).value; + const QModelIndex regIndex = index(r, 1); + emit dataChanged(regIndex, regIndex); + } + } } Registers RegisterHandler::registers() const diff --git a/src/plugins/debugger/registerhandler.h b/src/plugins/debugger/registerhandler.h index 0bdbf14e319..f8f70597d54 100644 --- a/src/plugins/debugger/registerhandler.h +++ b/src/plugins/debugger/registerhandler.h @@ -71,7 +71,9 @@ public: QAbstractItemModel *model() { return this; } bool isEmpty() const; // nothing known so far? + // Set up register names (gdb) void setRegisters(const Registers ®isters); + // Set register values void setAndMarkRegisters(const Registers ®isters); Registers registers() const; Register registerAt(int i) const { return m_registers.at(i); }