Skip to content

Commit

Permalink
gui: Add Wallet Restore in the GUI
Browse files Browse the repository at this point in the history
Co-authored-by: Shashwat Vangani <[email protected]>
  • Loading branch information
w0xlt and shaavan committed Apr 12, 2022
1 parent 2b5a741 commit e681634
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/qt/bitcoingui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include <QDateTime>
#include <QDragEnterEvent>
#include <QKeySequence>
#include <QInputDialog>
#include <QListWidget>
#include <QMenu>
#include <QMenuBar>
Expand Down Expand Up @@ -347,6 +348,12 @@ void BitcoinGUI::createActions()
m_create_wallet_action->setEnabled(false);
m_create_wallet_action->setStatusTip(tr("Create a new wallet"));

//: Name of the menu item that restores wallet from a backup file.
m_restore_wallet_action = new QAction(tr("Restore Wallet…"), this);
m_restore_wallet_action->setEnabled(false);
//: Status tip for Restore Wallet menu item
m_restore_wallet_action->setStatusTip(tr("Restore a wallet from a backup file"));

m_close_all_wallets_action = new QAction(tr("Close All Wallets…"), this);
m_close_all_wallets_action->setStatusTip(tr("Close all wallets"));

Expand Down Expand Up @@ -411,6 +418,25 @@ void BitcoinGUI::createActions()
action->setEnabled(false);
}
});
connect(m_restore_wallet_action, &QAction::triggered, [this] {
QString backup_file = GUIUtil::getOpenFileName(this,
//: The title for Restore Wallet File Windows
tr("Load Wallet Backup"), QString(),
//: The file extension for Restore Wallet File Windows
tr("Wallet Data File (*.dat)"), nullptr);
if (backup_file.isEmpty()) return;

bool walletNameOk;
//: Title of the Restore Wallet input dialog (where the wallet name is entered)
QString walletName = QInputDialog::getText(this, tr("Restore Name"), tr("Wallet Name:"), QLineEdit::Normal, "", &walletNameOk);
if (!walletNameOk || walletName.isEmpty()) return;

auto activity = new RestoreWalletActivity(m_wallet_controller, this);
connect(activity, &RestoreWalletActivity::restored, this, &BitcoinGUI::setCurrentWallet);

auto backup_file_path = fs::PathFromString(backup_file.toStdString());
activity->restore(backup_file_path, walletName.toStdString());
});
connect(m_close_wallet_action, &QAction::triggered, [this] {
m_wallet_controller->closeWallet(walletFrame->currentWalletModel(), this);
});
Expand Down Expand Up @@ -446,6 +472,7 @@ void BitcoinGUI::createMenuBar()
{
file->addAction(m_create_wallet_action);
file->addAction(m_open_wallet_action);
file->addAction(m_restore_wallet_action);
file->addAction(m_close_wallet_action);
file->addAction(m_close_all_wallets_action);
file->addSeparator();
Expand Down Expand Up @@ -641,6 +668,7 @@ void BitcoinGUI::setWalletController(WalletController* wallet_controller)
m_create_wallet_action->setEnabled(true);
m_open_wallet_action->setEnabled(true);
m_open_wallet_action->setMenu(m_open_wallet_menu);
m_restore_wallet_action->setEnabled(true);

GUIUtil::ExceptionSafeConnect(wallet_controller, &WalletController::walletAdded, this, &BitcoinGUI::addWallet);
connect(wallet_controller, &WalletController::walletRemoved, this, &BitcoinGUI::removeWallet);
Expand Down
1 change: 1 addition & 0 deletions src/qt/bitcoingui.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ class BitcoinGUI : public QMainWindow
QAction* m_create_wallet_action{nullptr};
QAction* m_open_wallet_action{nullptr};
QMenu* m_open_wallet_menu{nullptr};
QAction* m_restore_wallet_action{nullptr};
QAction* m_close_wallet_action{nullptr};
QAction* m_close_all_wallets_action{nullptr};
QAction* m_wallet_selector_label_action = nullptr;
Expand Down
43 changes: 43 additions & 0 deletions src/qt/walletcontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,3 +372,46 @@ void LoadWalletsActivity::load()
QTimer::singleShot(0, this, [this] { Q_EMIT finished(); });
});
}

RestoreWalletActivity::RestoreWalletActivity(WalletController* wallet_controller, QWidget* parent_widget)
: WalletControllerActivity(wallet_controller, parent_widget)
{
}

void RestoreWalletActivity::restore(const fs::path& backup_file, const std::string& wallet_name)
{
QString name = QString::fromStdString(wallet_name);

showProgressDialog(
//: Title of progress window which is displayed when wallets are being restored.
tr("Restore Wallet"),
/*: Descriptive text of the restore wallets progress window which indicates to
the user that wallets are currently being restored.*/
tr("Restoring Wallet <b>%1</b>…").arg(name.toHtmlEscaped()));

QTimer::singleShot(0, worker(), [this, backup_file, wallet_name] {
std::unique_ptr<interfaces::Wallet> wallet = node().walletLoader().restoreWallet(backup_file, wallet_name, m_error_message, m_warning_message);

if (wallet) m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(wallet));

QTimer::singleShot(0, this, &RestoreWalletActivity::finish);
});
}

void RestoreWalletActivity::finish()
{
if (!m_error_message.empty()) {
//: Title of message box which is displayed when the wallet could not be restored.
QMessageBox::critical(m_parent_widget, tr("Restore wallet failed"), QString::fromStdString(m_error_message.translated));
} else if (!m_warning_message.empty()) {
//: Title of message box which is displayed when the wallet is restored with some warning.
QMessageBox::warning(m_parent_widget, tr("Restore wallet warning"), QString::fromStdString(Join(m_warning_message, Untranslated("\n")).translated));
} else {
//: Title of message box which is displayed when the wallet is successfully restored.
QMessageBox::information(m_parent_widget, tr("Restore wallet message"), QString::fromStdString(Untranslated("Wallet restored successfully \n").translated));
}

if (m_wallet_model) Q_EMIT restored(m_wallet_model);

Q_EMIT finished();
}
17 changes: 17 additions & 0 deletions src/qt/walletcontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#ifndef BITCOIN_QT_WALLETCONTROLLER_H
#define BITCOIN_QT_WALLETCONTROLLER_H

#include <fs.h>
#include <qt/sendcoinsrecipient.h>
#include <support/allocators/secure.h>
#include <sync.h>
Expand Down Expand Up @@ -155,4 +156,20 @@ class LoadWalletsActivity : public WalletControllerActivity
void load();
};

class RestoreWalletActivity : public WalletControllerActivity
{
Q_OBJECT

public:
RestoreWalletActivity(WalletController* wallet_controller, QWidget* parent_widget);

void restore(const fs::path& backup_file, const std::string& wallet_name);

Q_SIGNALS:
void restored(WalletModel* wallet_model);

private:
void finish();
};

#endif // BITCOIN_QT_WALLETCONTROLLER_H

0 comments on commit e681634

Please sign in to comment.