diff --git a/src/DebuggerForm.cpp b/src/DebuggerForm.cpp index 8535986..e8c7716 100644 --- a/src/DebuggerForm.cpp +++ b/src/DebuggerForm.cpp @@ -687,6 +687,7 @@ void DebuggerForm::createForm() // Main memory viewer connect(this, &DebuggerForm::connected, mainMemoryView, &MainMemoryViewer::refresh); connect(this, &DebuggerForm::breakStateEntered, mainMemoryView, &MainMemoryViewer::refresh); + connect(this, &DebuggerForm::symbolsChanged, mainMemoryView, &MainMemoryViewer::updateCompleter); // Slot viewer connect(this, &DebuggerForm::connected, slotView, &SlotViewer::refresh); @@ -718,6 +719,7 @@ void DebuggerForm::createForm() disasmView->setMemoryLayout(&memLayout); disasmView->setSymbolTable(&session.symbolTable()); mainMemoryView->setRegsView(regsView); + mainMemoryView->setMemoryLayout(&memLayout); mainMemoryView->setSymbolTable(&session.symbolTable()); mainMemoryView->setDebuggable("memory", 0x10000); stackView->setData(mainMemory, 0x10000); diff --git a/src/MainMemoryViewer.cpp b/src/MainMemoryViewer.cpp index 1871f61..7f836b2 100644 --- a/src/MainMemoryViewer.cpp +++ b/src/MainMemoryViewer.cpp @@ -9,6 +9,8 @@ #include #include #include +#include +#include static const int linkRegisters[] = { CpuRegs::REG_BC, CpuRegs::REG_DE, CpuRegs::REG_HL, @@ -54,11 +56,15 @@ MainMemoryViewer::MainMemoryViewer(QWidget* parent) linkedId = 0; regsViewer = nullptr; symTable = nullptr; + memLayout = nullptr; + completer = nullptr; connect(hexView, &HexViewer::locationChanged, this, &MainMemoryViewer::hexViewChanged); connect(addressValue, &QLineEdit::returnPressed, this, &MainMemoryViewer::addressValueChanged); + connect(addressValue, &QLineEdit::textEdited, + this, &MainMemoryViewer::addressValueChanging); connect(addressSourceList, qOverload(&QComboBox::currentIndexChanged), this, &MainMemoryViewer::addressSourceListChanged); } @@ -99,6 +105,32 @@ void MainMemoryViewer::hexViewChanged(int addr) addressValue->setText(hexValue(addr, 4)); } +void MainMemoryViewer::setMemoryLayout(MemoryLayout* ml) +{ + memLayout = ml; +} + +void MainMemoryViewer::updateCompleter() +{ + assert(symTable); + assert(memLayout); + // release the previous + if (completer) { + addressValue->setCompleter(nullptr); + //delete completer; // PENDING: done in setCompleter() above? (not obvious in document) + completer = nullptr; // safety + } + // create address completer + completer = new QCompleter(symTable->labelList(true, memLayout), this); + completer->setCaseSensitivity(Qt::CaseInsensitive); + addressValue->setCompleter(completer); +} + +void MainMemoryViewer::addressValueChanging() +{ + // PENDING: Needing the color, someone will implement. +} + void MainMemoryViewer::addressValueChanged() { auto addr = stringToValue(addressValue->text()); diff --git a/src/MainMemoryViewer.h b/src/MainMemoryViewer.h index 1c9cc44..6911f4e 100644 --- a/src/MainMemoryViewer.h +++ b/src/MainMemoryViewer.h @@ -8,6 +8,8 @@ class CPURegsViewer; class SymbolTable; class QComboBox; class QLineEdit; +class QCompleter; +struct MemoryLayout; class MainMemoryViewer : public QWidget { @@ -18,6 +20,7 @@ class MainMemoryViewer : public QWidget void setDebuggable(const QString& name, int size); void setRegsView(CPURegsViewer* viewer); void setSymbolTable(SymbolTable* symtable); + void setMemoryLayout(MemoryLayout* ml); void setLocation(int addr); void settingsChanged(); @@ -25,6 +28,8 @@ class MainMemoryViewer : public QWidget void registerChanged(int id, int value); void hexViewChanged(int addr); + void updateCompleter(); + void addressValueChanging(); void addressValueChanged(); void addressSourceListChanged(int index); @@ -32,9 +37,11 @@ class MainMemoryViewer : public QWidget HexViewer* hexView; QComboBox* addressSourceList; QLineEdit* addressValue; + QCompleter* completer; CPURegsViewer* regsViewer; SymbolTable* symTable; + MemoryLayout* memLayout; int linkedId; bool isLinked; };