Merge UI elements for migration

This commit is contained in:
Aditya Kulkarni
2018-10-26 11:58:51 -07:00
parent 7f6c0db7d7
commit 8094a4dcc8
8 changed files with 157 additions and 135 deletions

View File

@@ -67,129 +67,150 @@ MainWindow::MainWindow(QWidget *parent) :
rpc->refresh(); rpc->refresh();
} }
void MainWindow::setupTurnstileDialog() { void MainWindow::turnstileProgress() {
Ui_TurnstileProgress progress;
QDialog d(this);
progress.setupUi(&d);
QIcon icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning);
progress.msgIcon->setPixmap(icon.pixmap(64, 64));
progress.buttonBox->button(QDialogButtonBox::Cancel)->setText("Abort");
auto fnUpdateProgressUI = [=] () {
// Get the plan progress
if (rpc->getTurnstile()->isMigrationPresent()) {
auto curProgress = rpc->getTurnstile()->getPlanProgress();
progress.progressTxt->setText(QString::number(curProgress.step) % QString(" / ") % QString::number(curProgress.totalSteps));
progress.progressBar->setValue(100 * curProgress.step / curProgress.totalSteps);
auto nextTxBlock = curProgress.nextBlock - Settings::getInstance()->getBlockNumber();
if (curProgress.step == curProgress.totalSteps) {
auto txt = QString("Turnstile migration finished");
if (curProgress.hasErrors) {
txt = txt + ". There were some errors.\n\nYour funds are all in your wallet, so you should be able to finish moving them manually.";
}
progress.nextTx->setText(txt);
} else {
progress.nextTx->setText(QString("Next transaction in ")
% QString::number(nextTxBlock < 0 ? 0 : nextTxBlock)
% " blocks\n"
% (nextTxBlock <= 0 ? "(waiting for confirmations)" : ""));
}
} else {
progress.progressTxt->setText("");
progress.progressBar->setValue(0);
progress.nextTx->setText("No turnstile migration is in progress");
}
};
QTimer progressTimer(this);
QObject::connect(&progressTimer, &QTimer::timeout, fnUpdateProgressUI);
progressTimer.start(Utils::updateSpeed);
fnUpdateProgressUI();
auto accpeted = d.exec();
auto curProgress = rpc->getTurnstile()->getPlanProgress();
if (accpeted == QDialog::Accepted && curProgress.step == curProgress.totalSteps) {
// Finished, so delete the file
rpc->getTurnstile()->removeFile();
}
if (accpeted == QDialog::Rejected && curProgress.step != curProgress.totalSteps) {
auto abort = QMessageBox::warning(this, "Are you sure you want to Abort?",
"Are you sure you want to abort the migration?\nAll further transactions will be cancelled.\nAll your funds are still in your wallet.",
QMessageBox::Yes, QMessageBox::No);
if (abort) {
rpc->getTurnstile()->removeFile();
}
}
}
void MainWindow::turnstileDoMigration() {
Ui_Turnstile turnstile;
QDialog d(this);
turnstile.setupUi(&d);
QIcon icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation);
turnstile.msgIcon->setPixmap(icon.pixmap(64, 64));
auto fnGetAllSproutBalance = [=] () {
double bal = 0;
for (auto addr : *rpc->getAllZAddresses()) {
if (Settings::getInstance()->isSproutAddress(addr)) {
bal += rpc->getAllBalances()->value(addr);
}
}
return bal;
};
//turnstile.migrateZaddList->addItem("All Sprout z-Addrs");
turnstile.fromBalance->setText(Settings::getInstance()->getZECUSDDisplayFormat(fnGetAllSproutBalance()));
for (auto addr : *rpc->getAllZAddresses()) {
if (Settings::getInstance()->isSaplingAddress(addr)) {
turnstile.migrateTo->addItem(addr);
} else {
if (rpc->getAllBalances()->value(addr) > 0)
turnstile.migrateZaddList->addItem(addr);
}
}
QObject::connect(turnstile.migrateZaddList, &QComboBox::currentTextChanged, [=] (auto addr) {
double bal = 0;
if (addr.startsWith("All")) {
bal = fnGetAllSproutBalance();
} else {
bal = rpc->getAllBalances()->value(addr);
}
turnstile.fromBalance->setText(Settings::getInstance()->getZECUSDDisplayFormat(bal));
});
// Privacy level combobox
// Num tx over num blocks
QList<QPair<int, int>> privOptions;
privOptions.push_back(QPair<double, double>(3, 3));
privOptions.push_back(QPair<double, double>(5, 5));
privOptions.push_back(QPair<double, double>(10, 7));
QObject::connect(turnstile.privLevel, QOverload<int>::of(&QComboBox::currentIndexChanged), [=] (auto idx) {
// Update the fees
turnstile.minerFee->setText(
Settings::getInstance()->getZECUSDDisplayFormat(privOptions[idx].first * Utils::getMinerFee()));
});
turnstile.privLevel->addItem("Good - 3 tx over 3 blocks");
turnstile.privLevel->addItem("Excellent - 5 tx over 5 blocks");
turnstile.privLevel->addItem("Paranoid - 10 tx over 7 blocks");
turnstile.buttonBox->button(QDialogButtonBox::Ok)->setText("Start");
if (d.exec() == QDialog::Accepted) {
auto privLevel = privOptions[turnstile.privLevel->currentIndex()];
rpc->getTurnstile()->planMigration(
turnstile.migrateZaddList->currentText(),
turnstile.migrateTo->currentText(),
privLevel.first, privLevel.second);
QMessageBox::information(this, "Backup your wallet.dat",
"The migration will now start. You can check progress in the File -> Turnstile Migration menu.\n\nYOU MUST BACKUP YOUR wallet.dat NOW!.\n\nNew Addresses have been added to your wallet which will be used for the migration.",
QMessageBox::Ok);
}
}
void MainWindow::setupTurnstileDialog() {
// Turnstile migration // Turnstile migration
QObject::connect(ui->actionTurnstile_Migration, &QAction::triggered, [=] () { QObject::connect(ui->actionTurnstile_Migration, &QAction::triggered, [=] () {
Ui_Turnstile turnstile; // If there is current migration that is present, show the progress button
QDialog d(this); if (rpc->getTurnstile()->isMigrationPresent())
turnstile.setupUi(&d); turnstileProgress();
else
QIcon icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation); turnstileDoMigration();
turnstile.msgIcon->setPixmap(icon.pixmap(64, 64));
auto fnGetAllSproutBalance = [=] () {
double bal = 0;
for (auto addr : *rpc->getAllZAddresses()) {
if (Settings::getInstance()->isSproutAddress(addr)) {
bal += rpc->getAllBalances()->value(addr);
}
}
return bal;
};
turnstile.migrateZaddList->addItem("All Sprout z-Addrs");
turnstile.fromBalance->setText(Settings::getInstance()->getZECUSDDisplayFormat(fnGetAllSproutBalance()));
for (auto addr : *rpc->getAllZAddresses()) {
if (Settings::getInstance()->isSaplingAddress(addr)) {
turnstile.migrateTo->addItem(addr);
} else {
if (rpc->getAllBalances()->value(addr) > 0)
turnstile.migrateZaddList->addItem(addr);
}
}
QObject::connect(turnstile.migrateZaddList, &QComboBox::currentTextChanged, [=] (auto addr) {
double bal = 0;
if (addr.startsWith("All")) {
bal = fnGetAllSproutBalance();
} else {
bal = rpc->getAllBalances()->value(addr);
}
turnstile.fromBalance->setText(Settings::getInstance()->getZECUSDDisplayFormat(bal));
});
// Privacy level combobox
// Num tx over num blocks
QList<QPair<int, int>> privOptions;
privOptions.push_back(QPair<double, double>(3, 3));
privOptions.push_back(QPair<double, double>(5, 5));
privOptions.push_back(QPair<double, double>(10, 7));
QObject::connect(turnstile.privLevel, QOverload<int>::of(&QComboBox::currentIndexChanged), [=] (auto idx) {
// Update the fees
turnstile.minerFee->setText(
Settings::getInstance()->getZECUSDDisplayFormat(privOptions[idx].first * Utils::getMinerFee()));
});
turnstile.privLevel->addItem("Good - 3 tx over 3 blocks");
turnstile.privLevel->addItem("Excellent - 5 tx over 5 blocks");
turnstile.privLevel->addItem("Paranoid - 10 tx over 7 blocks");
turnstile.buttonBox->button(QDialogButtonBox::Ok)->setText("Start");
if (d.exec() == QDialog::Accepted) {
auto privLevel = privOptions[turnstile.privLevel->currentIndex()];
rpc->getTurnstile()->planMigration(
turnstile.migrateZaddList->currentText(),
turnstile.migrateTo->currentText(),
privLevel.first, privLevel.second);
QMessageBox::information(this, "Backup your wallet.dat",
"The migration will now start. You can check progress in the File -> Turnstile Migration menu.\n\nYOU MUST BACKUP YOUR wallet.dat NOW!.\n\nNew Addresses have been added to your wallet which will be used for the migration.",
QMessageBox::Ok);
}
}); });
// Progress update button
QObject::connect(ui->actionProgress, &QAction::triggered, [=] () {
Ui_TurnstileProgress progress;
QDialog d(this);
progress.setupUi(&d);
QIcon icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning);
progress.msgIcon->setPixmap(icon.pixmap(64, 64));
progress.buttonBox->button(QDialogButtonBox::Cancel)->setText("Abort");
auto fnUpdateProgressUI = [=] () {
// Get the plan progress
if (rpc->getTurnstile()->isMigrationActive()) {
auto curProgress = rpc->getTurnstile()->getPlanProgress();
progress.progressTxt->setText(QString::number(curProgress.step) % QString(" / ") % QString::number(curProgress.totalSteps));
progress.progressBar->setValue(100 * curProgress.step / curProgress.totalSteps);
auto nextTxBlock = curProgress.nextBlock - Settings::getInstance()->getBlockNumber();
if (curProgress.step == curProgress.totalSteps) {
auto txt = QString("Turnstile migration finished");
if (curProgress.hasErrors) {
txt = txt + ". There were some errors.\n\nYour funds are all in your wallet, so you should be able to finish moving them manually.";
}
progress.nextTx->setText(txt);
} else {
progress.nextTx->setText(QString("Next transaction in ")
% QString::number(nextTxBlock < 0 ? 0 : nextTxBlock)
% " blocks");
}
} else {
progress.progressTxt->setText("");
progress.progressBar->setValue(0);
progress.nextTx->setText("No turnstile migration is in progress");
}
};
QTimer progressTimer(this);
QObject::connect(&progressTimer, &QTimer::timeout, fnUpdateProgressUI);
progressTimer.start(Utils::updateSpeed);
fnUpdateProgressUI();
d.exec();
});
} }
void MainWindow::setupStatusBar() { void MainWindow::setupStatusBar() {

View File

@@ -58,6 +58,9 @@ private:
Tx createTxFromSendPage(); Tx createTxFromSendPage();
bool confirmTx(Tx tx, ToFields devFee); bool confirmTx(Tx tx, ToFields devFee);
void turnstileDoMigration();
void turnstileProgress();
void cancelButton(); void cancelButton();
void sendButton(); void sendButton();
void inputComboTextChanged(const QString& text); void inputComboTextChanged(const QString& text);

View File

@@ -724,7 +724,6 @@
</property> </property>
<addaction name="actionImport_Private_Keys"/> <addaction name="actionImport_Private_Keys"/>
<addaction name="actionTurnstile_Migration"/> <addaction name="actionTurnstile_Migration"/>
<addaction name="actionProgress"/>
<addaction name="actionSettings"/> <addaction name="actionSettings"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionExit"/> <addaction name="actionExit"/>
@@ -779,11 +778,6 @@
<string>Turnstile Migration</string> <string>Turnstile Migration</string>
</property> </property>
</action> </action>
<action name="actionProgress">
<property name="text">
<string>Progress</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<tabstops> <tabstops>

View File

@@ -37,6 +37,10 @@ QString Turnstile::writeableFile() {
} }
} }
void Turnstile::removeFile() {
QFile(writeableFile()).remove();
}
// Data stream write/read methods for migration items // Data stream write/read methods for migration items
QDataStream &operator<<(QDataStream& ds, const TurnstileMigrationItem& item) { QDataStream &operator<<(QDataStream& ds, const TurnstileMigrationItem& item) {
return ds << QString("v1") << item.fromAddr << item.intTAddr return ds << QString("v1") << item.fromAddr << item.intTAddr
@@ -210,7 +214,7 @@ Turnstile::getNextStep(QList<TurnstileMigrationItem>& plan) {
return nextStep; return nextStep;
} }
bool Turnstile::isMigrationActive() { bool Turnstile::isMigrationPresent() {
auto plan = readMigrationPlan(); auto plan = readMigrationPlan();
if (plan.isEmpty()) return false; if (plan.isEmpty()) return false;
@@ -222,7 +226,11 @@ ProgressReport Turnstile::getPlanProgress() {
auto nextStep = getNextStep(plan); auto nextStep = getNextStep(plan);
auto step = std::distance(plan.begin(), nextStep); auto step = std::distance(plan.begin(), nextStep) * 2; // 2 steps per item
if (nextStep != plan.end() &&
nextStep->status == TurnstileMigrationItemStatus::SentToT)
step++;
auto total = plan.size(); auto total = plan.size();
auto nextBlock = nextStep == plan.end() ? 0 : nextStep->blockNumber; auto nextBlock = nextStep == plan.end() ? 0 : nextStep->blockNumber;
@@ -232,7 +240,7 @@ ProgressReport Turnstile::getPlanProgress() {
i.status == TurnstileMigrationItemStatus::UnknownError; i.status == TurnstileMigrationItemStatus::UnknownError;
}) != plan.end(); }) != plan.end();
return ProgressReport{(int)step*2, total*2, nextBlock, hasErrors}; return ProgressReport{(int)step, total*2, nextBlock, hasErrors};
} }
void Turnstile::executeMigrationStep() { void Turnstile::executeMigrationStep() {

View File

@@ -42,10 +42,11 @@ public:
QList<TurnstileMigrationItem> readMigrationPlan(); QList<TurnstileMigrationItem> readMigrationPlan();
void writeMigrationPlan(QList<TurnstileMigrationItem> plan); void writeMigrationPlan(QList<TurnstileMigrationItem> plan);
void removeFile();
void executeMigrationStep(); void executeMigrationStep();
ProgressReport getPlanProgress(); ProgressReport getPlanProgress();
bool isMigrationActive(); bool isMigrationPresent();
private: private:
QList<int> getBlockNumbers(int start, int end, int count); QList<int> getBlockNumbers(int start, int end, int count);

View File

@@ -11,7 +11,7 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Dialog</string> <string>Turnstile Migration Progress</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="3" column="0" colspan="3"> <item row="3" column="0" colspan="3">

View File

@@ -48,7 +48,6 @@ public:
QAction *actionImport_Private_Keys; QAction *actionImport_Private_Keys;
QAction *actionCheck_for_Updates; QAction *actionCheck_for_Updates;
QAction *actionTurnstile_Migration; QAction *actionTurnstile_Migration;
QAction *actionProgress;
QWidget *centralWidget; QWidget *centralWidget;
QGridLayout *gridLayout_3; QGridLayout *gridLayout_3;
QTabWidget *tabWidget; QTabWidget *tabWidget;
@@ -163,8 +162,6 @@ public:
actionCheck_for_Updates->setObjectName(QStringLiteral("actionCheck_for_Updates")); actionCheck_for_Updates->setObjectName(QStringLiteral("actionCheck_for_Updates"));
actionTurnstile_Migration = new QAction(MainWindow); actionTurnstile_Migration = new QAction(MainWindow);
actionTurnstile_Migration->setObjectName(QStringLiteral("actionTurnstile_Migration")); actionTurnstile_Migration->setObjectName(QStringLiteral("actionTurnstile_Migration"));
actionProgress = new QAction(MainWindow);
actionProgress->setObjectName(QStringLiteral("actionProgress"));
centralWidget = new QWidget(MainWindow); centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QStringLiteral("centralWidget")); centralWidget->setObjectName(QStringLiteral("centralWidget"));
gridLayout_3 = new QGridLayout(centralWidget); gridLayout_3 = new QGridLayout(centralWidget);
@@ -674,7 +671,6 @@ public:
menuBar->addAction(menuHelp->menuAction()); menuBar->addAction(menuHelp->menuAction());
menuBalance->addAction(actionImport_Private_Keys); menuBalance->addAction(actionImport_Private_Keys);
menuBalance->addAction(actionTurnstile_Migration); menuBalance->addAction(actionTurnstile_Migration);
menuBalance->addAction(actionProgress);
menuBalance->addAction(actionSettings); menuBalance->addAction(actionSettings);
menuBalance->addSeparator(); menuBalance->addSeparator();
menuBalance->addAction(actionExit); menuBalance->addAction(actionExit);
@@ -700,7 +696,6 @@ public:
actionImport_Private_Keys->setText(QApplication::translate("MainWindow", "Import Private Keys", nullptr)); actionImport_Private_Keys->setText(QApplication::translate("MainWindow", "Import Private Keys", nullptr));
actionCheck_for_Updates->setText(QApplication::translate("MainWindow", "Check github.com for Updates", nullptr)); actionCheck_for_Updates->setText(QApplication::translate("MainWindow", "Check github.com for Updates", nullptr));
actionTurnstile_Migration->setText(QApplication::translate("MainWindow", "Turnstile Migration", nullptr)); actionTurnstile_Migration->setText(QApplication::translate("MainWindow", "Turnstile Migration", nullptr));
actionProgress->setText(QApplication::translate("MainWindow", "Progress", nullptr));
groupBox->setTitle(QApplication::translate("MainWindow", "Summary", nullptr)); groupBox->setTitle(QApplication::translate("MainWindow", "Summary", nullptr));
label->setText(QApplication::translate("MainWindow", "Shielded", nullptr)); label->setText(QApplication::translate("MainWindow", "Shielded", nullptr));
balSheilded->setText(QString()); balSheilded->setText(QString());

View File

@@ -122,7 +122,7 @@ public:
void retranslateUi(QDialog *TurnstileProgress) void retranslateUi(QDialog *TurnstileProgress)
{ {
TurnstileProgress->setWindowTitle(QApplication::translate("TurnstileProgress", "Dialog", nullptr)); TurnstileProgress->setWindowTitle(QApplication::translate("TurnstileProgress", "Turnstile Migration Progress", nullptr));
label_4->setText(QApplication::translate("TurnstileProgress", "Please Ensure you have your wallet.dat backed up!", nullptr)); label_4->setText(QApplication::translate("TurnstileProgress", "Please Ensure you have your wallet.dat backed up!", nullptr));
nextTx->setText(QApplication::translate("TurnstileProgress", "Next Transaction in 4 hours", nullptr)); nextTx->setText(QApplication::translate("TurnstileProgress", "Next Transaction in 4 hours", nullptr));
progressTxt->setText(QApplication::translate("TurnstileProgress", "4 / 12", nullptr)); progressTxt->setText(QApplication::translate("TurnstileProgress", "4 / 12", nullptr));