Skip to content

Commit bcf47b9

Browse files
committed
gui: Use menu for wallet migration
Once legacy wallets can no longer be loaded, we need to be able to migrate them without loading. Thus we should use a menu that lists the wallets in the wallet directory instead of an action which migrates the currently loaded wallet.
1 parent 2c116ea commit bcf47b9

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

src/qt/bitcoingui.cpp

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ void BitcoinGUI::createActions()
360360
m_migrate_wallet_action = new QAction(tr("Migrate Wallet"), this);
361361
m_migrate_wallet_action->setEnabled(false);
362362
m_migrate_wallet_action->setStatusTip(tr("Migrate a wallet"));
363+
m_migrate_wallet_menu = new QMenu(this);
363364

364365
showHelpMessageAction = new QAction(tr("&Command-line options"), this);
365366
showHelpMessageAction->setMenuRole(QAction::NoRole);
@@ -455,10 +456,33 @@ void BitcoinGUI::createActions()
455456
connect(m_close_all_wallets_action, &QAction::triggered, [this] {
456457
m_wallet_controller->closeAllWallets(this);
457458
});
458-
connect(m_migrate_wallet_action, &QAction::triggered, [this] {
459-
auto activity = new MigrateWalletActivity(m_wallet_controller, this);
460-
connect(activity, &MigrateWalletActivity::migrated, this, &BitcoinGUI::setCurrentWallet);
461-
activity->migrate(walletFrame->currentWalletModel()->wallet().getWalletName());
459+
connect(m_migrate_wallet_menu, &QMenu::aboutToShow, [this] {
460+
m_migrate_wallet_menu->clear();
461+
for (const auto& [wallet_name, info] : m_wallet_controller->listWalletDir()) {
462+
const auto& [loaded, format] = info;
463+
QString name = GUIUtil::WalletDisplayName(wallet_name);
464+
// Menu items remove single &. Single & are shown when && is in
465+
// the string, but only the first occurrence. So replace only
466+
// the first & with &&.
467+
name.replace(name.indexOf(QChar('&')), 1, QString("&&"));
468+
QAction* action = m_migrate_wallet_menu->addAction(name);
469+
470+
if (format != "bdb") {
471+
// This wallet is already migrated
472+
action->setEnabled(false);
473+
continue;
474+
}
475+
476+
connect(action, &QAction::triggered, [this, wallet_name] {
477+
auto activity = new MigrateWalletActivity(m_wallet_controller, this);
478+
connect(activity, &MigrateWalletActivity::migrated, this, &BitcoinGUI::setCurrentWallet);
479+
activity->migrate(wallet_name);
480+
});
481+
}
482+
if (m_migrate_wallet_menu->isEmpty()) {
483+
QAction* action = m_migrate_wallet_menu->addAction(tr("No wallets available"));
484+
action->setEnabled(false);
485+
}
462486
});
463487
connect(m_mask_values_action, &QAction::toggled, this, &BitcoinGUI::setPrivacy);
464488
connect(m_mask_values_action, &QAction::toggled, this, &BitcoinGUI::enableHistoryAction);
@@ -691,6 +715,8 @@ void BitcoinGUI::setWalletController(WalletController* wallet_controller, bool s
691715
m_open_wallet_action->setEnabled(true);
692716
m_open_wallet_action->setMenu(m_open_wallet_menu);
693717
m_restore_wallet_action->setEnabled(true);
718+
m_migrate_wallet_action->setEnabled(true);
719+
m_migrate_wallet_action->setMenu(m_migrate_wallet_menu);
694720

695721
GUIUtil::ExceptionSafeConnect(wallet_controller, &WalletController::walletAdded, this, &BitcoinGUI::addWallet);
696722
connect(wallet_controller, &WalletController::walletRemoved, this, &BitcoinGUI::removeWallet);
@@ -771,7 +797,6 @@ void BitcoinGUI::setCurrentWallet(WalletModel* wallet_model)
771797
}
772798
}
773799
updateWindowTitle();
774-
m_migrate_wallet_action->setEnabled(wallet_model->wallet().isLegacy());
775800
}
776801

777802
void BitcoinGUI::setCurrentWalletBySelectorIndex(int index)
@@ -805,7 +830,6 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled)
805830
openAction->setEnabled(enabled);
806831
m_close_wallet_action->setEnabled(enabled);
807832
m_close_all_wallets_action->setEnabled(enabled);
808-
m_migrate_wallet_action->setEnabled(enabled);
809833
}
810834

811835
void BitcoinGUI::createTrayIcon()

0 commit comments

Comments
 (0)