16 #include <QFileDialog>
17 #include <QMessageBox>
20 static const uint64_t GB_BYTES = 1000000000LL;
22 static const uint64_t BLOCK_CHAIN_SIZE = 2;
24 static const uint64_t TESTNET_BLOCK_CHAIN_SIZE = 1;
26 static uint64_t requiredSpace;
54 void reply(
int status,
const QString& message, quint64 available);
71 uint64_t freeBytesAvailable = 0;
72 int replyStatus =
ST_OK;
73 QString replyMessage = tr(
"A new data directory will be created.");
76 fs::path parentDir = dataDir;
77 fs::path parentDirOld = fs::path();
78 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)) {
91 if (fs::is_directory(dataDir)) {
92 QString separator =
"<code>" + QDir::toNativeSeparators(
"/") + tr(
"name") +
"</code>";
94 replyMessage = tr(
"Directory already exists. Add %1 if you intend to create a new directory here.").arg(separator);
97 replyMessage = tr(
"Path already exists, and is not a directory.");
100 }
catch (
const fs::filesystem_error& e) {
103 replyMessage = tr(
"Cannot create data directory here.");
105 Q_EMIT
reply(replyStatus, replyMessage, freeBytesAvailable);
109 Intro::Intro(QWidget* parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint),
115 ui->sizeWarningLabel->setText(
ui->sizeWarningLabel->text().arg(requiredSpace));
129 return ui->dataDirectory->text();
134 ui->dataDirectory->setText(dataDir);
136 ui->dataDirDefault->setChecked(
true);
137 ui->dataDirectory->setEnabled(
false);
138 ui->ellipsisButton->setEnabled(
false);
140 ui->dataDirCustom->setChecked(
true);
141 ui->dataDirectory->setEnabled(
true);
142 ui->ellipsisButton->setEnabled(
true);
156 if (!
GetArg(
"-datadir",
"").empty())
161 dataDir = settings.value(
"strDataDir", dataDir).toString();
166 requiredSpace = TESTNET_BLOCK_CHAIN_SIZE;
170 requiredSpace = BLOCK_CHAIN_SIZE;
174 intro.setWindowIcon(QIcon(
":icons/bitcoin"));
185 }
catch (
const fs::filesystem_error& e) {
186 QMessageBox::critical(0, tr(
"PRCY"),
187 tr(
"Error: Specified data directory \"%1\" cannot be created.").arg(dataDir));
192 settings.setValue(
"strDataDir", dataDir);
207 ui->errorMessage->setText(message);
208 ui->errorMessage->setStyleSheet(
"");
211 ui->errorMessage->setText(tr(
"Error") +
": " + message);
212 ui->errorMessage->setStyleSheet(
"QLabel { color: #800000 }");
217 ui->freeSpace->setText(
"");
219 QString freeString = tr(
"%1 GB of free space available").arg(bytesAvailable / GB_BYTES);
220 if (bytesAvailable < requiredSpace * GB_BYTES) {
221 freeString +=
" " + tr(
"(of %1 GB needed)").arg(requiredSpace);
222 ui->freeSpace->setStyleSheet(
"QLabel { color: #800000 }");
224 ui->freeSpace->setStyleSheet(
"");
226 ui->freeSpace->setText(freeString +
".");
235 ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
false);
241 QString dir = QDir::toNativeSeparators(QFileDialog::getExistingDirectory(0,
"Choose data directory",
ui->dataDirectory->text()));
243 ui->dataDirectory->setText(dir);
253 ui->dataDirectory->setEnabled(
true);
254 ui->ellipsisButton->setEnabled(
true);
259 thread =
new QThread(
this);
261 executor->moveToThread(
thread);
263 connect(executor, SIGNAL(reply(
int, QString, quint64)),
this, SLOT(
setStatus(
int, QString, quint64)));
264 connect(
this, SIGNAL(
requestCheck()), executor, SLOT(check()));
266 connect(
this, SIGNAL(
stopThread()), executor, SLOT(deleteLater()));