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