createwalletdialog.cpp raw

   1  // Copyright (c) 2019-present 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 <bitcoin-build-config.h> // IWYU pragma: keep
   6  
   7  #include <interfaces/node.h>
   8  #include <qt/createwalletdialog.h>
   9  #include <qt/forms/ui_createwalletdialog.h>
  10  
  11  #include <qt/guiutil.h>
  12  
  13  #include <QPushButton>
  14  
  15  CreateWalletDialog::CreateWalletDialog(QWidget* parent) :
  16      QDialog(parent, GUIUtil::dialog_flags),
  17      ui(new Ui::CreateWalletDialog)
  18  {
  19      ui->setupUi(this);
  20      ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Create"));
  21      ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
  22      ui->wallet_name_line_edit->setFocus(Qt::ActiveWindowFocusReason);
  23  
  24      connect(ui->wallet_name_line_edit, &QLineEdit::textEdited, [this](const QString& text) {
  25          ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!text.isEmpty());
  26      });
  27  
  28      connect(ui->encrypt_wallet_checkbox, &QCheckBox::toggled, [this](bool checked) {
  29          // Disable the disable_privkeys_checkbox and external_signer_checkbox when isEncryptWalletChecked is
  30          // set to true, enable it when isEncryptWalletChecked is false.
  31          ui->disable_privkeys_checkbox->setEnabled(!checked);
  32  #ifdef ENABLE_EXTERNAL_SIGNER
  33          ui->external_signer_checkbox->setEnabled(m_has_signers && !checked);
  34  #endif
  35          // When the disable_privkeys_checkbox is disabled, uncheck it.
  36          if (!ui->disable_privkeys_checkbox->isEnabled()) {
  37              ui->disable_privkeys_checkbox->setChecked(false);
  38          }
  39  
  40          // When the external_signer_checkbox box is disabled, uncheck it.
  41          if (!ui->external_signer_checkbox->isEnabled()) {
  42              ui->external_signer_checkbox->setChecked(false);
  43          }
  44  
  45      });
  46  
  47      connect(ui->external_signer_checkbox, &QCheckBox::toggled, [this](bool checked) {
  48          ui->encrypt_wallet_checkbox->setEnabled(!checked);
  49          ui->blank_wallet_checkbox->setEnabled(!checked);
  50          ui->disable_privkeys_checkbox->setEnabled(!checked);
  51  
  52          // The external signer checkbox is only enabled when a device is detected.
  53          // In that case it is checked by default. Toggling it restores the other
  54          // options to their default.
  55          ui->encrypt_wallet_checkbox->setChecked(false);
  56          ui->disable_privkeys_checkbox->setChecked(checked);
  57          ui->blank_wallet_checkbox->setChecked(false);
  58      });
  59  
  60      connect(ui->disable_privkeys_checkbox, &QCheckBox::toggled, [this](bool checked) {
  61          // Disable the encrypt_wallet_checkbox when isDisablePrivateKeysChecked is
  62          // set to true, enable it when isDisablePrivateKeysChecked is false.
  63          ui->encrypt_wallet_checkbox->setEnabled(!checked);
  64  
  65          // Wallets without private keys cannot set blank
  66          ui->blank_wallet_checkbox->setEnabled(!checked);
  67          if (checked) {
  68              ui->blank_wallet_checkbox->setChecked(false);
  69          }
  70  
  71          // When the encrypt_wallet_checkbox is disabled, uncheck it.
  72          if (!ui->encrypt_wallet_checkbox->isEnabled()) {
  73              ui->encrypt_wallet_checkbox->setChecked(false);
  74          }
  75      });
  76  
  77      connect(ui->blank_wallet_checkbox, &QCheckBox::toggled, [this](bool checked) {
  78          // Disable the disable_privkeys_checkbox when blank_wallet_checkbox is checked
  79          // as blank-ness only pertains to wallets with private keys.
  80          ui->disable_privkeys_checkbox->setEnabled(!checked);
  81          if (checked) {
  82              ui->disable_privkeys_checkbox->setChecked(false);
  83          }
  84      });
  85  
  86  #ifndef ENABLE_EXTERNAL_SIGNER
  87          //: "External signing" means using devices such as hardware wallets.
  88          ui->external_signer_checkbox->setToolTip(tr("Compiled without external signing support (required for external signing)"));
  89          ui->external_signer_checkbox->setEnabled(false);
  90          ui->external_signer_checkbox->setChecked(false);
  91  #endif
  92  
  93  }
  94  
  95  CreateWalletDialog::~CreateWalletDialog()
  96  {
  97      delete ui;
  98  }
  99  
 100  void CreateWalletDialog::setSigners(const std::vector<std::unique_ptr<interfaces::ExternalSigner>>& signers)
 101  {
 102      m_has_signers = !signers.empty();
 103      if (m_has_signers) {
 104          ui->external_signer_checkbox->setEnabled(true);
 105          ui->external_signer_checkbox->setChecked(true);
 106          ui->encrypt_wallet_checkbox->setEnabled(false);
 107          ui->encrypt_wallet_checkbox->setChecked(false);
 108          // The order matters, because connect() is called when toggling a checkbox:
 109          ui->blank_wallet_checkbox->setEnabled(false);
 110          ui->blank_wallet_checkbox->setChecked(false);
 111          ui->disable_privkeys_checkbox->setEnabled(false);
 112          ui->disable_privkeys_checkbox->setChecked(true);
 113          const std::string label = signers[0]->getName();
 114          ui->wallet_name_line_edit->setText(QString::fromStdString(label));
 115          ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
 116      } else {
 117          ui->external_signer_checkbox->setEnabled(false);
 118      }
 119  }
 120  
 121  QString CreateWalletDialog::walletName() const
 122  {
 123      return ui->wallet_name_line_edit->text();
 124  }
 125  
 126  bool CreateWalletDialog::isEncryptWalletChecked() const
 127  {
 128      return ui->encrypt_wallet_checkbox->isChecked();
 129  }
 130  
 131  bool CreateWalletDialog::isDisablePrivateKeysChecked() const
 132  {
 133      return ui->disable_privkeys_checkbox->isChecked();
 134  }
 135  
 136  bool CreateWalletDialog::isMakeBlankWalletChecked() const
 137  {
 138      return ui->blank_wallet_checkbox->isChecked();
 139  }
 140  
 141  bool CreateWalletDialog::isExternalSignerChecked() const
 142  {
 143      return ui->external_signer_checkbox->isChecked();
 144  }
 145