7 #if defined(HAVE_CONFIG_H)
20 #include <QFileDialog>
21 #include <QMessageBox>
24 static const uint64_t GB_BYTES = 1000000000LL;
26 static const uint64_t BLOCK_CHAIN_SIZE = 25;
28 static const uint64_t TESTNET_BLOCK_CHAIN_SIZE = 1;
30 static uint64_t requiredSpace;
58 void reply(
int status,
const QString& message, quint64 available);
75 uint64_t freeBytesAvailable = 0;
76 int replyStatus =
ST_OK;
77 QString replyMessage = tr(
"A new data directory will be created.");
80 fs::path parentDir = dataDir;
81 fs::path parentDirOld = fs::path();
82 while (parentDir.has_parent_path() && !fs::exists(parentDir)) {
83 parentDir = parentDir.parent_path();
86 if (parentDirOld == parentDir)
89 parentDirOld = parentDir;
93 freeBytesAvailable = fs::space(parentDir).available;
94 if (fs::exists(dataDir)) {
95 if (fs::is_directory(dataDir)) {
96 QString separator =
"<code>" + QDir::toNativeSeparators(
"/") + tr(
"name") +
"</code>";
98 replyMessage = tr(
"Directory already exists. Add %1 if you intend to create a new directory here.").arg(separator);
101 replyMessage = tr(
"Path already exists, and is not a directory.");
104 }
catch (
const fs::filesystem_error& e) {
107 replyMessage = tr(
"Cannot create data directory here.");
109 Q_EMIT
reply(replyStatus, replyMessage, freeBytesAvailable);
113 Intro::Intro(QWidget* parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint),
132 ui->dataDirectory->setAttribute(Qt::WA_MacShowFocusRect, 0);
137 connect(
ui->pushButtonOk, &QPushButton::clicked,
this, &Intro::accept);
138 connect(
ui->pushButtonCancel, &QPushButton::clicked,
this, &Intro::close);
142 ui->sizeWarningLabel->setText(
ui->sizeWarningLabel->text().arg(
PACKAGE_NAME).arg(requiredSpace));
156 return ui->dataDirectory->text();
161 ui->dataDirectory->setText(dataDir);
163 ui->dataDirDefault->setChecked(
true);
164 ui->dataDirectory->setEnabled(
false);
165 ui->ellipsisButton->setEnabled(
false);
168 ui->dataDirCustom->setChecked(
true);
169 ui->dataDirectory->setEnabled(
true);
170 ui->ellipsisButton->setEnabled(
true);
190 dataDir =
settings.value(
"strDataDir", dataDir).toString();
196 requiredSpace = TESTNET_BLOCK_CHAIN_SIZE;
200 requiredSpace = BLOCK_CHAIN_SIZE;
204 intro.setWindowIcon(QIcon(
":icons/bitcoin"));
218 }
catch (
const fs::filesystem_error& e) {
220 tr(
"Error: Specified data directory \"%1\" cannot be created.").arg(dataDir));
225 settings.setValue(
"strDataDir", dataDir);
242 ui->errorMessage->setText(message);
243 ui->errorMessage->setStyleSheet(
"");
246 ui->errorMessage->setText(tr(
"Error") +
": " + message);
247 ui->errorMessage->setStyleSheet(
"QLabel { color: #f84444 }");
252 ui->freeSpace->setText(
"");
254 QString freeString = tr(
"%1 GB of free space available").arg(bytesAvailable / GB_BYTES);
255 if (bytesAvailable < requiredSpace * GB_BYTES) {
256 freeString +=
" " + tr(
"(of %1 GB needed)").arg(requiredSpace);
257 ui->freeSpace->setStyleSheet(
"QLabel { color: #800000 }");
259 ui->freeSpace->setStyleSheet(
"");
261 ui->freeSpace->setText(freeString +
".");
279 ui->pushButtonOk->setEnabled(
false);
285 QString dir = QDir::toNativeSeparators(QFileDialog::getExistingDirectory(0,
"Choose data directory",
ui->dataDirectory->text()));
287 ui->dataDirectory->setText(dir);
298 ui->dataDirectory->setEnabled(
true);
299 ui->ellipsisButton->setEnabled(
true);
305 thread =
new QThread(
this);
307 executor->moveToThread(
thread);
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Set an argument if it doesn't already have a value.
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
FreespaceChecker(Intro *intro)
void reply(int status, const QString &message, quint64 available)
Introduction screen (pre-GUI startup).
void setStatus(int status, const QString &message, quint64 bytesAvailable)
void on_ellipsisButton_clicked()
void setDataDirectory(const QString &dataDir)
static bool pickDataDirectory()
Determine data directory.
friend class FreespaceChecker
void on_dataDirectory_textChanged(const QString &arg1)
void updateDataDirStatus(bool enabled)
static QString getDefaultDataDirectory()
Determine default data directory for operating system.
QString getDataDirectory()
void checkPath(const QString &dataDir)
void on_dataDirDefault_clicked()
void on_dataDirCustom_clicked()
fs::path qstringToBoostPath(const QString &path)
QString loadStyleSheet()
Load global CSS theme.
QString boostPathToQString(const fs::path &path)
void setCssProperty(std::initializer_list< QWidget * > args, const QString &value)
void setCssBtnPrimary(QPushButton *btn, bool forceUpdate)
void setCssBtnSecondary(QPushButton *btn, bool forceUpdate)
fs::path GetDefaultDataDir()
bool TryCreateDirectories(const fs::path &p)
Ignores exceptions thrown by Boost's create_directories if the requested directory exists.