5 #if defined(HAVE_CONFIG_H)
12 #include <qt/forms/ui_intro.h>
21 #include <QFileDialog>
23 #include <QMessageBox>
53 void reply(
int status,
const QString &message, quint64 available);
59 #include <qt/intro.moc>
70 uint64_t freeBytesAvailable = 0;
71 int replyStatus =
ST_OK;
72 QString replyMessage = tr(
"A new data directory will be created.");
75 fs::path parentDir = dataDir;
76 fs::path parentDirOld = fs::path();
77 while(parentDir.has_parent_path() && !fs::exists(parentDir))
79 parentDir = parentDir.parent_path();
82 if (parentDirOld == parentDir)
85 parentDirOld = parentDir;
89 freeBytesAvailable = fs::space(parentDir).available;
90 if(fs::exists(dataDir))
92 if(fs::is_directory(dataDir))
94 QString separator =
"<code>" + QDir::toNativeSeparators(
"/") + tr(
"name") +
"</code>";
96 replyMessage = tr(
"Directory already exists. Add %1 if you intend to create a new directory here.").arg(separator);
99 replyMessage = tr(
"Path already exists, and is not a directory.");
102 }
catch (
const fs::filesystem_error&)
106 replyMessage = tr(
"Cannot create data directory here.");
108 Q_EMIT
reply(replyStatus, replyMessage, freeBytesAvailable);
113 int GetPruneTargetGB()
115 int64_t prune_target_mib =
gArgs.
GetArg(
"-prune", 0);
121 Intro::Intro(QWidget *parent, int64_t blockchain_size_gb, int64_t chain_state_size_gb) :
126 m_blockchain_size_gb(blockchain_size_gb),
127 m_chain_state_size_gb(chain_state_size_gb),
128 m_prune_target_gb{GetPruneTargetGB()}
131 ui->welcomeLabel->setText(ui->welcomeLabel->text().arg(
PACKAGE_NAME));
132 ui->storageLabel->setText(ui->storageLabel->text().arg(
PACKAGE_NAME));
134 ui->lblExplanation1->setText(ui->lblExplanation1->text()
136 .arg(m_blockchain_size_gb)
140 ui->lblExplanation2->setText(ui->lblExplanation2->text().arg(
PACKAGE_NAME));
143 ui->prune->setChecked(
true);
144 ui->prune->setEnabled(
false);
146 ui->prune->setText(tr(
"Discard blocks after verification, except most recent %1 GB (prune)").arg(m_prune_target_gb));
147 UpdatePruneLabels(ui->prune->isChecked());
149 connect(ui->prune, &QCheckBox::toggled, [
this](
bool prune_checked) {
150 UpdatePruneLabels(prune_checked);
151 UpdateFreeSpaceLabel();
167 return ui->dataDirectory->text();
172 ui->dataDirectory->setText(dataDir);
175 ui->dataDirDefault->setChecked(
true);
176 ui->dataDirectory->setEnabled(
false);
177 ui->ellipsisButton->setEnabled(
false);
179 ui->dataDirCustom->setChecked(
true);
180 ui->dataDirectory->setEnabled(
true);
181 ui->ellipsisButton->setEnabled(
true);
187 did_show_intro =
false;
197 dataDir = settings.value(
"strDataDir", dataDir).toString();
204 }
catch (
const std::exception&) {
209 Intro intro(0,
Params().AssumedBlockchainSize(),
Params().AssumedChainStateSize());
211 intro.setWindowIcon(QIcon(
":icons/bitcoin"));
212 did_show_intro =
true;
228 }
catch (
const fs::filesystem_error&) {
230 tr(
"Error: Specified data directory \"%1\" cannot be created.").arg(dataDir));
236 prune = intro.
ui->prune->isChecked();
238 settings.setValue(
"strDataDir", dataDir);
239 settings.setValue(
"fReset",
false);
256 ui->errorMessage->setText(message);
257 ui->errorMessage->setStyleSheet(
"");
260 ui->errorMessage->setText(tr(
"Error") +
": " + message);
261 ui->errorMessage->setStyleSheet(
"QLabel { color: #800000 }");
267 ui->freeSpace->setText(
"");
270 if (
ui->prune->isEnabled()) {
284 ui->freeSpace->setStyleSheet(
"QLabel { color: #800000 }");
287 ui->freeSpace->setStyleSheet(
"QLabel { color: #999900 }");
289 ui->freeSpace->setStyleSheet(
"");
291 ui->freeSpace->setText(freeString +
".");
297 ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
false);
303 QString dir = QDir::toNativeSeparators(QFileDialog::getExistingDirectory(
nullptr,
"Choose data directory",
ui->dataDirectory->text()));
305 ui->dataDirectory->setText(dir);
315 ui->dataDirectory->setEnabled(
true);
316 ui->ellipsisButton->setEnabled(
true);
321 thread =
new QThread(
this);
323 executor->moveToThread(
thread);
328 connect(
thread, &QThread::finished, executor, &QObject::deleteLater);
358 QString storageRequiresMsg = tr(
"At least %1 GB of data will be stored in this directory, and it will grow over time.");
361 storageRequiresMsg = tr(
"Approximately %1 GB of data will be stored in this directory.");
363 ui->lblExplanation3->setVisible(prune_checked);
364 ui->sizeWarningLabel->setText(
365 tr(
"%1 will download and store a copy of the Bitcoin block chain.").arg(
PACKAGE_NAME) +
" " +
367 tr(
"The wallet will also be stored in this directory.")
static const bool DEFAULT_CHOOSE_DATADIR
static constexpr int DEFAULT_PRUNE_TARGET_GB
void reply(int status, const QString &message, quint64 available)
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
bool TryCreateDirectories(const fs::path &p)
Ignores exceptions thrown by Boost's create_directories if the requested directory exists...
void on_dataDirCustom_clicked()
int64_t m_required_space_gb
Total required space (in GB) depending on user choice (prune or not prune).
FreespaceChecker(Intro *intro)
void UpdatePruneLabels(bool prune_checked)
QString getDataDirectory()
static constexpr uint64_t GB_BYTES
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Set an argument if it doesn't already have a value.
void on_dataDirectory_textChanged(const QString &arg1)
void setStatus(int status, const QString &message, quint64 bytesAvailable)
void checkPath(const QString &dataDir)
void on_ellipsisButton_clicked()
void SelectParams(const std::string &network)
Sets the params returned by Params() to those for the given chain name.
void on_dataDirDefault_clicked()
static int PruneMiBtoGB(int64_t mib)
Convert configured prune target MiB to displayed GB.
void UpdateFreeSpaceLabel()
const int64_t m_blockchain_size_gb
friend class FreespaceChecker
void setDataDirectory(const QString &dataDir)
fs::path qstringToBoostPath(const QString &path)
const CChainParams & Params()
Return the currently selected parameters.
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
static bool showIfNeeded(bool &did_show_intro, bool &prune)
Determine data directory.
const int64_t m_chain_state_size_gb
std::string GetChainName() const
Returns the appropriate chain name from the program arguments.
QString getDefaultDataDirectory()
Determine default data directory for operating system.
const int64_t m_prune_target_gb
Introduction screen (pre-GUI startup).
uint64_t m_bytes_available
Intro(QWidget *parent=nullptr, int64_t blockchain_size_gb=0, int64_t chain_state_size_gb=0)