Skip to content

Commit 9a0d8c0

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 b4aa7b7 commit 9a0d8c0

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

src/qt/bitcoingui.cpp

+29-6
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,32 @@ 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+
464+
if (format != "bdb") { // Skip already migrated wallets
465+
continue;
466+
}
467+
468+
QString name = GUIUtil::WalletDisplayName(wallet_name);
469+
// Menu items remove single &. Single & are shown when && is in
470+
// the string, but only the first occurrence. So replace only
471+
// the first & with &&.
472+
name.replace(name.indexOf(QChar('&')), 1, QString("&&"));
473+
QAction* action = m_migrate_wallet_menu->addAction(name);
474+
475+
connect(action, &QAction::triggered, [this, wallet_name] {
476+
auto activity = new MigrateWalletActivity(m_wallet_controller, this);
477+
connect(activity, &MigrateWalletActivity::migrated, this, &BitcoinGUI::setCurrentWallet);
478+
activity->migrate(wallet_name);
479+
});
480+
}
481+
if (m_migrate_wallet_menu->isEmpty()) {
482+
QAction* action = m_migrate_wallet_menu->addAction(tr("No wallets available"));
483+
action->setEnabled(false);
484+
}
462485
});
463486
connect(m_mask_values_action, &QAction::toggled, this, &BitcoinGUI::setPrivacy);
464487
connect(m_mask_values_action, &QAction::toggled, this, &BitcoinGUI::enableHistoryAction);
@@ -691,6 +714,8 @@ void BitcoinGUI::setWalletController(WalletController* wallet_controller, bool s
691714
m_open_wallet_action->setEnabled(true);
692715
m_open_wallet_action->setMenu(m_open_wallet_menu);
693716
m_restore_wallet_action->setEnabled(true);
717+
m_migrate_wallet_action->setEnabled(true);
718+
m_migrate_wallet_action->setMenu(m_migrate_wallet_menu);
694719

695720
GUIUtil::ExceptionSafeConnect(wallet_controller, &WalletController::walletAdded, this, &BitcoinGUI::addWallet);
696721
connect(wallet_controller, &WalletController::walletRemoved, this, &BitcoinGUI::removeWallet);
@@ -771,7 +796,6 @@ void BitcoinGUI::setCurrentWallet(WalletModel* wallet_model)
771796
}
772797
}
773798
updateWindowTitle();
774-
m_migrate_wallet_action->setEnabled(wallet_model->wallet().isLegacy());
775799
}
776800

777801
void BitcoinGUI::setCurrentWalletBySelectorIndex(int index)
@@ -805,7 +829,6 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled)
805829
openAction->setEnabled(enabled);
806830
m_close_wallet_action->setEnabled(enabled);
807831
m_close_all_wallets_action->setEnabled(enabled);
808-
m_migrate_wallet_action->setEnabled(enabled);
809832
}
810833

811834
void BitcoinGUI::createTrayIcon()

0 commit comments

Comments
 (0)