Skip to content

Commit 4eb0fb6

Browse files
committed
GUI: autocompletion works much nicer now
x64dbg#1738
1 parent c3dae65 commit 4eb0fb6

11 files changed

+22
-10
lines changed

src/gui/Src/BasicView/HistoryLineEdit.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ void HistoryLineEdit::keyPressEvent(QKeyEvent* event)
9292
// NOTE: "Unlike textChanged(), this signal [textEdited()] is not emitted when
9393
// the text is changed programmatically, for example, by calling setText()."
9494
setText(newText);
95+
emit textEdited(newText);
9596
}
9697

9798
QLineEdit::keyPressEvent(event);

src/gui/Src/Gui/CalculatorDialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void CalculatorDialog::validateExpression(QString expression)
3838
void CalculatorDialog::showEvent(QShowEvent* event)
3939
{
4040
Q_UNUSED(event);
41-
mValidateThread->start(ui->txtExpression->text());
41+
mValidateThread->start();
4242
}
4343

4444
void CalculatorDialog::hideEvent(QHideEvent* event)

src/gui/Src/Gui/DisassemblerGraphView.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,6 +1885,7 @@ void DisassemblerGraphView::gotoExpressionSlot()
18851885
return;
18861886
if(!mGoto)
18871887
mGoto = new GotoDialog(this);
1888+
mGoto->setInitialExpression(ToPtrString(this->cur_instr));
18881889
if(mGoto->exec() == QDialog::Accepted)
18891890
{
18901891
duint value = DbgValFromString(mGoto->expressionText.toUtf8().constData());

src/gui/Src/Gui/GotoDialog.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ GotoDialog::GotoDialog(QWidget* parent, bool allowInvalidExpression, bool allowI
2727
completer = new QCompleter(this);
2828
completer->setModel(new SymbolAutoCompleteModel([this]
2929
{
30-
return ui->editExpression->text();
30+
return mCompletionText;
3131
}, completer));
3232
if(!Config()->getBool("Gui", "DisableAutoComplete"))
3333
ui->editExpression->setCompleter(completer);
@@ -39,6 +39,7 @@ GotoDialog::GotoDialog(QWidget* parent, bool allowInvalidExpression, bool allowI
3939

4040
connect(mValidateThread, SIGNAL(expressionChanged(bool, bool, dsint)), this, SLOT(expressionChanged(bool, bool, dsint)));
4141
connect(ui->editExpression, SIGNAL(textChanged(QString)), mValidateThread, SLOT(textChanged(QString)));
42+
connect(ui->editExpression, SIGNAL(textEdited(QString)), this, SLOT(textEditedSlot(QString)));
4243
connect(this, SIGNAL(finished(int)), this, SLOT(finishedSlot(int)));
4344
connect(Config(), SIGNAL(disableAutoCompleteUpdated()), this, SLOT(disableAutoCompleteUpdated()));
4445

@@ -78,7 +79,7 @@ void GotoDialog::validateExpression(QString expression)
7879
void GotoDialog::setInitialExpression(const QString & expression)
7980
{
8081
ui->editExpression->setText(expression);
81-
validateExpression(expression);
82+
emit ui->editExpression->textEdited(expression);
8283
}
8384

8485
void GotoDialog::expressionChanged(bool validExpression, bool validPointer, dsint value)
@@ -186,6 +187,11 @@ void GotoDialog::finishedSlot(int result)
186187
ui->editExpression->setFocus();
187188
}
188189

190+
void GotoDialog::textEditedSlot(QString text)
191+
{
192+
mCompletionText = text;
193+
}
194+
189195
void GotoDialog::disableAutoCompleteUpdated()
190196
{
191197
if(Config()->getBool("Gui", "DisableAutoComplete"))

src/gui/Src/Gui/GotoDialog.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ private slots:
3636
void disableAutoCompleteUpdated();
3737
void on_buttonOk_clicked();
3838
void finishedSlot(int result);
39+
void textEditedSlot(QString text);
3940

4041
private:
4142
Ui::GotoDialog* ui;
4243
ValidateExpressionThread* mValidateThread;
4344
QCompleter* completer;
4445
bool IsValidMemoryRange(duint addr);
4546
void setOkEnabled(bool enabled);
47+
QString mCompletionText;
4648
};
4749

4850
#endif // GOTODIALOG_H

src/gui/Src/Gui/MemoryMapView.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ void MemoryMapView::gotoExpressionSlot()
635635
if(!mGoto)
636636
mGoto = new GotoDialog(this);
637637
mGoto->setWindowTitle(tr("Enter the address to find..."));
638+
mGoto->setInitialExpression(ToPtrString(duint(getCellContent(getInitialSelection(), 0).toULongLong(nullptr, 16))));
638639
if(mGoto->exec() == QDialog::Accepted)
639640
{
640641
selectAddress(DbgValFromString(mGoto->expressionText.toUtf8().constData()));

src/gui/Src/Gui/WordEditDialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ WordEditDialog::~WordEditDialog()
4747
void WordEditDialog::showEvent(QShowEvent* event)
4848
{
4949
Q_UNUSED(event);
50-
mValidateThread->start(ui->expressionLineEdit->text());
50+
mValidateThread->start();
5151
}
5252

5353
void WordEditDialog::hideEvent(QHideEvent* event)

src/gui/Src/Tracer/TraceBrowser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ void TraceBrowser::gotoSlot()
949949
{
950950
if(mTraceFile == nullptr || mTraceFile->Progress() < 100)
951951
return;
952-
GotoDialog gotoDlg(this, false, true); // Problem: Cannot use when not debugging
952+
GotoDialog gotoDlg(this, false, true); // TODO: Cannot use when not debugging
953953
if(gotoDlg.exec() == QDialog::Accepted)
954954
{
955955
auto val = DbgValFromString(gotoDlg.expressionText.toUtf8().constData());

src/gui/Src/Utils/SymbolAutoCompleteModel.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
#include "MiscUtil.h"
33
#include "Configuration.h"
44

5-
SymbolAutoCompleteModel::SymbolAutoCompleteModel(std::function<QString()> getTextProc, QObject* parent) : QAbstractItemModel(parent), mGetTextProc(getTextProc), isValidReg("[\\w_@][\\w\\d_]*")
5+
SymbolAutoCompleteModel::SymbolAutoCompleteModel(std::function<QString()> getTextProc, QObject* parent)
6+
: QAbstractItemModel(parent),
7+
mGetTextProc(getTextProc),
8+
isValidReg("[\\w_@][\\w\\d_]*")
69
{
710
lastAutocompleteCount = 0;
811
disableAutoCompleteUpdated();

src/gui/Src/Utils/ValidateExpressionThread.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ ValidateExpressionThread::ValidateExpressionThread(QObject* parent) : QThread(pa
55
this->mOnExpressionChangedCallback = nullptr;
66
}
77

8-
void ValidateExpressionThread::start(QString initialValue)
8+
void ValidateExpressionThread::start()
99
{
1010
mStopThread = false;
1111
QThread::start();
12-
textChanged(initialValue);
1312
}
1413

1514
void ValidateExpressionThread::stop()
@@ -43,7 +42,6 @@ void ValidateExpressionThread::additionalStateChanged()
4342
mExpressionMutex.lock();
4443
mExpressionChanged = true;
4544
mExpressionMutex.unlock();
46-
4745
}
4846

4947
void ValidateExpressionThread::setOnExpressionChangedCallback(EXPRESSIONCHANGEDCB callback)

src/gui/Src/Utils/ValidateExpressionThread.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ValidateExpressionThread : public QThread
1313
Q_OBJECT
1414
public:
1515
ValidateExpressionThread(QObject* parent = 0);
16-
void start(QString initialValue = QString());
16+
void start();
1717
void stop();
1818
void emitExpressionChanged(bool validExpression, bool validPointer, dsint value);
1919
void emitInstructionChanged(dsint sizeDifference, QString error);

0 commit comments

Comments
 (0)