Changeset View
Changeset View
Standalone View
Standalone View
src/qt/bitcoinamountfield.cpp
Show All 38 Lines | QValidator::State validate(QString &text, int &pos) const override { | ||||
parse(text, &valid); | parse(text, &valid); | ||||
// Make sure we return Intermediate so that fixup() is called on | // Make sure we return Intermediate so that fixup() is called on | ||||
// defocus. | // defocus. | ||||
return valid ? QValidator::Intermediate : QValidator::Invalid; | return valid ? QValidator::Intermediate : QValidator::Invalid; | ||||
} | } | ||||
void fixup(QString &input) const override { | void fixup(QString &input) const override { | ||||
bool valid = false; | bool valid = false; | ||||
CAmount val = parse(input, &valid); | Amount val = parse(input, &valid); | ||||
if (valid) { | if (valid) { | ||||
input = BitcoinUnits::format(currentUnit, val, false, | input = BitcoinUnits::format(currentUnit, val, false, | ||||
BitcoinUnits::separatorAlways); | BitcoinUnits::separatorAlways); | ||||
lineEdit()->setText(input); | lineEdit()->setText(input); | ||||
} | } | ||||
} | } | ||||
CAmount value(bool *valid_out = 0) const { | Amount value(bool *valid_out = 0) const { return parse(text(), valid_out); } | ||||
return parse(text(), valid_out); | |||||
} | |||||
void setValue(const CAmount &value) { | void setValue(const Amount value) { | ||||
lineEdit()->setText(BitcoinUnits::format( | lineEdit()->setText(BitcoinUnits::format( | ||||
currentUnit, value, false, BitcoinUnits::separatorAlways)); | currentUnit, value, false, BitcoinUnits::separatorAlways)); | ||||
Q_EMIT valueChanged(); | Q_EMIT valueChanged(); | ||||
} | } | ||||
void stepBy(int steps) override { | void stepBy(int steps) override { | ||||
bool valid = false; | bool valid = false; | ||||
Amount val(value(&valid)); | Amount val = value(&valid); | ||||
val = val + steps * singleStep; | val = val + steps * singleStep; | ||||
val = qMin(qMax(val, Amount(0)), BitcoinUnits::maxMoney()); | val = qMin(qMax(val, Amount(0)), BitcoinUnits::maxMoney()); | ||||
setValue(val.GetSatoshis()); | setValue(val); | ||||
} | } | ||||
void setDisplayUnit(int unit) { | void setDisplayUnit(int unit) { | ||||
bool valid = false; | bool valid = false; | ||||
Amount val(value(&valid)); | Amount val(value(&valid)); | ||||
currentUnit = unit; | currentUnit = unit; | ||||
if (valid) { | if (valid) { | ||||
setValue(val.GetSatoshis()); | setValue(val.GetSatoshis()); | ||||
} else { | } else { | ||||
clear(); | clear(); | ||||
} | } | ||||
} | } | ||||
void setSingleStep(const CAmount &step) { singleStep = step; } | void setSingleStep(const Amount step) { singleStep = step; } | ||||
QSize minimumSizeHint() const override { | QSize minimumSizeHint() const override { | ||||
if (cachedMinimumSizeHint.isEmpty()) { | if (cachedMinimumSizeHint.isEmpty()) { | ||||
ensurePolished(); | ensurePolished(); | ||||
const QFontMetrics fm(fontMetrics()); | const QFontMetrics fm(fontMetrics()); | ||||
int h = lineEdit()->minimumSizeHint().height(); | int h = lineEdit()->minimumSizeHint().height(); | ||||
int w = fm.width(BitcoinUnits::format( | int w = fm.width(BitcoinUnits::format( | ||||
Show All 29 Lines | QSize minimumSizeHint() const override { | ||||
->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this) | ->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this) | ||||
.expandedTo(QApplication::globalStrut()); | .expandedTo(QApplication::globalStrut()); | ||||
} | } | ||||
return cachedMinimumSizeHint; | return cachedMinimumSizeHint; | ||||
} | } | ||||
private: | private: | ||||
int currentUnit; | int currentUnit; | ||||
CAmount singleStep; | Amount singleStep; | ||||
mutable QSize cachedMinimumSizeHint; | mutable QSize cachedMinimumSizeHint; | ||||
/** | /** | ||||
* Parse a string into a number of base monetary units and | * Parse a string into a number of base monetary units and | ||||
* return validity. | * return validity. | ||||
* @note Must return 0 if !valid. | * @note Must return 0 if !valid. | ||||
*/ | */ | ||||
CAmount parse(const QString &text, bool *valid_out = 0) const { | Amount parse(const QString &text, bool *valid_out = 0) const { | ||||
Amount val = 0; | Amount val = 0; | ||||
bool valid = BitcoinUnits::parse(currentUnit, text, &val); | bool valid = BitcoinUnits::parse(currentUnit, text, &val); | ||||
if (valid) { | if (valid) { | ||||
if (val < Amount(0) || val > BitcoinUnits::maxMoney()) { | if (val < Amount(0) || val > BitcoinUnits::maxMoney()) { | ||||
valid = false; | valid = false; | ||||
} | } | ||||
} | } | ||||
if (valid_out) { | if (valid_out) { | ||||
Show All 25 Lines | StepEnabled stepEnabled() const override { | ||||
} | } | ||||
if (text().isEmpty()) { | if (text().isEmpty()) { | ||||
// Allow step-up with empty field. | // Allow step-up with empty field. | ||||
return StepUpEnabled; | return StepUpEnabled; | ||||
} | } | ||||
StepEnabled rv = 0; | StepEnabled rv = 0; | ||||
bool valid = false; | bool valid = false; | ||||
CAmount val = value(&valid); | Amount val = value(&valid); | ||||
if (valid) { | if (valid) { | ||||
if (val > 0) { | if (val > 0) { | ||||
rv |= StepDownEnabled; | rv |= StepDownEnabled; | ||||
} | } | ||||
if (val < BitcoinUnits::maxMoney()) { | if (val < BitcoinUnits::maxMoney()) { | ||||
rv |= StepUpEnabled; | rv |= StepUpEnabled; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
QWidget *BitcoinAmountField::setupTabChain(QWidget *prev) { | QWidget *BitcoinAmountField::setupTabChain(QWidget *prev) { | ||||
QWidget::setTabOrder(prev, amount); | QWidget::setTabOrder(prev, amount); | ||||
QWidget::setTabOrder(amount, unit); | QWidget::setTabOrder(amount, unit); | ||||
return unit; | return unit; | ||||
} | } | ||||
CAmount BitcoinAmountField::value(bool *valid_out) const { | Amount BitcoinAmountField::value(bool *valid_out) const { | ||||
return amount->value(valid_out); | return amount->value(valid_out); | ||||
} | } | ||||
void BitcoinAmountField::setValue(const CAmount &value) { | void BitcoinAmountField::setValue(const Amount value) { | ||||
amount->setValue(value); | amount->setValue(value); | ||||
} | } | ||||
void BitcoinAmountField::setReadOnly(bool fReadOnly) { | void BitcoinAmountField::setReadOnly(bool fReadOnly) { | ||||
amount->setReadOnly(fReadOnly); | amount->setReadOnly(fReadOnly); | ||||
} | } | ||||
void BitcoinAmountField::unitChanged(int idx) { | void BitcoinAmountField::unitChanged(int idx) { | ||||
// Use description tooltip for current unit for the combobox | // Use description tooltip for current unit for the combobox | ||||
unit->setToolTip(unit->itemData(idx, Qt::ToolTipRole).toString()); | unit->setToolTip(unit->itemData(idx, Qt::ToolTipRole).toString()); | ||||
// Determine new unit ID | // Determine new unit ID | ||||
int newUnit = unit->itemData(idx, BitcoinUnits::UnitRole).toInt(); | int newUnit = unit->itemData(idx, BitcoinUnits::UnitRole).toInt(); | ||||
amount->setDisplayUnit(newUnit); | amount->setDisplayUnit(newUnit); | ||||
} | } | ||||
void BitcoinAmountField::setDisplayUnit(int newUnit) { | void BitcoinAmountField::setDisplayUnit(int newUnit) { | ||||
unit->setValue(newUnit); | unit->setValue(newUnit); | ||||
} | } | ||||
void BitcoinAmountField::setSingleStep(const CAmount &step) { | void BitcoinAmountField::setSingleStep(const Amount step) { | ||||
amount->setSingleStep(step); | amount->setSingleStep(step); | ||||
} | } |