@@ -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
777801void 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
811834void BitcoinGUI::createTrayIcon ()
0 commit comments