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,10 +67,68 @@ MainWindow::MainWindow(QWidget *parent) :
rpc->refresh(); rpc->refresh();
} }
void MainWindow::setupTurnstileDialog() { void MainWindow::turnstileProgress() {
Ui_TurnstileProgress progress;
QDialog d(this);
progress.setupUi(&d);
// Turnstile migration QIcon icon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning);
QObject::connect(ui->actionTurnstile_Migration, &QAction::triggered, [=] () { 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; Ui_Turnstile turnstile;
QDialog d(this); QDialog d(this);
turnstile.setupUi(&d); turnstile.setupUi(&d);
@@ -89,7 +147,7 @@ void MainWindow::setupTurnstileDialog() {
return bal; return bal;
}; };
turnstile.migrateZaddList->addItem("All Sprout z-Addrs"); //turnstile.migrateZaddList->addItem("All Sprout z-Addrs");
turnstile.fromBalance->setText(Settings::getInstance()->getZECUSDDisplayFormat(fnGetAllSproutBalance())); turnstile.fromBalance->setText(Settings::getInstance()->getZECUSDDisplayFormat(fnGetAllSproutBalance()));
for (auto addr : *rpc->getAllZAddresses()) { for (auto addr : *rpc->getAllZAddresses()) {
if (Settings::getInstance()->isSaplingAddress(addr)) { if (Settings::getInstance()->isSaplingAddress(addr)) {
@@ -141,55 +199,18 @@ void MainWindow::setupTurnstileDialog() {
"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.", "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); QMessageBox::Ok);
} }
}
void MainWindow::setupTurnstileDialog() {
// Turnstile migration
QObject::connect(ui->actionTurnstile_Migration, &QAction::triggered, [=] () {
// If there is current migration that is present, show the progress button
if (rpc->getTurnstile()->isMigrationPresent())
turnstileProgress();
else
turnstileDoMigration();
}); });
// 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));