diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 7b4d92353e9..c1b55fdd8b5 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -207,14 +207,6 @@ public: virtual void prepareForRestart() {} virtual void watchPoint(const QPoint &); - - enum MemoryViewFlags - { - MemoryReadOnly = 0x1, //!< Read-only. - MemoryTrackRegister = 0x2, //!< Address parameter is register number to track - MemoryView = 0x4 //!< Open a separate view (using the pos-parameter). - }; - virtual void runCommand(const DebuggerCommand &cmd); virtual void openMemoryView(const MemoryViewSetupData &data); virtual void fetchMemory(MemoryAgent *, quint64 addr, quint64 length); diff --git a/src/plugins/debugger/memoryagent.cpp b/src/plugins/debugger/memoryagent.cpp index 5fc78867c46..8a5ca69a1f5 100644 --- a/src/plugins/debugger/memoryagent.cpp +++ b/src/plugins/debugger/memoryagent.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -70,38 +71,30 @@ enum { DataRange = 1024 * 1024 }; class MemoryView : public QWidget { public: - explicit MemoryView(MemoryAgent *agent, QWidget *parent) - : QWidget(parent, Qt::Tool), m_agent(agent) + explicit MemoryView(BinEditor::EditorService *service) + : QWidget(ICore::dialogParent(), Qt::Tool), m_service(service) { setAttribute(Qt::WA_DeleteOnClose); - QVBoxLayout *layout = new QVBoxLayout(this); - layout->addWidget(agent->service()->widget()); + auto layout = new QVBoxLayout(this); + layout->addWidget(service->widget()); layout->setContentsMargins(0, 0, 0, 0); setMinimumWidth(400); resize(800, 200); } - void updateContents() +protected: + void setMarkup(const QList &markup) { - if (m_agent) - m_agent->updateContents(); + if (m_service) { + m_service->clearMarkup(); + for (const MemoryMarkup &m : markup) + m_service->addMarkup(m.address, m.length, m.color, m.toolTip); + m_service->commitMarkup(); + } } protected: - void setAddress(quint64 a) - { - if (m_agent) - m_agent->setAddress(a); - } - - void setMarkup(const QList &m) - { - if (m_agent) - m_agent->setMarkup(m); - } - -private: - QPointer m_agent; + BinEditor::EditorService *m_service; }; @@ -125,13 +118,13 @@ private: class RegisterMemoryView : public MemoryView { public: - RegisterMemoryView(MemoryAgent *agent, quint64 addr, const QString ®Name, - RegisterHandler *rh, QWidget *parent) - : MemoryView(agent, parent), m_registerName(regName), m_registerAddress(addr) + RegisterMemoryView(BinEditor::EditorService *service, quint64 addr, const QString ®Name, + RegisterHandler *rh) + : MemoryView(service), m_registerName(regName), m_registerAddress(addr) { connect(rh, &QAbstractItemModel::modelReset, this, &QWidget::close); connect(rh, &RegisterHandler::registerChanged, this, &RegisterMemoryView::onRegisterChanged); - updateContents(); + m_service->updateContents(); } private: @@ -144,11 +137,14 @@ private: void setRegisterAddress(quint64 v) { if (v == m_registerAddress) { - updateContents(); + if (m_service) + m_service->updateContents(); return; } m_registerAddress = v; - setAddress(v); + if (m_service) + m_service->setSizes(v, DataRange, BinBlockSize); + setWindowTitle(registerViewTitle(m_registerName, v)); if (v) setMarkup(registerViewMarkup(v, m_registerName)); @@ -212,18 +208,17 @@ bool MemoryAgent::hasBinEditor() } MemoryAgent::MemoryAgent(const MemoryViewSetupData &data, DebuggerEngine *engine) - : m_engine(engine), m_flags(data.flags) + : m_engine(engine), m_trackRegisters(data.trackRegisters) { auto factory = binEditorFactory(); if (!factory) return; - const bool readOnly = (m_flags & DebuggerEngine::MemoryReadOnly) != 0; QString title = data.title.isEmpty() ? tr("Memory at 0x%1").arg(data.startAddress, 0, 16) : data.title; - if (!(m_flags & DebuggerEngine::MemoryView) && !title.endsWith('$')) + if (!data.separateView && !title.endsWith('$')) title.append(" $"); - if (m_flags & DebuggerEngine::MemoryView) { + if (data.separateView) { // Ask BIN editor plugin for factory service and have it create a bin editor widget. m_service = factory->createEditorService(title, false); } else { @@ -261,14 +256,15 @@ MemoryAgent::MemoryAgent(const MemoryViewSetupData &data, DebuggerEngine *engine m_service->setAboutToBeDestroyedHandler([this] { m_service = nullptr; }); // Separate view? - if (m_flags & DebuggerEngine::MemoryView) { + if (data.separateView) { // Memory view tracking register value, providing its own updating mechanism. - if (m_flags & DebuggerEngine::MemoryTrackRegister) { - auto view = new RegisterMemoryView(this, data.startAddress, data.registerName, m_engine->registerHandler(), data.parent); + if (data.trackRegisters) { + auto view = new RegisterMemoryView(m_service, data.startAddress, data.registerName, + m_engine->registerHandler()); view->show(); } else { // Ordinary memory view - auto view = new MemoryView(this, data.parent); + auto view = new MemoryView(m_service); view->setWindowTitle(title); view->show(); } @@ -277,10 +273,13 @@ MemoryAgent::MemoryAgent(const MemoryViewSetupData &data, DebuggerEngine *engine m_service->editor()->document()->setProperty(Constants::OPENED_BY_DEBUGGER, QVariant(true)); } - m_service->setReadOnly(readOnly); + m_service->setReadOnly(data.readOnly); m_service->setNewWindowRequestAllowed(true); m_service->setSizes(data.startAddress, DataRange, BinBlockSize); - setMarkup(data.markup); + m_service->clearMarkup(); + for (const MemoryMarkup &m : data.markup) + m_service->addMarkup(m.address, m.length, m.color, m.toolTip); + m_service->commitMarkup(); } MemoryAgent::~MemoryAgent() @@ -293,26 +292,11 @@ MemoryAgent::~MemoryAgent() } } -void MemoryAgent::setAddress(quint64 address) -{ - QTC_ASSERT(m_service, return); - m_service->setSizes(address, DataRange, BinBlockSize); -} - -void MemoryAgent::setMarkup(const QList &markup) -{ - QTC_ASSERT(m_service, return); - m_service->clearMarkup(); - for (const MemoryMarkup &m : markup) - m_service->addMarkup(m.address, m.length, m.color, m.toolTip); - m_service->commitMarkup(); -} - void MemoryAgent::updateContents() { // Update all views except register views, which trigger on // register value set/changed. - if (!(m_flags & DebuggerEngine::MemoryTrackRegister) && m_service) + if (!m_trackRegisters && m_service) m_service->updateContents(); } diff --git a/src/plugins/debugger/memoryagent.h b/src/plugins/debugger/memoryagent.h index 2197510c1a2..6f150ad35f4 100644 --- a/src/plugins/debugger/memoryagent.h +++ b/src/plugins/debugger/memoryagent.h @@ -58,13 +58,14 @@ class MemoryViewSetupData public: MemoryViewSetupData() {} - QWidget *parent = nullptr; quint64 startAddress = 0; QString registerName; - unsigned flags = 0; QList markup; QPoint pos; QString title; + bool readOnly = false; // Read-only. + bool separateView = false; // Open a separate view (using the pos-parameter). + bool trackRegisters = false; // Address parameter is register number to track }; class MemoryAgent : public QObject @@ -75,15 +76,11 @@ public: MemoryAgent(const MemoryViewSetupData &data, DebuggerEngine *engine); ~MemoryAgent(); - void setAddress(quint64 address); - void setMarkup(const QList &ml); void updateContents(); void addData(quint64 address, const QByteArray &data); void setFinished(); bool isUsable(); - BinEditor::EditorService *service() { return m_service; } - static bool hasBinEditor(); private: @@ -91,7 +88,7 @@ private: BinEditor::EditorService *m_service = nullptr; DebuggerEngine *m_engine = nullptr; - int m_flags = 0; + bool m_trackRegisters = false; }; QList registerViewMarkup(quint64 address, const QString ®Name); diff --git a/src/plugins/debugger/registerhandler.cpp b/src/plugins/debugger/registerhandler.cpp index 9ab72f0801a..ea914102b05 100644 --- a/src/plugins/debugger/registerhandler.cpp +++ b/src/plugins/debugger/registerhandler.cpp @@ -699,8 +699,9 @@ bool RegisterHandler::contextMenuEvent(const ItemViewEvent &ev) [this, registerName, address] { MemoryViewSetupData data; data.startAddress = address; - data.flags = DebuggerEngine::MemoryTrackRegister|DebuggerEngine::MemoryView; data.registerName = registerName; + data.trackRegisters = true; + data.separateView = true; m_engine->openMemoryView(data); }); diff --git a/src/plugins/debugger/stackhandler.cpp b/src/plugins/debugger/stackhandler.cpp index ec55f9e4928..0afb0ba9bca 100644 --- a/src/plugins/debugger/stackhandler.cpp +++ b/src/plugins/debugger/stackhandler.cpp @@ -395,8 +395,8 @@ bool StackHandler::contextMenuEvent(const ItemViewEvent &ev) [this, row, frame, address] { MemoryViewSetupData data; data.startAddress = address; - data.title = tr("Memory at Frame #%1 (%2) 0x%3"). - arg(row).arg(frame.function).arg(address, 0, 16); + data.title = tr("Memory at Frame #%1 (%2) 0x%3") + .arg(row).arg(frame.function).arg(address, 0, 16); data.markup.push_back(MemoryMarkup(address, 1, QColor(Qt::blue).lighter(), tr("Frame #%1 (%2)").arg(row).arg(frame.function))); m_engine->openMemoryView(data); diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 628c693d71f..0734a0618f3 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -398,8 +398,7 @@ public: const QPoint &pos); MemoryMarkupList variableMemoryMarkup(WatchItem *item, const QString &rootName, const QString &rootToolTip, quint64 address, quint64 size, - const RegisterMap ®isterMap, bool sizeIsEstimate, - const QColor &defaultBackground); + const RegisterMap ®isterMap, bool sizeIsEstimate); int memberVariableRecursion(WatchItem *item, const QString &name, quint64 start, quint64 end, int *colorNumberIn, ColorNumberToolTips *cnmv); @@ -1324,14 +1323,11 @@ MemoryMarkupList WatchModel::variableMemoryMarkup(WatchItem *item, const QString &rootToolTip, quint64 address, quint64 size, const RegisterMap ®isterMap, - bool sizeIsEstimate, - const QColor &defaultBackground) + bool sizeIsEstimate) { enum { debug = 0 }; enum { registerColorNumber = 0x3453 }; - if (debug) - qDebug() << address << ' ' << size << rootName << rootToolTip; // Starting out from base, create an array representing the area // filled with base color. Fill children with some unique color numbers, // leaving the padding areas of the parent colored with the base color. @@ -1372,6 +1368,8 @@ MemoryMarkupList WatchModel::variableMemoryMarkup(WatchItem *item, // Overwrite the first color (which is usually very bright) by the base color. QList colors = TextEditor::SyntaxHighlighter::generateColors(colorNumber + 2, QColor(Qt::black)); + QWidget *parent = ICore::dialogParent(); + const QColor defaultBackground = parent->palette().color(QPalette::Normal, QPalette::Base); colors[0] = sizeIsEstimate ? defaultBackground : Qt::lightGray; const QColor registerColor = Qt::green; int lastColorNumber = 0; @@ -1409,8 +1407,6 @@ MemoryMarkupList WatchModel::variableMemoryMarkup(WatchItem *item, void WatchModel::addVariableMemoryView(bool separateView, WatchItem *item, bool atPointerAddress, const QPoint &pos) { - QWidget *parent = ICore::dialogParent(); - const QColor background = parent->palette().color(QPalette::Normal, QPalette::Base); MemoryViewSetupData data; data.startAddress = atPointerAddress ? item->origaddr : item->address; if (!data.startAddress) @@ -1422,21 +1418,20 @@ void WatchModel::addVariableMemoryView(bool separateView, data.markup = variableMemoryMarkup(item, item->name, rootToolTip, data.startAddress, size, m_engine->registerHandler()->registerMap(), - sizeIsEstimate, background); - data.flags = separateView ? DebuggerEngine::MemoryView|DebuggerEngine::MemoryReadOnly : 0; + sizeIsEstimate); + data.separateView = separateView; + data.readOnly = separateView; QString pat = atPointerAddress ? tr("Memory at Pointer's Address \"%1\" (0x%2)") : tr("Memory at Object's Address \"%1\" (0x%2)"); data.title = pat.arg(item->name).arg(data.startAddress, 0, 16); data.pos = pos; - data.parent = parent; m_engine->openMemoryView(data); } // Add a memory view of the stack layout showing local variables and registers. void WatchModel::addStackLayoutMemoryView(bool separateView, const QPoint &p) { - QWidget *parent = ICore::dialogParent(); // Determine suitable address range from locals. quint64 start = Q_UINT64_C(0xFFFFFFFFFFFFFFFF); quint64 end = 0; @@ -1477,16 +1472,14 @@ void WatchModel::addStackLayoutMemoryView(bool separateView, const QPoint &p) } // Indicate all variables. MemoryViewSetupData data; - const QColor background = parent->palette().color(QPalette::Normal, QPalette::Base); data.startAddress = start; data.markup = variableMemoryMarkup(rootItem()->childAt(0), QString(), - QString(), start, end - start, - regMap, true, background); - data.flags = separateView - ? (DebuggerEngine::MemoryView|DebuggerEngine::MemoryReadOnly) : 0; + QString(), start, end - start, + regMap, true); + data.separateView = separateView; + data.readOnly = separateView; data.title = tr("Memory Layout of Local Variables at 0x%1").arg(start, 0, 16); data.pos = p; - data.parent = parent; m_engine->openMemoryView(data); }