debugger icon indicating copy to clipboard operation
debugger copied to clipboard

[more convenient] On 'Main memory' window, provides the input completion.

Open mb3h opened this issue 1 year ago • 0 comments

[How to patch] (1) Appending the signal flow.    DebuggerForm::systemSymbolManager(),    | symbolsChanged + MainMemoryViewer::updateCompleter(),    DisasmViewer::refresh() (2) In the following, appending a bit of codes.    MainMemoryViewer::updateCompleter()

--- old/DebuggerForm.cpp	2023-06-06 20:37:52.000000000 -0300
+++ src/DebuggerForm.cpp	2025-01-16 00:00:00.000000000 +0000
@@ -687,6 +687,7 @@
 	// 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 @@
 	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);
--- old/MainMemoryViewer.cpp	2022-05-14 20:53:15.000000000 +0200
+++ src/MainMemoryViewer.cpp	2025-01-16 00:00:00.000000000 +0000
@@ -9,6 +9,8 @@
 #include <QHBoxLayout>
 #include <QLineEdit>
 #include <iostream>
+#include <cassert>
+#include <QCompleter>
 
 static const int linkRegisters[] = {
 	CpuRegs::REG_BC, CpuRegs::REG_DE, CpuRegs::REG_HL,
@@ -54,11 +56,15 @@
 	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<int>(&QComboBox::currentIndexChanged),
 	        this, &MainMemoryViewer::addressSourceListChanged);
 }
@@ -99,6 +105,32 @@
 	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<uint16_t>(addressValue->text());
--- old/MainMemoryViewer.h	2022-05-14 22:43:40.000000000 +0200
+++ src/MainMemoryViewer.h	2025-01-16 00:00:00.000000000 +0000
@@ -8,6 +8,8 @@
 class SymbolTable;
 class QComboBox;
 class QLineEdit;
+class QCompleter;
+struct MemoryLayout;
 
 class MainMemoryViewer : public QWidget
 {
@@ -18,6 +20,7 @@
 	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 @@
 	void registerChanged(int id, int value);
 
 	void hexViewChanged(int addr);
+	void updateCompleter();
+	void addressValueChanging();
 	void addressValueChanged();
 	void addressSourceListChanged(int index);
 
@@ -32,9 +37,11 @@
 	HexViewer* hexView;
 	QComboBox* addressSourceList;
 	QLineEdit* addressValue;
+	QCompleter* completer;
 
 	CPURegsViewer* regsViewer;
 	SymbolTable* symTable;
+	MemoryLayout* memLayout;
 	int linkedId;
 	bool isLinked;
 };

[Related flow]

- DebuggerForm::createForm()
  | .session
  - DebugSession::symbolTable()
    | (SymbolTable)
  - MainMemoryViewer::setSymbolTable()
  | .memLayout (MemoryLayout)
  - SlotViewer::setMemoryLayout()

- DebuggerForm::searchGoto()
  | .memLayout, .session
  - GotoDialog::ctor()
    | session
    - DebugSession::symbolTable()
    | (SymbolTable), ml
    - SymbolTable::labelList()
      | (QStringList)
    - QCompleter()

mb3h avatar Feb 03 '25 04:02 mb3h