createwalletdialog.cpp
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 }