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