createwalletdialog.cpp raw

   1  // Copyright (c) 2019-2021 The Limenka 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 <limenka-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          ui->descriptor_checkbox->setEnabled(!checked);
  52  
  53          // The external signer checkbox is only enabled when a device is detected.
  54          // In that case it is checked by default. Toggling it restores the other
  55          // options to their default.
  56          ui->descriptor_checkbox->setChecked(checked);
  57          ui->encrypt_wallet_checkbox->setChecked(false);
  58          ui->disable_privkeys_checkbox->setChecked(checked);
  59          ui->blank_wallet_checkbox->setChecked(false);
  60      });
  61  
  62      connect(ui->disable_privkeys_checkbox, &QCheckBox::toggled, [this](bool checked) {
  63          // Disable the encrypt_wallet_checkbox when isDisablePrivateKeysChecked is
  64          // set to true, enable it when isDisablePrivateKeysChecked is false.
  65          ui->encrypt_wallet_checkbox->setEnabled(!checked);
  66  
  67          // Wallets without private keys cannot set blank
  68          ui->blank_wallet_checkbox->setEnabled(!checked);
  69          if (checked) {
  70              ui->blank_wallet_checkbox->setChecked(false);
  71          }
  72  
  73          // When the encrypt_wallet_checkbox is disabled, uncheck it.
  74          if (!ui->encrypt_wallet_checkbox->isEnabled()) {
  75              ui->encrypt_wallet_checkbox->setChecked(false);
  76          }
  77      });
  78  
  79      connect(ui->blank_wallet_checkbox, &QCheckBox::toggled, [this](bool checked) {
  80          // Disable the disable_privkeys_checkbox when blank_wallet_checkbox is checked
  81          // as blank-ness only pertains to wallets with private keys.
  82          ui->disable_privkeys_checkbox->setEnabled(!checked);
  83          if (checked) {
  84              ui->disable_privkeys_checkbox->setChecked(false);
  85          }
  86      });
  87  
  88  #ifndef USE_SQLITE
  89          ui->descriptor_checkbox->setToolTip(tr("Compiled without sqlite support (required for descriptor wallets)"));
  90          ui->descriptor_checkbox->setEnabled(false);
  91          ui->descriptor_checkbox->setChecked(false);
  92          ui->external_signer_checkbox->setEnabled(false);
  93          ui->external_signer_checkbox->setChecked(false);
  94  #endif
  95  
  96  #ifndef USE_BDB
  97          ui->descriptor_checkbox->setEnabled(false);
  98          ui->descriptor_checkbox->setChecked(true);
  99  #endif
 100  
 101  #ifndef ENABLE_EXTERNAL_SIGNER
 102          //: "External signing" means using devices such as hardware wallets.
 103          ui->external_signer_checkbox->setToolTip(tr("Compiled without external signing support (required for external signing)"));
 104          ui->external_signer_checkbox->setEnabled(false);
 105          ui->external_signer_checkbox->setChecked(false);
 106  #endif
 107  
 108  }
 109  
 110  CreateWalletDialog::~CreateWalletDialog()
 111  {
 112      delete ui;
 113  }
 114  
 115  void CreateWalletDialog::setSigners(const std::vector<std::unique_ptr<interfaces::ExternalSigner>>& signers)
 116  {
 117      m_has_signers = !signers.empty();
 118      if (m_has_signers) {
 119          ui->external_signer_checkbox->setEnabled(true);
 120          ui->external_signer_checkbox->setChecked(true);
 121          ui->encrypt_wallet_checkbox->setEnabled(false);
 122          ui->encrypt_wallet_checkbox->setChecked(false);
 123          // The order matters, because connect() is called when toggling a checkbox:
 124          ui->blank_wallet_checkbox->setEnabled(false);
 125          ui->blank_wallet_checkbox->setChecked(false);
 126          ui->disable_privkeys_checkbox->setEnabled(false);
 127          ui->disable_privkeys_checkbox->setChecked(true);
 128          const std::string label = signers[0]->getName();
 129          ui->wallet_name_line_edit->setText(QString::fromStdString(label));
 130          ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
 131      } else {
 132          ui->external_signer_checkbox->setEnabled(false);
 133      }
 134  }
 135  
 136  QString CreateWalletDialog::walletName() const
 137  {
 138      return ui->wallet_name_line_edit->text();
 139  }
 140  
 141  bool CreateWalletDialog::isEncryptWalletChecked() const
 142  {
 143      return ui->encrypt_wallet_checkbox->isChecked();
 144  }
 145  
 146  bool CreateWalletDialog::isDisablePrivateKeysChecked() const
 147  {
 148      return ui->disable_privkeys_checkbox->isChecked();
 149  }
 150  
 151  bool CreateWalletDialog::isMakeBlankWalletChecked() const
 152  {
 153      return ui->blank_wallet_checkbox->isChecked();
 154  }
 155  
 156  bool CreateWalletDialog::isDescriptorWalletChecked() const
 157  {
 158      return ui->descriptor_checkbox->isChecked();
 159  }
 160  
 161  bool CreateWalletDialog::isExternalSignerChecked() const
 162  {
 163      return ui->external_signer_checkbox->isChecked();
 164  }
 165