Skip to content

Commit 9685327

Browse files
committed
Implement better UX for pattern finding
1 parent 61215a2 commit 9685327

File tree

8 files changed

+713
-616
lines changed

8 files changed

+713
-616
lines changed

src/gui/Src/Gui/CPUDisassembly.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,23 +1217,32 @@ void CPUDisassembly::findPatternSlot()
12171217
{
12181218
HexEditDialog hexEdit(this);
12191219
hexEdit.isDataCopiable(false);
1220+
1221+
dsint addr = rvaToVa(getSelectionStart());
1222+
1223+
// Setup find mode based on search scope
12201224
if(sender() == mFindPatternRegion)
1221-
hexEdit.showStartFromSelection(true, ConfigBool("Disassembler", "FindPatternFromSelection"));
1225+
{
1226+
// Setup for current memory region
1227+
duint regionStart = DbgMemFindBaseAddr(addr, 0);
1228+
duint regionSize = 0;
1229+
DbgMemFindBaseAddr(addr, &regionSize);
1230+
duint regionEnd = regionStart + regionSize;
1231+
hexEdit.setupFindMode(regionStart, regionEnd, addr, ConfigBool("Disassembler", "FindPatternFromSelection"));
1232+
}
1233+
12221234
hexEdit.mHexEdit->setOverwriteMode(false);
12231235
hexEdit.setWindowTitle(tr("Find Pattern..."));
12241236
if(hexEdit.exec() != QDialog::Accepted)
12251237
return;
12261238

1227-
dsint addr = rvaToVa(getSelectionStart());
1228-
12291239
QString command;
12301240
if(sender() == mFindPatternRegion)
12311241
{
12321242
bool startFromSelection = hexEdit.startFromSelection();
12331243
Config()->setBool("Disassembler", "FindPatternFromSelection", startFromSelection);
1234-
if(!startFromSelection)
1235-
addr = DbgMemFindBaseAddr(addr, 0);
1236-
command = QString("findall %1, %2").arg(ToHexString(addr), hexEdit.mHexEdit->pattern());
1244+
dsint searchAddr = startFromSelection ? addr : DbgMemFindBaseAddr(addr, 0);
1245+
command = QString("findall %1, %2").arg(ToHexString(searchAddr), hexEdit.mHexEdit->pattern());
12371246
}
12381247
else if(sender() == mFindPatternModule)
12391248
{

src/gui/Src/Gui/CPUDump.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,16 +1476,23 @@ void CPUDump::findPattern()
14761476
{
14771477
HexEditDialog hexEdit(this);
14781478
hexEdit.isDataCopiable(false);
1479-
hexEdit.showStartFromSelection(true, ConfigBool("Gui", "CPUDumpStartFromSelect"));
1479+
1480+
// Setup find mode with memory region range
1481+
duint selectionStart = rvaToVa(getSelectionStart());
1482+
duint regionStart = DbgMemFindBaseAddr(selectionStart, 0);
1483+
duint regionSize = 0;
1484+
DbgMemFindBaseAddr(selectionStart, &regionSize);
1485+
duint regionEnd = regionStart + regionSize;
1486+
1487+
hexEdit.setupFindMode(regionStart, regionEnd, selectionStart, ConfigBool("Gui", "CPUDumpStartFromSelect"));
14801488
hexEdit.mHexEdit->setOverwriteMode(false);
14811489
hexEdit.setWindowTitle(tr("Find Pattern..."));
14821490
if(hexEdit.exec() != QDialog::Accepted)
14831491
return;
1492+
14841493
bool startFromSelection = hexEdit.startFromSelection();
14851494
Config()->setBool("Gui", "CPUDumpStartFromSelect", startFromSelection);
1486-
dsint addr = rvaToVa(getSelectionStart());
1487-
if(!startFromSelection)
1488-
addr = DbgMemFindBaseAddr(addr, 0);
1495+
dsint addr = startFromSelection ? selectionStart : regionStart;
14891496
QString addrText = ToPtrString(addr);
14901497
DbgCmdExec(QString("findall " + addrText + ", " + hexEdit.mHexEdit->pattern() + ", &data&"));
14911498
emit displayReferencesWidget();

src/gui/Src/Gui/CPUStack.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,17 +864,26 @@ void CPUStack::findPattern()
864864
{
865865
HexEditDialog hexEdit(this);
866866
hexEdit.isDataCopiable(false);
867-
hexEdit.showStartFromSelection(true, ConfigBool("Gui", "CPUStackStartFromSelect"));
868867
hexEdit.mHexEdit->setOverwriteMode(false);
869868
hexEdit.setWindowTitle(tr("Find Pattern..."));
869+
870+
// Setup find mode for stack
871+
duint stackBase = DbgMemFindBaseAddr(rvaToVa(getSelectionStart()), 0);
872+
duint stackSize = 0;
873+
DbgMemFindBaseAddr(rvaToVa(getSelectionStart()), &stackSize);
874+
duint stackEnd = stackBase + stackSize;
875+
duint selectionStart = rvaToVa(getSelectionStart());
876+
877+
hexEdit.setupFindMode(stackBase, stackEnd, selectionStart, ConfigBool("Gui", "CPUStackStartFromSelect"));
878+
870879
if(hexEdit.exec() != QDialog::Accepted)
871880
return;
872881

873882
dsint addr = rvaToVa(getSelectionStart());
874883
bool startFromSelection = hexEdit.startFromSelection();
875884
Config()->setBool("Gui", "CPUStackStartFromSelect", startFromSelection);
876885
if(!startFromSelection)
877-
addr = DbgMemFindBaseAddr(addr, 0);
886+
addr = stackBase;
878887

879888
QString addrText = ToPtrString(addr);
880889
DbgCmdExec(QString("findall " + addrText + ", " + hexEdit.mHexEdit->pattern() + ", &data&"));

src/gui/Src/Gui/HexEditDialog.cpp

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "Bridge.h"
99
#include "CodepageSelectionDialog.h"
1010
#include "LineEditDialog.h"
11+
#include "StringUtil.h"
1112

1213
#ifndef AF_INET6
1314
#define AF_INET6 23 // Internetwork Version 6
@@ -102,21 +103,28 @@ HexEditDialog::~HexEditDialog()
102103
delete ui;
103104
}
104105

105-
void HexEditDialog::showEntireBlock(bool show, bool checked)
106-
{
107-
ui->chkEntireBlock->setVisible(show);
108-
ui->chkEntireBlock->setChecked(checked);
109-
}
110-
111106
void HexEditDialog::showKeepSize(bool show)
112107
{
113108
ui->chkKeepSize->setVisible(show);
114109
}
115110

116-
void HexEditDialog::showStartFromSelection(bool show, bool checked)
111+
void HexEditDialog::setupFindMode(duint rangeStart, duint rangeEnd, duint selectionStart, bool startFromSelection)
117112
{
118-
ui->chkFromSelection->setVisible(show);
119-
ui->chkFromSelection->setChecked(checked);
113+
mRangeStart = rangeStart;
114+
mRangeEnd = rangeEnd;
115+
mSelectionStart = selectionStart;
116+
117+
// Only show the checkbox if selection is different from range start
118+
bool hasSelection = (selectionStart != rangeStart);
119+
ui->chkFromSelection->setVisible(hasSelection);
120+
ui->chkFromSelection->setChecked(hasSelection ? startFromSelection : false);
121+
122+
// Generate range texts using ToPtrString
123+
mSearchRangeFromStart = tr("Search range: %1 - %2").arg(ToPtrString(rangeStart)).arg(ToPtrString(rangeEnd));
124+
mSearchRangeFromSelection = tr("Search range: %1 - %2").arg(ToPtrString(selectionStart)).arg(ToPtrString(rangeEnd));
125+
126+
// Update the label
127+
updateSearchRangeLabel();
120128
}
121129

122130
void HexEditDialog::isDataCopiable(bool copyDataEnabled)
@@ -152,11 +160,6 @@ void HexEditDialog::updateCodepage(const QByteArray & name)
152160
ui->labelLastCodepage2->setText(ui->labelLastCodepage->text());
153161
}
154162

155-
bool HexEditDialog::entireBlock()
156-
{
157-
return ui->chkEntireBlock->isChecked();
158-
}
159-
160163
bool HexEditDialog::startFromSelection()
161164
{
162165
return ui->chkFromSelection->isChecked();
@@ -858,3 +861,19 @@ void HexEditDialog::on_spinBox_valueChanged(int value)
858861
mTypes[mIndex].itemsPerLine = value;
859862
printData(DataType(mIndex));
860863
}
864+
865+
void HexEditDialog::on_chkFromSelection_toggled(bool /*checked*/)
866+
{
867+
updateSearchRangeLabel();
868+
}
869+
870+
void HexEditDialog::updateSearchRangeLabel()
871+
{
872+
// Only update if we have valid range data
873+
if(mRangeStart == 0 && mRangeEnd == 0)
874+
return;
875+
876+
const QString & text = ui->chkFromSelection->isChecked() ? mSearchRangeFromSelection : mSearchRangeFromStart;
877+
if(ui->labelSearchRange)
878+
ui->labelSearchRange->setText(text);
879+
}

src/gui/Src/Gui/HexEditDialog.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <QDialog>
44
#include "QHexEdit/QHexEdit.h"
5+
#include "Bridge.h"
56

67
namespace Ui
78
{
@@ -16,13 +17,11 @@ class HexEditDialog : public QDialog
1617
explicit HexEditDialog(QWidget* parent = nullptr);
1718
~HexEditDialog();
1819

19-
void showEntireBlock(bool show, bool checked = false);
2020
void showKeepSize(bool show);
21-
void showStartFromSelection(bool show, bool checked = false);
21+
void setupFindMode(duint rangeStart, duint rangeEnd, duint selectionStart, bool startFromSelection);
2222
void isDataCopiable(bool copyDataEnabled);
2323
void updateCodepage();
2424

25-
bool entireBlock();
2625
bool startFromSelection();
2726

2827
QHexEdit* mHexEdit;
@@ -37,6 +36,7 @@ class HexEditDialog : public QDialog
3736
private slots:
3837
void updateStyle();
3938
void on_chkKeepSize_toggled(bool checked);
39+
void on_chkFromSelection_toggled(bool checked);
4040
void dataChangedSlot();
4141
void dataEditedSlot();
4242
void on_lineEditAscii_dataEdited();
@@ -48,11 +48,17 @@ private slots:
4848
private:
4949
Ui::HexEditDialog* ui;
5050
void updateCodepage(const QByteArray & name);
51+
void updateSearchRangeLabel();
5152
QTextCodec* lastCodec;
5253
QTextCodec* fallbackCodec;
5354
bool stringEditorLock;
5455

5556
bool mDataInitialized;
57+
QString mSearchRangeFromStart;
58+
QString mSearchRangeFromSelection;
59+
duint mRangeStart;
60+
duint mRangeEnd;
61+
duint mSelectionStart;
5662

5763
QByteArray resizeData(QByteArray & data);
5864
bool checkDataRepresentable(int mode); //1=ASCII, 2=Unicode, 3=User-selected codepage, 4=String editor, others(0)=All modes

0 commit comments

Comments
 (0)