@@ -532,6 +532,46 @@ void BitcoinGUI::createMenuBar()
532532 }
533533 settings->addAction (optionsAction);
534534
535+ // Add chain selection submenu
536+ QAction* chain_selection_action = new QAction (tr (" &Switch chain" ), this );
537+ chain_selection_action->setStatusTip (tr (" Restart application using a different (test) network" ));
538+ QMenu* chain_selection_menu = new QMenu (this );
539+ chain_selection_action->setMenu (chain_selection_menu);
540+
541+ connect (chain_selection_menu, &QMenu::aboutToShow, [this , chain_selection_menu] {
542+ chain_selection_menu->clear ();
543+ const std::vector<std::pair<QString, QString>> chains = {{" main" , " &Bitcoin" }, {" testnet4" , " &Testnet4" }, {" regtest" , " &Regtest" }, {" signet" , " &Signet" }};
544+ const std::string current_chain = Params ().GetChainTypeString ();
545+ for (const auto & chain : chains) {
546+ const bool is_current = current_chain == chain.first .toStdString ();
547+ QAction* action = chain_selection_menu->addAction (chain.second );
548+ action->setCheckable (true );
549+ action->setChecked (is_current);
550+ action->setEnabled (!is_current);
551+ connect (action, &QAction::triggered, [this , chain] {
552+ // : Switch to the mainnet, testnet, signet or regtest chain.
553+ QMessageBox::StandardButton btn_ret_val = QMessageBox::question (this , tr (" Switch chain" ),
554+ // : Switching between mainnet, testnet, signet or regtest chain requires a restart.
555+ tr (" Client restart required to switch chain.\n\n Client will be shut down. Do you want to proceed?" ),
556+ QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
557+
558+ if (btn_ret_val == QMessageBox::Cancel) return ;
559+
560+ // QSettings are stored seperately for each network. Switch application name
561+ // to mainnet before storing the selected chain.
562+ QScopedPointer<const NetworkStyle> networkStyle (NetworkStyle::instantiate (ChainType::MAIN));
563+ assert (!networkStyle.isNull ());
564+ QApplication::setApplicationName (networkStyle->getAppName ());
565+
566+ QSettings settings;
567+ settings.setValue (" chain" , chain.first );
568+ Q_EMIT quitRequested ();
569+ });
570+ }
571+ });
572+
573+ settings->addAction (chain_selection_action);
574+
535575 QMenu* window_menu = appMenuBar->addMenu (tr (" &Window" ));
536576
537577 QAction* minimize_action = window_menu->addAction (tr (" &Minimize" ));
0 commit comments