/ src / qt / qvalidatedlineedit.cpp
qvalidatedlineedit.cpp
  1  // Copyright (c) 2011-2022 The Bitcoin Core developers
  2  // Distributed under the MIT software license, see the accompanying
  3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  4  
  5  #include <qt/qvalidatedlineedit.h>
  6  
  7  #include <qt/bitcoinaddressvalidator.h>
  8  #include <qt/guiconstants.h>
  9  
 10  QValidatedLineEdit::QValidatedLineEdit(QWidget* parent)
 11      : QLineEdit(parent)
 12  {
 13      connect(this, &QValidatedLineEdit::textChanged, this, &QValidatedLineEdit::markValid);
 14  }
 15  
 16  void QValidatedLineEdit::setText(const QString& text)
 17  {
 18      QLineEdit::setText(text);
 19      checkValidity();
 20  }
 21  
 22  void QValidatedLineEdit::setValid(bool _valid)
 23  {
 24      if(_valid == this->valid)
 25      {
 26          return;
 27      }
 28  
 29      if(_valid)
 30      {
 31          setStyleSheet("");
 32      }
 33      else
 34      {
 35          setStyleSheet("QValidatedLineEdit { " STYLE_INVALID "}");
 36      }
 37      this->valid = _valid;
 38  }
 39  
 40  void QValidatedLineEdit::focusInEvent(QFocusEvent *evt)
 41  {
 42      // Clear invalid flag on focus
 43      setValid(true);
 44  
 45      QLineEdit::focusInEvent(evt);
 46  }
 47  
 48  void QValidatedLineEdit::focusOutEvent(QFocusEvent *evt)
 49  {
 50      checkValidity();
 51  
 52      QLineEdit::focusOutEvent(evt);
 53  }
 54  
 55  void QValidatedLineEdit::markValid()
 56  {
 57      // As long as a user is typing ensure we display state as valid
 58      setValid(true);
 59  }
 60  
 61  void QValidatedLineEdit::clear()
 62  {
 63      setValid(true);
 64      QLineEdit::clear();
 65  }
 66  
 67  void QValidatedLineEdit::setEnabled(bool enabled)
 68  {
 69      if (!enabled)
 70      {
 71          // A disabled QValidatedLineEdit should be marked valid
 72          setValid(true);
 73      }
 74      else
 75      {
 76          // Recheck validity when QValidatedLineEdit gets enabled
 77          checkValidity();
 78      }
 79  
 80      QLineEdit::setEnabled(enabled);
 81  }
 82  
 83  void QValidatedLineEdit::checkValidity()
 84  {
 85      if (text().isEmpty())
 86      {
 87          setValid(true);
 88      }
 89      else if (hasAcceptableInput())
 90      {
 91          setValid(true);
 92  
 93          // Check contents on focus out
 94          if (checkValidator)
 95          {
 96              QString address = text();
 97              int pos = 0;
 98              if (checkValidator->validate(address, pos) == QValidator::Acceptable)
 99                  setValid(true);
100              else
101                  setValid(false);
102          }
103      }
104      else
105          setValid(false);
106  
107      Q_EMIT validationDidChange(this);
108  }
109  
110  void QValidatedLineEdit::setCheckValidator(const QValidator *v)
111  {
112      checkValidator = v;
113      checkValidity();
114  }
115  
116  bool QValidatedLineEdit::isValid()
117  {
118      // use checkValidator in case the QValidatedLineEdit is disabled
119      if (checkValidator)
120      {
121          QString address = text();
122          int pos = 0;
123          if (checkValidator->validate(address, pos) == QValidator::Acceptable)
124              return true;
125      }
126  
127      return valid;
128  }