Skip to content

Commit 3c06c98

Browse files
committed
bitcoingui:switch chain
1 parent ca2d1e9 commit 3c06c98

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

src/qt/bitcoin.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,11 @@ int GuiMain(int argc, char* argv[])
589589
// - Do not call Params() before this step
590590
// - QSettings() will use the new application name after this, resulting in network-specific settings
591591
// - Needs to be done before createOptionsModel
592+
593+
QSettings settings;
594+
std::string chain = settings.value("chain", "main").toString().toStdString();
595+
gArgs.SoftSetArg("-chain", chain);
596+
592597
if (auto error = common::InitConfig(gArgs, ErrorSettingsRead)) {
593598
InitError(error->message, error->details);
594599
if (error->status == common::ConfigStatus::FAILED_WRITE) {

src/qt/bitcoingui.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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\nClient 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

Comments
 (0)