Skip to content

Commit e0a0b28

Browse files
committed
GUI: Support returning positions from BitcoinAddress{Entry,Check}Validator::validate
1 parent d85563e commit e0a0b28

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

src/qt/bitcoinaddressvalidator.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
#include <key_io.h>
88

9+
#include <vector>
10+
911
/* Base58 characters are:
1012
"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
1113
@@ -20,10 +22,8 @@ BitcoinAddressEntryValidator::BitcoinAddressEntryValidator(QObject *parent) :
2022
{
2123
}
2224

23-
QValidator::State BitcoinAddressEntryValidator::validate(QString &input, int &pos) const
25+
QValidator::State BitcoinAddressEntryValidator::validate(QString &input, std::vector<int>&error_locations) const
2426
{
25-
Q_UNUSED(pos);
26-
2727
// Empty address is "intermediate" input
2828
if (input.isEmpty())
2929
return QValidator::Intermediate;
@@ -73,23 +73,33 @@ QValidator::State BitcoinAddressEntryValidator::validate(QString &input, int &po
7373
}
7474
else
7575
{
76+
error_locations.push_back(idx);
7677
state = QValidator::Invalid;
7778
}
7879
}
7980

8081
return state;
8182
}
8283

84+
QValidator::State BitcoinAddressEntryValidator::validate(QString &input, int &pos) const
85+
{
86+
std::vector<int> error_locations;
87+
const auto ret = validate(input, error_locations);
88+
if (!error_locations.empty()) pos = error_locations.at(0);
89+
return ret;
90+
}
91+
8392
BitcoinAddressCheckValidator::BitcoinAddressCheckValidator(QObject *parent) :
84-
QValidator(parent)
93+
BitcoinAddressEntryValidator(parent)
8594
{
8695
}
8796

88-
QValidator::State BitcoinAddressCheckValidator::validate(QString &input, int &pos) const
97+
QValidator::State BitcoinAddressCheckValidator::validate(QString &input, std::vector<int>&error_locations) const
8998
{
90-
Q_UNUSED(pos);
9199
// Validate the passed Bitcoin address
92-
if (IsValidDestinationString(input.toStdString())) {
100+
std::string error_msg;
101+
CTxDestination dest = DecodeDestination(input.toStdString(), error_msg, &error_locations);
102+
if (IsValidDestination(dest)) {
93103
return QValidator::Acceptable;
94104
}
95105

src/qt/bitcoinaddressvalidator.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#include <QValidator>
99

10+
#include <vector>
11+
1012
/** Base58 entry widget validator, checks for valid characters and
1113
* removes some whitespace.
1214
*/
@@ -17,19 +19,20 @@ class BitcoinAddressEntryValidator : public QValidator
1719
public:
1820
explicit BitcoinAddressEntryValidator(QObject *parent);
1921

20-
State validate(QString &input, int &pos) const override;
22+
virtual State validate(QString &input, std::vector<int>&error_locations) const;
23+
virtual State validate(QString &input, int &pos) const override;
2124
};
2225

2326
/** Bitcoin address widget validator, checks for a valid bitcoin address.
2427
*/
25-
class BitcoinAddressCheckValidator : public QValidator
28+
class BitcoinAddressCheckValidator : public BitcoinAddressEntryValidator
2629
{
2730
Q_OBJECT
2831

2932
public:
3033
explicit BitcoinAddressCheckValidator(QObject *parent);
3134

32-
State validate(QString &input, int &pos) const override;
35+
State validate(QString &input, std::vector<int>&error_locations) const override;
3336
};
3437

3538
#endif // BITCOIN_QT_BITCOINADDRESSVALIDATOR_H

0 commit comments

Comments
 (0)