5#include <bitcoin-build-config.h>
36#include <chainparams.h>
42#include <validation.h>
45#include <QActionGroup>
46#include <QApplication>
50#include <QDragEnterEvent>
51#include <QInputDialog>
52#include <QKeySequence>
58#include <QProgressDialog>
62#include <QStackedWidget>
65#include <QSystemTrayIcon>
82#if defined(Q_OS_MACOS)
84#elif defined(Q_OS_WIN)
94 trayIconMenu{new QMenu()},
95 platformStyle(_platformStyle),
96 m_network_style(networkStyle)
99 if (!restoreGeometry(settings.value(
"MainWindowGeometry").toByteArray())) {
101 move(QGuiApplication::primaryScreen()->availableGeometry().center() - frameGeometry().center());
104 setContextMenuPolicy(Qt::PreventContextMenu);
139 setAcceptDrops(
true);
152 if (QSystemTrayIcon::isSystemTrayAvailable()) {
161 statusBar()->setSizeGripEnabled(
false);
164 QFrame *frameBlocks =
new QFrame();
165 frameBlocks->setContentsMargins(0,0,0,0);
166 frameBlocks->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
167 QHBoxLayout *frameBlocksLayout =
new QHBoxLayout(frameBlocks);
168 frameBlocksLayout->setContentsMargins(3,0,3,0);
169 frameBlocksLayout->setSpacing(3);
178 frameBlocksLayout->addStretch();
180 frameBlocksLayout->addStretch();
187 frameBlocksLayout->addStretch();
189 frameBlocksLayout->addStretch();
191 frameBlocksLayout->addStretch();
203 QString curStyle = QApplication::style()->metaObject()->className();
204 if(curStyle ==
"QWindowsStyle" || curStyle ==
"QWindowsXPStyle")
206 progressBar->setStyleSheet(
"QProgressBar { background-color: #e8e8e8; border: 1px solid grey; border-radius: 7px; padding: 1px; text-align: center; } QProgressBar::chunk { background: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #FF8000, stop: 1 orange); border-radius: 7px; margin: 0px; }");
211 statusBar()->addPermanentWidget(frameBlocks);
214 this->installEventFilter(
this);
242 settings.setValue(
"MainWindowGeometry", saveGeometry());
246 delete m_app_nap_inhibitor;
255 QActionGroup *tabGroup =
new QActionGroup(
this);
259 overviewAction->setStatusTip(tr(
"Show general overview of wallet"));
262 overviewAction->setShortcut(QKeySequence(QStringLiteral(
"Alt+1")));
273 receiveCoinsAction->setStatusTip(tr(
"Request payments (generates QR codes and bitcoin: URIs)"));
280 historyAction->setStatusTip(tr(
"Browse transaction history"));
283 historyAction->setShortcut(QKeySequence(QStringLiteral(
"Alt+4")));
290 connect(
overviewAction, &QAction::triggered,
this, &BitcoinGUI::gotoOverviewPage);
292 connect(
sendCoinsAction, &QAction::triggered, [
this]{ gotoSendCoinsPage(); });
294 connect(
receiveCoinsAction, &QAction::triggered,
this, &BitcoinGUI::gotoReceiveCoinsPage);
296 connect(
historyAction, &QAction::triggered,
this, &BitcoinGUI::gotoHistoryPage);
300 quitAction->setStatusTip(tr(
"Quit application"));
301 quitAction->setShortcut(QKeySequence(tr(
"Ctrl+Q")));
303 aboutAction =
new QAction(tr(
"&About %1").arg(CLIENT_NAME),
this);
304 aboutAction->setStatusTip(tr(
"Show information about %1").arg(CLIENT_NAME));
308 aboutQtAction->setStatusTip(tr(
"Show information about Qt"));
311 optionsAction->setStatusTip(tr(
"Modify configuration options for %1").arg(CLIENT_NAME));
316 encryptWalletAction->setStatusTip(tr(
"Encrypt the private keys that belong to your wallet"));
323 signMessageAction->setStatusTip(tr(
"Sign messages with your Bitcoin addresses to prove you own them"));
325 verifyMessageAction->setStatusTip(tr(
"Verify messages to ensure they were signed with specified Bitcoin addresses"));
342 openAction =
new QAction(tr(
"Open &URI…"),
this);
343 openAction->setStatusTip(tr(
"Open a bitcoin: URI"));
373 showHelpMessageAction->setStatusTip(tr(
"Show the %1 help message to get a list with possible Bitcoin command-line options").arg(CLIENT_NAME));
382 m_export_watchonly_action->setStatusTip(tr(
"Export a watch-only version of the current wallet that can be restored onto another node."));
386 connect(
aboutQtAction, &QAction::triggered, qApp, QApplication::aboutQt);
400 connect(
signMessageAction, &QAction::triggered, [
this]{ gotoSignMessageTab(); });
407 connect(
openAction, &QAction::triggered,
this, &BitcoinGUI::openClicked);
410 for (
const auto& [path, info] : m_wallet_controller->listWalletDir()) {
411 const auto& [loaded, format] = info;
412 QString name = GUIUtil::WalletDisplayName(path);
415 name.replace(QChar(
'&'), QString(
"&&"));
416 bool is_legacy = format ==
"bdb";
418 name +=
" (needs migration)";
422 if (loaded || is_legacy) {
424 action->setEnabled(
false);
428 connect(action, &QAction::triggered, [
this, path] {
432 activity->open(path);
437 action->setEnabled(
false);
442 QString name_data_file = tr(
"Wallet Data");
445 QString title_windows = tr(
"Load Wallet Backup");
447 QString backup_file =
GUIUtil::getOpenFileName(
this, title_windows, QString(), name_data_file + QLatin1String(
" (*.dat *.wallet);;") + tr(
"All Files") + QLatin1String(
" (*)"),
nullptr);
448 if (backup_file.isEmpty())
return;
453 QString title = tr(
"Restore Wallet");
455 QString label = tr(
"Wallet Name");
456 QString wallet_name = QInputDialog::getText(
this, title, label, QLineEdit::Normal,
"", &wallet_name_ok);
457 if (!wallet_name_ok)
return;
458 if (wallet_name.isEmpty()) {
459 QMessageBox::critical(
nullptr, tr(
"Invalid Wallet Name"), tr(
"Wallet name cannot be empty"));
468 activity->restore(backup_file_path, wallet_name.toStdString());
475 m_wallet_controller->closeAllWallets(
this);
479 for (
const auto& [wallet_name, info] : m_wallet_controller->listWalletDir()) {
480 const auto& [loaded, format] = info;
482 if (format !=
"bdb") {
489 name.replace(QChar(
'&'), QString(
"&&"));
492 connect(action, &QAction::triggered, [
this, wallet_name] {
495 activity->migrate(wallet_name);
500 action->setEnabled(
false);
503 QAction* restore_migrate_file_action =
m_migrate_wallet_menu->addAction(tr(
"Restore and Migrate Wallet File…"));
504 restore_migrate_file_action->setEnabled(
true);
506 connect(restore_migrate_file_action, &QAction::triggered, [
this] {
507 QString name_data_file = tr(
"Wallet Data");
508 QString title_windows = tr(
"Restore and Migrate Wallet Backup");
510 QString backup_file =
GUIUtil::getOpenFileName(
this, title_windows, QString(), name_data_file + QLatin1String(
" (*.dat)"),
nullptr);
511 if (backup_file.isEmpty())
return;
516 QString title = tr(
"Restore and Migrate Wallet");
518 QString label = tr(
"Wallet Name");
519 QString wallet_name = QInputDialog::getText(
this, title, label, QLineEdit::Normal,
"", &wallet_name_ok);
520 if (!wallet_name_ok || wallet_name.isEmpty())
return;
526 activity->restore_and_migrate(backup_file_path, wallet_name.toStdString());
530 connect(m_mask_values_action, &QAction::toggled,
this, &BitcoinGUI::enableHistoryAction);
533 tr(
"Save Watch-only Wallet Export"), QString(),
535 tr(
"Wallet Data") + QLatin1String(
" (*.dat)"),
nullptr);
537 if (destination.isEmpty())
return;
538 WalletModel* model = walletFrame->currentWalletModel();
539 if (!
Assume(model))
return;
542 QMessageBox::information(
nullptr, tr(
"Export Successful"), tr(
"The wallet has been exported to ") + QString::fromStdString(*export_res));
544 QMessageBox::critical(
nullptr, tr(
"Export Error"), QString::fromStdString(
util::ErrorString(export_res).translated));
551 connect(
new QShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_D),
this), &QShortcut::activated,
this, &
BitcoinGUI::showDebugWindow);
559 QMenu *file =
appMenuBar->addMenu(tr(
"&File"));
567 file->addSeparator();
571 file->addSeparator();
577 file->addSeparator();
581 QMenu *settings =
appMenuBar->addMenu(tr(
"&Settings"));
586 settings->addSeparator();
588 settings->addSeparator();
592 QMenu* window_menu =
appMenuBar->addMenu(tr(
"&Window"));
594 QAction* minimize_action = window_menu->addAction(tr(
"&Minimize"));
595 minimize_action->setShortcut(QKeySequence(tr(
"Ctrl+M")));
596 connect(minimize_action, &QAction::triggered, [] {
597 QApplication::activeWindow()->showMinimized();
599 connect(qApp, &QApplication::focusWindowChanged,
this, [minimize_action] (QWindow* window) {
600 minimize_action->setEnabled(window !=
nullptr && (window->flags() & Qt::Dialog) != Qt::Dialog && window->windowState() != Qt::WindowMinimized);
604 QAction* zoom_action = window_menu->addAction(tr(
"Zoom"));
605 connect(zoom_action, &QAction::triggered, [] {
606 QWindow* window = qApp->focusWindow();
607 if (window->windowState() != Qt::WindowMaximized) {
608 window->showMaximized();
610 window->showNormal();
614 connect(qApp, &QApplication::focusWindowChanged,
this, [zoom_action] (QWindow* window) {
615 zoom_action->setEnabled(window !=
nullptr);
621 window_menu->addSeparator();
622 QAction* main_window_action = window_menu->addAction(tr(
"Main Window"));
623 connect(main_window_action, &QAction::triggered, [
this] {
627 window_menu->addSeparator();
632 window_menu->addSeparator();
636 connect(tab_action, &QAction::triggered, [
this, tab_type] {
644 help->addSeparator();
653 QToolBar *toolbar = addToolBar(tr(
"Tabs toolbar"));
655 toolbar->setMovable(
false);
656 toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
664 QWidget *spacer =
new QWidget();
665 spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
666 toolbar->addWidget(spacer);
668 m_wallet_selector =
new QComboBox();
669 m_wallet_selector->setSizeAdjustPolicy(QComboBox::AdjustToContents);
670 connect(m_wallet_selector, qOverload<int>(&QComboBox::currentIndexChanged),
this, &BitcoinGUI::setCurrentWalletBySelectorIndex);
672 m_wallet_selector_label =
new QLabel();
673 m_wallet_selector_label->setText(tr(
"Wallet:") +
" ");
674 m_wallet_selector_label->setBuddy(m_wallet_selector);
676 m_wallet_selector_label_action =
appToolBar->addWidget(m_wallet_selector_label);
677 m_wallet_selector_action =
appToolBar->addWidget(m_wallet_selector);
679 m_wallet_selector_label_action->setVisible(
false);
680 m_wallet_selector_action->setVisible(
false);
758void BitcoinGUI::enableHistoryAction(
bool privacy)
766void BitcoinGUI::setWalletController(
WalletController* wallet_controller,
bool show_loading_minimized)
768 assert(!m_wallet_controller);
769 assert(wallet_controller);
771 m_wallet_controller = wallet_controller;
782 connect(wallet_controller, &WalletController::destroyed,
this, [
this] {
784 m_wallet_controller =
nullptr;
788 activity->load(show_loading_minimized);
793 return m_wallet_controller;
796void BitcoinGUI::addWallet(
WalletModel* walletModel)
804 if (m_wallet_selector->count() == 0) {
806 }
else if (m_wallet_selector->count() == 1) {
807 m_wallet_selector_label_action->setVisible(
true);
808 m_wallet_selector_action->setVisible(
true);
822 m_wallet_selector->addItem(display_name, QVariant::fromValue(walletModel));
825void BitcoinGUI::removeWallet(
WalletModel* walletModel)
832 int index = m_wallet_selector->findData(QVariant::fromValue(walletModel));
833 m_wallet_selector->removeItem(index);
834 if (m_wallet_selector->count() == 0) {
837 }
else if (m_wallet_selector->count() == 1) {
838 m_wallet_selector_label_action->setVisible(
false);
839 m_wallet_selector_action->setVisible(
false);
846void BitcoinGUI::setCurrentWallet(
WalletModel* wallet_model)
850 for (
int index = 0; index < m_wallet_selector->count(); ++index) {
851 if (m_wallet_selector->itemData(index).value<
WalletModel*>() == wallet_model) {
852 m_wallet_selector->setCurrentIndex(index);
860void BitcoinGUI::setCurrentWalletBySelectorIndex(
int index)
863 if (wallet_model) setCurrentWallet(wallet_model);
866void BitcoinGUI::removeAllWallets()
896 assert(QSystemTrayIcon::isSystemTrayAvailable());
899 if (QSystemTrayIcon::isSystemTrayAvailable()) {
914 QAction* show_hide_action{
nullptr};
921 QAction* send_action{
nullptr};
922 QAction* receive_action{
nullptr};
923 QAction* sign_action{
nullptr};
924 QAction* verify_action{
nullptr};
934 options_action->setMenuRole(QAction::PreferencesRole);
936 QAction* quit_action{
nullptr};
943 connect(
trayIcon, &QSystemTrayIcon::activated, [
this](QSystemTrayIcon::ActivationReason reason) {
944 if (reason == QSystemTrayIcon::Trigger) {
964 [
this, show_hide_action, send_action, receive_action, sign_action, verify_action, options_action, node_window_action, quit_action] {
965 if (m_node.shutdownRequested()) return;
967 if (show_hide_action) show_hide_action->setText(
968 (!isHidden() && !isMinimized() && !GUIUtil::isObscured(this)) ?
971 if (QApplication::activeModalWidget()) {
972 for (QAction* a : trayIconMenu.get()->actions()) {
973 a->setEnabled(false);
976 if (show_hide_action) show_hide_action->setEnabled(true);
978 send_action->setEnabled(sendCoinsAction->isEnabled());
979 receive_action->setEnabled(receiveCoinsAction->isEnabled());
980 sign_action->setEnabled(signMessageAction->isEnabled());
981 verify_action->setEnabled(verifyMessageAction->isEnabled());
985 if (quit_action) quit_action->setEnabled(
true);
1022void BitcoinGUI::openClicked()
1031void BitcoinGUI::gotoOverviewPage()
1037void BitcoinGUI::gotoHistoryPage()
1043void BitcoinGUI::gotoReceiveCoinsPage()
1049void BitcoinGUI::gotoSendCoinsPage(QString addr)
1055void BitcoinGUI::gotoSignMessageTab(QString addr)
1060void BitcoinGUI::gotoVerifyMessageTab(QString addr)
1064void BitcoinGUI::gotoLoadPSBT(
bool from_clipboard)
1077 case 0: icon =
":/icons/connect_0";
break;
1078 case 1:
case 2:
case 3: icon =
":/icons/connect_1";
break;
1079 case 4:
case 5:
case 6: icon =
":/icons/connect_2";
break;
1080 case 7:
case 8:
case 9: icon =
":/icons/connect_3";
break;
1081 default: icon =
":/icons/connect_4";
break;
1088 tooltip = tr(
"%n active connection(s) to Bitcoin network.",
"",
count);
1091 tooltip = tr(
"Network activity disabled.");
1092 icon =
":/icons/network_disabled";
1096 tooltip = QLatin1String(
"<nobr>") + tooltip + QLatin1String(
"<br>") +
1098 tr(
"Click for more actions.") + QLatin1String(
"</nobr>");
1115 tr(
"Show Peers tab"),
1123 tr(
"Disable network activity") :
1125 tr(
"Enable network activity"),
1135 progressBarLabel->setText(tr(
"Syncing Headers (%1%)…").arg(QString::number(100.0 / (headersTipHeight+estHeadersLeft)*headersTipHeight,
'f', 1)));
1142 progressBarLabel->setText(tr(
"Pre-syncing Headers (%1%)…").arg(QString::number(100.0 / (height+estHeadersLeft)*height,
'f', 1)));
1152 dlg->setCurrentTab(tab);
1163 m_app_nap_inhibitor->enableAppNap();
1165 m_app_nap_inhibitor->disableAppNap();
1180 statusBar()->clearMessage();
1184 switch (blockSource) {
1213 QDateTime currentDate = QDateTime::currentDateTime();
1214 qint64 secs = blockDate.secsTo(currentDate);
1216 tooltip = tr(
"Processed %n block(s) of transaction history.",
"",
count);
1220 tooltip = tr(
"Up to date") + QString(
".<br>") + tooltip;
1239 progressBar->setFormat(tr(
"%1 behind").arg(timeBehindText));
1241 progressBar->setValue(nVerificationProgress * 1000000000.0 + 0.5);
1244 tooltip = tr(
"Catching up…") + QString(
"<br>") + tooltip;
1248 QString(
":/animation/spinner-%1").arg(
spinnerFrame, 3, 10, QChar(
'0')),
1262 tooltip += QString(
"<br>");
1263 tooltip += tr(
"Last received block was generated %1 ago.").arg(timeBehindText);
1264 tooltip += QString(
"<br>");
1265 tooltip += tr(
"Transactions after this will not yet be visible.");
1269 tooltip = QString(
"<nobr>") + tooltip + QString(
"</nobr>");
1286void BitcoinGUI::message(
const QString& title, QString message,
unsigned int style,
bool*
ret,
const QString& detailed_message)
1289 QString strTitle{CLIENT_NAME};
1291 int nMBoxIcon = QMessageBox::Information;
1295 if (!title.isEmpty()) {
1300 msgType = tr(
"Error");
1304 msgType = tr(
"Warning");
1308 msgType = tr(
"Information");
1316 if (!msgType.isEmpty()) {
1317 strTitle +=
" - " + msgType;
1321 nMBoxIcon = QMessageBox::Critical;
1330 QMessageBox::StandardButton buttons;
1332 buttons = QMessageBox::Ok;
1335 QMessageBox mBox(
static_cast<QMessageBox::Icon
>(nMBoxIcon), strTitle,
message, buttons,
this);
1336 mBox.setTextFormat(Qt::PlainText);
1337 mBox.setDetailedText(detailed_message);
1338 int r = mBox.exec();
1340 *
ret = r == QMessageBox::Ok;
1348 if (e->type() == QEvent::PaletteChange) {
1355 QMainWindow::changeEvent(e);
1358 if(e->type() == QEvent::WindowStateChange)
1362 QWindowStateChangeEvent *wsevt =
static_cast<QWindowStateChangeEvent*
>(e);
1363 if(!(wsevt->oldState() & Qt::WindowMinimized) && isMinimized())
1365 QTimer::singleShot(0,
this, &BitcoinGUI::hide);
1368 else if((wsevt->oldState() & Qt::WindowMinimized) && !isMinimized())
1370 QTimer::singleShot(0,
this, &BitcoinGUI::show);
1392 QMainWindow::showMinimized();
1397 QMainWindow::closeEvent(event);
1410void BitcoinGUI::incomingTransaction(
const QString& date,
BitcoinUnit unit,
const CAmount& amount,
const QString& type,
const QString& address,
const QString& label,
const QString& walletName)
1413 QString
msg = tr(
"Date: %1\n").arg(date) +
1416 msg += tr(
"Wallet: %1\n").arg(walletName);
1418 msg += tr(
"Type: %1\n").arg(type);
1419 if (!label.isEmpty())
1420 msg += tr(
"Label: %1\n").arg(label);
1421 else if (!address.isEmpty())
1422 msg += tr(
"Address: %1\n").arg(address);
1423 message((amount)<0 ? tr(
"Sent transaction") : tr(
"Incoming transaction"),
1431 if(event->mimeData()->hasUrls())
1432 event->acceptProposedAction();
1437 if(event->mimeData()->hasUrls())
1439 for (
const QUrl &uri : event->mimeData()->urls())
1444 event->acceptProposedAction();
1450 if (event->type() == QEvent::StatusTip)
1456 return QMainWindow::eventFilter(
object, event);
1466 gotoSendCoinsPage();
1472void BitcoinGUI::setHDStatus(
bool privkeyDisabled,
int hdEnabled)
1475 labelWalletHDStatusIcon->setToolTip(privkeyDisabled ? tr(
"Private key <b>disabled</b>") : hdEnabled ? tr(
"HD key generation is <b>enabled</b>") : tr(
"HD key generation is <b>disabled</b>"));
1479void BitcoinGUI::setEncryptionStatus(
int status)
1514void BitcoinGUI::updateWalletStatus()
1530 std::string ip_port;
1533 if (proxy_enabled) {
1535 QString ip_port_q = QString::fromStdString(ip_port);
1537 labelProxyIcon->setToolTip(tr(
"Proxy is <b>enabled</b>: %1").arg(ip_port_q));
1548 QString window_title = CLIENT_NAME;
1552 if (wallet_model && !wallet_model->
getWalletName().isEmpty()) {
1560 setWindowTitle(window_title);
1592 if (nProgress == 0) {
1598 }
else if (nProgress == 100) {
1623 QString detailed_message;
1625 detailed_message = BitcoinGUI::tr(
"Original message:") +
"\n" + QString::fromStdString(message.
original);
1629 const QString title{};
1632 bool invoked = QMetaObject::invokeMethod(gui,
"message",
1634 Q_ARG(QString, title),
1635 Q_ARG(QString, QString::fromStdString(message.
translated)),
1636 Q_ARG(
unsigned int, style),
1638 Q_ARG(QString, detailed_message));
1668 : m_platform_style{platformStyle}
1671 setToolTip(tr(
"Unit to show amounts in. Click to select another unit."));
1674 const QFontMetrics fm(font());
1678 setMinimumSize(max_width, 0);
1679 setAlignment(Qt::AlignRight | Qt::AlignVCenter);
1691 if (e->type() == QEvent::PaletteChange) {
1693 if (style != styleSheet()) {
1694 setStyleSheet(style);
1698 QLabel::changeEvent(e);
1704 menu =
new QMenu(
this);
1735 QPoint globalPos = mapToGlobal(point);
1736 menu->exec(globalPos);
1748#include <moc_bitcoingui.cpp>
int64_t CAmount
Amount in satoshis (Can be negative)
static bool ThreadSafeMessageBox(BitcoinGUI *gui, const bilingual_str &message, unsigned int style)
static constexpr int64_t MAX_BLOCK_TIME_GAP
Maximum gap between node time and block time used for the "Catching up..." mode in GUI.
const CChainParams & Params()
Return the currently selected parameters.
#define Assume(val)
Assume is the identity function.
void updateHeadersPresyncProgressLabel(int64_t height, const QDateTime &blockDate)
GUIUtil::ClickableProgressBar * progressBar
QAction * m_close_all_wallets_action
void showEvent(QShowEvent *event) override
QLabel * progressBarLabel
QAction * m_open_wallet_action
static const std::string DEFAULT_UIPLATFORM
QAction * m_export_watchonly_action
void createWallet()
Launch the wallet creation modal (no-op if wallet is not compiled)
void setNumBlocks(int count, const QDateTime &blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state)
Set number of blocks and last block date shown in the UI.
void setClientModel(ClientModel *clientModel=nullptr, interfaces::BlockAndHeaderTipInfo *tip_info=nullptr)
Set the client model.
GUIUtil::ClickableLabel * connectionsControl
void receivedURI(const QString &uri)
Signal raised when a URI was entered or dragged to the GUI.
ModalOverlay * modalOverlay
GUIUtil::ThemedLabel * labelWalletEncryptionIcon
QAction * changePassphraseAction
void openOptionsDialogWithTab(OptionsDialog::Tab tab)
Open the OptionsDialog on the specified tab index.
int prevBlocks
Keep track of previous number of blocks, to detect progress.
QAction * openRPCConsoleAction
const NetworkStyle *const m_network_style
void changeEvent(QEvent *e) override
GUIUtil::ClickableLabel * labelProxyIcon
void optionsClicked()
Show configuration dialog.
bool eventFilter(QObject *object, QEvent *event) override
QMenu * m_open_wallet_menu
void createTrayIcon()
Create system tray icon and notification.
QAction * m_load_psbt_clipboard_action
void setNetworkActive(bool network_active)
Set network state shown in the UI.
void setPrivacy(bool privacy)
QProgressDialog * progressDialog
BitcoinGUI(interfaces::Node &node, const PlatformStyle *platformStyle, const NetworkStyle *networkStyle, QWidget *parent=nullptr)
std::unique_ptr< interfaces::Handler > m_handler_message_box
WalletFrame * walletFrame
void updateProxyIcon()
Set the proxy-enabled icon as shown in the UI.
QAction * m_restore_wallet_action
QAction * receiveCoinsAction
const std::unique_ptr< QMenu > trayIconMenu
QAction * usedSendingAddressesAction
void unsubscribeFromCoreSignals()
Disconnect core signals from GUI client.
void closeEvent(QCloseEvent *event) override
QAction * verifyMessageAction
QAction * m_migrate_wallet_action
void createTrayIconMenu()
Create system tray menu (or setup the dock menu)
HelpMessageDialog * helpMessageDialog
void aboutClicked()
Show about dialog.
void toggleHidden()
Simply calls showNormalIfMinimized(true)
QAction * encryptWalletAction
void updateNetworkState()
Update UI with latest network info from model.
void createActions()
Create the main UI actions.
void showDebugWindow()
Show debug window.
QAction * m_mask_values_action
void consoleShown(RPCConsole *console)
Signal raised when RPC console shown.
bool isPrivacyModeActivated() const
QMenu * m_migrate_wallet_menu
void showDebugWindowActivateConsole()
Show debug window and set focus to the console.
void dropEvent(QDropEvent *event) override
void showProgress(const QString &title, int nProgress)
Show progress dialog e.g.
QAction * usedReceivingAddressesAction
void subscribeToCoreSignals()
Connect core signals to GUI client.
void createToolBars()
Create the toolbars.
UnitDisplayStatusBarControl * unitDisplayControl
void setWalletActionsEnabled(bool enabled)
Enable or disable all wallet-related actions.
const PlatformStyle * platformStyle
void dragEnterEvent(QDragEnterEvent *event) override
QAction * m_close_wallet_action
GUIUtil::ClickableLabel * labelBlocksIcon
interfaces::Node & m_node
QAction * m_create_wallet_action
QAction * m_load_psbt_action
void detectShutdown()
called by a timer to check if shutdown has been requested
QMenu * m_network_context_menu
QAction * backupWalletAction
QAction * showHelpMessageAction
void showNormalIfMinimized()
Show window if hidden, unminimize when minimized, rise when obscured or show if hidden and fToggleHid...
ClientModel * clientModel
void updateHeadersSyncProgressLabel()
void createMenuBar()
Create the menu bar and sub-menus.
QSystemTrayIcon * trayIcon
void message(const QString &title, QString message, unsigned int style, bool *ret=nullptr, const QString &detailed_message=QString())
Notify the user of an event from the core network or transaction handling code.
void showHelpMessageClicked()
Show help message dialog.
QAction * sendCoinsAction
void setNumConnections(int count)
Set number of connections shown in the UI.
QAction * signMessageAction
GUIUtil::ThemedLabel * labelWalletHDStatusIcon
Notificator * notificator
std::unique_ptr< interfaces::Handler > m_handler_question
static QList< Unit > availableUnits()
Get list of units, for drop-down box.
static QString longName(Unit unit)
Long name.
static QString formatWithUnit(Unit unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as string (with unit)
const Consensus::Params & GetConsensus() const
Signals for UI communication.
@ BTN_MASK
Mask of all available buttons in CClientUIInterface::MessageBoxFlags This needs to be updated,...
@ MSG_INFORMATION
Predefined combinations for certain default usage cases.
@ MODAL
Force blocking, modal message box dialog (not just OS notification)
Model for Bitcoin network client.
void showProgress(const QString &title, int nProgress)
int getHeaderTipHeight() const
void message(const QString &title, const QString &message, unsigned int style)
Fired when a message should be reported to the user.
void numConnectionsChanged(int count)
BlockSource getBlockSource() const
Returns the block source of the current importing/syncing state.
int64_t getHeaderTipTime() const
int getNumConnections(unsigned int flags=CONNECTIONS_ALL) const
Return number of connections, default is in- and outbound (total)
void numBlocksChanged(int count, const QDateTime &blockDate, double nVerificationProgress, SyncType header, SynchronizationState sync_state)
OptionsModel * getOptionsModel()
bool getProxyInfo(std::string &ip_port) const
void networkActiveChanged(bool networkActive)
void created(WalletModel *wallet_model)
void clicked(const QPoint &point)
Emitted when the label is clicked.
void clicked(const QPoint &point)
Emitted when the progressbar is clicked.
void setThemedPixmap(const QString &image_filename, int width, int height)
"Help message" dialog box
macOS-specific Dock icon handler.
static MacDockIconHandler * instance()
void migrated(WalletModel *wallet_model)
Modal overlay to display information about the chain-sync state.
void showHide(bool hide=false, bool userRequested=false)
void tipUpdate(int count, const QDateTime &blockDate, double nVerificationProgress)
void triggered(bool hidden)
bool isLayerVisible() const
void setKnownBestHeight(int count, const QDateTime &blockDate, bool presync)
const QIcon & getTrayAndWindowIcon() const
const QString & getTitleAddText() const
Cross-platform desktop notification client.
@ Information
Informational message.
@ Critical
An error occurred.
@ Warning
Notify user of potential problem.
void notify(Class cls, const QString &title, const QString &text, const QIcon &icon=QIcon(), int millisTimeout=10000)
Show notification message.
void opened(WalletModel *wallet_model)
Interface from Qt to configuration data structure for Bitcoin client.
void displayUnitChanged(BitcoinUnit unit)
void showTrayIconChanged(bool)
bool getMinimizeToTray() const
BitcoinUnit getDisplayUnit() const
bool getShowTrayIcon() const
QVariant getOption(OptionID option, const std::string &suffix="") const
bool getMinimizeOnClose() const
void setDisplayUnit(const QVariant &new_unit)
Updates current unit in memory, settings and emits displayUnitChanged(new_unit) signal.
Local Bitcoin RPC console.
std::vector< TabTypes > tabs() const
QString tabTitle(TabTypes tab_type) const
QKeySequence tabShortcut(TabTypes tab_type) const
void setClientModel(ClientModel *model=nullptr, int bestblock_height=0, int64_t bestblock_date=0, double verification_progress=0.0)
void setTabFocus(enum TabTypes tabType)
set which tab has the focus (is visible)
void restored(WalletModel *wallet_model)
void changeEvent(QEvent *e) override
void mousePressEvent(QMouseEvent *event) override
So that it responds to left-button clicks.
void createContextMenu()
Creates context menu, its actions, and wires up all the relevant signals for mouse events.
void updateDisplayUnit(BitcoinUnit newUnits)
When Display Units are changed on OptionsModel it will refresh the display text of the control on the...
OptionsModel * optionsModel
UnitDisplayStatusBarControl(const PlatformStyle *platformStyle)
void onMenuSelection(QAction *action)
Tells underlying optionsModel to update its current display unit.
const PlatformStyle * m_platform_style
void setOptionsModel(OptionsModel *optionsModel)
Lets the control know about the Options Model (and its signals)
void onDisplayUnitsClicked(const QPoint &point)
Shows context menu with Display Unit options by the mouse coordinates.
Controller between interfaces::Node, WalletModel instances and the GUI.
void walletAdded(WalletModel *wallet_model)
void walletRemoved(WalletModel *wallet_model)
A container for embedding all wallet-related controls into BitcoinGUI.
bool addView(WalletView *walletView)
void changePassphrase()
Change encrypted wallet passphrase.
WalletModel * currentWalletModel() const
void gotoHistoryPage()
Switch to history (transactions) page.
void gotoSignMessageTab(QString addr="")
Show Sign/Verify Message dialog and switch to sign message tab.
WalletView * currentWalletView() const
void gotoOverviewPage()
Switch to overview (home) page.
void gotoSendCoinsPage(QString addr="")
Switch to send coins page.
void removeWallet(WalletModel *wallet_model)
void setClientModel(ClientModel *clientModel)
void backupWallet()
Backup the wallet.
void usedSendingAddresses()
Show used sending addresses.
void createWalletButtonClicked()
void encryptWallet()
Encrypt the wallet.
void usedReceivingAddresses()
Show used receiving addresses.
void message(const QString &title, const QString &message, unsigned int style)
void setCurrentWallet(WalletModel *wallet_model)
bool handlePaymentRequest(const SendCoinsRecipient &recipient)
void gotoLoadPSBT(bool from_clipboard=false)
Load Partially Signed Bitcoin Transaction.
void showOutOfSyncWarning(bool fShow)
void gotoReceiveCoinsPage()
Switch to receive coins page.
void gotoVerifyMessageTab(QString addr="")
Show Sign/Verify Message dialog and switch to verify message tab.
Interface to Bitcoin wallet from Qt view code.
EncryptionStatus getEncryptionStatus() const
interfaces::Wallet & wallet() const
QString getDisplayName() const
static bool isWalletEnabled()
QString getWalletName() const
void outOfSyncWarningClicked()
Notify that the out of sync warning icon has been pressed.
WalletModel * getWalletModel() const noexcept
void message(const QString &title, const QString &message, unsigned int style)
Fired when a message should be reported to the user.
void incomingTransaction(const QString &date, BitcoinUnit unit, const CAmount &amount, const QString &type, const QString &address, const QString &label, const QString &walletName)
Notify that a new transaction appeared.
void transactionClicked()
void setPrivacy(bool privacy)
void encryptionStatusChanged()
Encryption status of wallet changed.
Top-level interface for a bitcoin node (bitcoind process).
virtual void setNetworkActive(bool active)=0
Set network active.
virtual std::unique_ptr< Handler > handleMessageBox(MessageBoxFn fn)=0
virtual bool getNetworkActive()=0
Get network active.
virtual std::unique_ptr< Handler > handleQuestion(QuestionFn fn)=0
virtual WalletLoader & walletLoader()=0
Get wallet loader.
virtual bool shutdownRequested()=0
Return whether shutdown was requested.
virtual util::Result< std::string > exportWatchOnlyWallet(const fs::path &destination)=0
Export a watchonly wallet file. See CWallet::ExportWatchOnlyWallet.
virtual bool hdEnabled()=0
virtual bool privateKeysDisabled()=0
virtual std::vector< std::unique_ptr< Wallet > > getWallets()=0
Return interfaces for accessing wallets (if any).
static path PathFromString(const std::string &string)
Convert byte string to path object.
constexpr int STATUSBAR_ICONSIZE
constexpr int HEADER_HEIGHT_DELTA_SYNC
The required delta of headers to the estimated number of available headers until we show the IBD prog...
bool isObscured(QWidget *w)
Qt::ConnectionType blockingGUIThreadConnection()
Get connection type to call object slot in GUI thread with invokeMethod.
QString WalletDisplayName(const QString &name)
void PopupMenu(QMenu *menu, const QPoint &point, QAction *at_action)
Call QMenu::popup() only on supported QT_QPA_PLATFORM.
void ShowModalDialogAsynchronously(QDialog *dialog)
Shows a QDialog instance asynchronously, and deletes it on close.
void handleCloseWindowShortcut(QWidget *w)
void PolishProgressDialog(QProgressDialog *dialog)
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut)
Get open filename, convenience wrapper for QFileDialog::getOpenFileName.
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut)
Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix when ...
ClickableProgressBar ProgressBar
void bringToFront(QWidget *w)
bool HasPixmap(const QLabel *label)
Returns true if pixmap has been set.
QString formatNiceTimeOffset(qint64 secs)
auto ExceptionSafeConnect(Sender sender, Signal signal, Receiver receiver, Slot method, Qt::ConnectionType type=Qt::AutoConnection)
A drop-in replacement of QObject::connect function (see: https://doc.qt.io/qt-5/qobject....
int TextWidth(const QFontMetrics &fm, const QString &text)
Returns the distance in pixels appropriate for drawing a subsequent character after text.
fs::path QStringToPath(const QString &path)
Convert QString to OS specific boost path through UTF-8.
bilingual_str ErrorString(const Result< T > &result)
int64_t nPowTargetSpacing
Block and header tip information.
double verification_progress
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
SynchronizationState
Current sync state passed to tip changed callbacks.