Bitcoin Core  26.1.0
P2P Digital Currency
bitcoingui.h
Go to the documentation of this file.
1 // Copyright (c) 2011-2022 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_QT_BITCOINGUI_H
6 #define BITCOIN_QT_BITCOINGUI_H
7 
8 #if defined(HAVE_CONFIG_H)
10 #endif
11 
12 #include <qt/bitcoinunits.h>
13 #include <qt/clientmodel.h>
14 #include <qt/guiutil.h>
15 #include <qt/optionsdialog.h>
16 
17 #include <consensus/amount.h>
18 
19 #include <QLabel>
20 #include <QMainWindow>
21 #include <QMap>
22 #include <QMenu>
23 #include <QPoint>
24 #include <QSystemTrayIcon>
25 
26 #ifdef Q_OS_MACOS
27 #include <qt/macos_appnap.h>
28 #endif
29 
30 #include <memory>
31 
32 class NetworkStyle;
33 class Notificator;
34 class OptionsModel;
35 class PlatformStyle;
36 class RPCConsole;
37 class SendCoinsRecipient;
39 class WalletController;
40 class WalletFrame;
41 class WalletModel;
42 class HelpMessageDialog;
43 class ModalOverlay;
44 enum class SynchronizationState;
45 
46 namespace interfaces {
47 class Handler;
48 class Node;
49 struct BlockAndHeaderTipInfo;
50 }
51 
52 QT_BEGIN_NAMESPACE
53 class QAction;
54 class QComboBox;
55 class QDateTime;
56 class QProgressBar;
57 class QProgressDialog;
58 QT_END_NAMESPACE
59 
60 namespace GUIUtil {
61 class ClickableLabel;
63 }
64 
69 class BitcoinGUI : public QMainWindow
70 {
71  Q_OBJECT
72 
73 public:
74  static const std::string DEFAULT_UIPLATFORM;
75 
76  explicit BitcoinGUI(interfaces::Node& node, const PlatformStyle *platformStyle, const NetworkStyle *networkStyle, QWidget *parent = nullptr);
77  ~BitcoinGUI();
78 
82  void setClientModel(ClientModel *clientModel = nullptr, interfaces::BlockAndHeaderTipInfo* tip_info = nullptr);
83 #ifdef ENABLE_WALLET
84  void setWalletController(WalletController* wallet_controller, bool show_loading_minimized);
85  WalletController* getWalletController();
86 #endif
87 
88 #ifdef ENABLE_WALLET
89 
93  void addWallet(WalletModel* walletModel);
94  void removeWallet(WalletModel* walletModel);
95  void removeAllWallets();
96 #endif // ENABLE_WALLET
97  bool enableWallet = false;
98 
102  bool hasTrayIcon() const { return trayIcon; }
103 
106 
107  bool isPrivacyModeActivated() const;
108 
109 protected:
110  void changeEvent(QEvent *e) override;
111  void closeEvent(QCloseEvent *event) override;
112  void showEvent(QShowEvent *event) override;
113  void dragEnterEvent(QDragEnterEvent *event) override;
114  void dropEvent(QDropEvent *event) override;
115  bool eventFilter(QObject *object, QEvent *event) override;
116 
117 private:
120  std::unique_ptr<interfaces::Handler> m_handler_message_box;
121  std::unique_ptr<interfaces::Handler> m_handler_question;
124 
131  QLabel* progressBarLabel = nullptr;
133  QProgressDialog* progressDialog = nullptr;
134 
135  QMenuBar* appMenuBar = nullptr;
136  QToolBar* appToolBar = nullptr;
137  QAction* overviewAction = nullptr;
138  QAction* historyAction = nullptr;
139  QAction* quitAction = nullptr;
140  QAction* sendCoinsAction = nullptr;
141  QAction* usedSendingAddressesAction = nullptr;
142  QAction* usedReceivingAddressesAction = nullptr;
143  QAction* signMessageAction = nullptr;
144  QAction* verifyMessageAction = nullptr;
145  QAction* m_load_psbt_action = nullptr;
146  QAction* m_load_psbt_clipboard_action = nullptr;
147  QAction* aboutAction = nullptr;
148  QAction* receiveCoinsAction = nullptr;
149  QAction* optionsAction = nullptr;
150  QAction* encryptWalletAction = nullptr;
151  QAction* backupWalletAction = nullptr;
152  QAction* changePassphraseAction = nullptr;
153  QAction* aboutQtAction = nullptr;
154  QAction* openRPCConsoleAction = nullptr;
155  QAction* openAction = nullptr;
156  QAction* showHelpMessageAction = nullptr;
157  QAction* m_create_wallet_action{nullptr};
158  QAction* m_open_wallet_action{nullptr};
159  QMenu* m_open_wallet_menu{nullptr};
160  QAction* m_restore_wallet_action{nullptr};
161  QAction* m_close_wallet_action{nullptr};
162  QAction* m_close_all_wallets_action{nullptr};
163  QAction* m_wallet_selector_label_action = nullptr;
164  QAction* m_wallet_selector_action = nullptr;
165  QAction* m_mask_values_action{nullptr};
166  QAction* m_migrate_wallet_action{nullptr};
167  QMenu* m_migrate_wallet_menu{nullptr};
168 
169  QLabel *m_wallet_selector_label = nullptr;
170  QComboBox* m_wallet_selector = nullptr;
171 
172  QSystemTrayIcon* trayIcon = nullptr;
173  const std::unique_ptr<QMenu> trayIconMenu;
175  RPCConsole* rpcConsole = nullptr;
178 
179  QMenu* m_network_context_menu = new QMenu(this);
180 
181 #ifdef Q_OS_MACOS
182  CAppNapInhibitor* m_app_nap_inhibitor = nullptr;
183 #endif
184 
186  int prevBlocks = 0;
187  int spinnerFrame = 0;
188 
191 
193  void createActions();
195  void createMenuBar();
197  void createToolBars();
199  void createTrayIcon();
201  void createTrayIconMenu();
202 
204  void setWalletActionsEnabled(bool enabled);
205 
207  void subscribeToCoreSignals();
208 
210  void updateNetworkState();
211 
213  void updateHeadersPresyncProgressLabel(int64_t height, const QDateTime& blockDate);
214 
217 
218 Q_SIGNALS:
219  void quitRequested();
221  void receivedURI(const QString &uri);
223  void consoleShown(RPCConsole* console);
224  void setPrivacy(bool privacy);
225 
226 public Q_SLOTS:
228  void setNumConnections(int count);
230  void setNetworkActive(bool network_active);
232  void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state);
234  void createWallet();
235 
244  void message(const QString& title, QString message, unsigned int style, bool* ret = nullptr, const QString& detailed_message = QString());
245 
246 #ifdef ENABLE_WALLET
247  void setCurrentWallet(WalletModel* wallet_model);
248  void setCurrentWalletBySelectorIndex(int index);
251  void updateWalletStatus();
252 
253 private:
258  void setEncryptionStatus(int status);
259 
264  void setHDStatus(bool privkeyDisabled, int hdEnabled);
265 
266 public Q_SLOTS:
267  bool handlePaymentRequest(const SendCoinsRecipient& recipient);
268 
270  void incomingTransaction(const QString& date, BitcoinUnit unit, const CAmount& amount, const QString& type, const QString& address, const QString& label, const QString& walletName);
271 #endif // ENABLE_WALLET
272 
273 private:
275  void updateProxyIcon();
276  void updateWindowTitle();
277 
278 public Q_SLOTS:
279 #ifdef ENABLE_WALLET
280 
281  void gotoOverviewPage();
283  void gotoHistoryPage();
285  void gotoReceiveCoinsPage();
287  void gotoSendCoinsPage(QString addr = "");
288 
290  void gotoSignMessageTab(QString addr = "");
292  void gotoVerifyMessageTab(QString addr = "");
294  void gotoLoadPSBT(bool from_clipboard = false);
296  void enableHistoryAction(bool privacy);
297 
299  void openClicked();
300 #endif // ENABLE_WALLET
301 
302  void optionsClicked();
304  void aboutClicked();
306  void showDebugWindow();
310  void showHelpMessageClicked();
311 
314  void showNormalIfMinimized(bool fToggleHidden);
316  void toggleHidden();
317 
319  void detectShutdown();
320 
322  void showProgress(const QString &title, int nProgress);
323 
324  void showModalOverlay();
325 };
326 
327 class UnitDisplayStatusBarControl : public QLabel
328 {
329  Q_OBJECT
330 
331 public:
332  explicit UnitDisplayStatusBarControl(const PlatformStyle *platformStyle);
335 
336 protected:
338  void mousePressEvent(QMouseEvent *event) override;
339  void changeEvent(QEvent* e) override;
340 
341 private:
343  QMenu* menu{nullptr};
345 
347  void onDisplayUnitsClicked(const QPoint& point);
349  void createContextMenu();
350 
351 private Q_SLOTS:
353  void updateDisplayUnit(BitcoinUnit newUnits);
355  void onMenuSelection(QAction* action);
356 };
357 
358 #endif // BITCOIN_QT_BITCOINGUI_H
void subscribeToCoreSignals()
Connect core signals to GUI client.
void unsubscribeFromCoreSignals()
Disconnect core signals from GUI client.
void showEvent(QShowEvent *event) override
QMenu * m_migrate_wallet_menu
Definition: bitcoingui.h:167
int ret
QAction * receiveCoinsAction
Definition: bitcoingui.h:148
UnitDisplayStatusBarControl * unitDisplayControl
Definition: bitcoingui.h:125
Local Bitcoin RPC console.
Definition: rpcconsole.h:43
QMenuBar * appMenuBar
Definition: bitcoingui.h:135
void quitRequested()
Unit
Bitcoin units.
Definition: bitcoinunits.h:42
QAction * m_mask_values_action
Definition: bitcoingui.h:165
QAction * signMessageAction
Definition: bitcoingui.h:143
void receivedURI(const QString &uri)
Signal raised when a URI was entered or dragged to the GUI.
Utility functions used by the Bitcoin Qt UI.
Definition: bitcoingui.h:60
SynchronizationState
Current sync state passed to tip changed callbacks.
Definition: validation.h:87
QAction * aboutAction
Definition: bitcoingui.h:147
void updateNetworkState()
Update UI with latest network info from model.
Definition: bitcoingui.cpp:984
void showNormalIfMinimized()
Show window if hidden, unminimize when minimized, rise when obscured or show if hidden and fToggleHid...
Definition: bitcoingui.h:313
UnitDisplayStatusBarControl(const PlatformStyle *platformStyle)
QProgressDialog * progressDialog
Definition: bitcoingui.h:133
void consoleShown(RPCConsole *console)
Signal raised when RPC console shown.
void createTrayIcon()
Create system tray icon and notification.
Definition: bitcoingui.cpp:808
void showDebugWindow()
Show debug window.
Definition: bitcoingui.cpp:918
GUIUtil::ClickableLabel * labelProxyIcon
Definition: bitcoingui.h:128
ClientModel * clientModel
Definition: bitcoingui.h:122
void createToolBars()
Create the toolbars.
Definition: bitcoingui.cpp:565
QAction * m_load_psbt_action
Definition: bitcoingui.h:145
ModalOverlay * modalOverlay
Definition: bitcoingui.h:177
void createTrayIconMenu()
Create system tray menu (or setup the dock menu)
Definition: bitcoingui.cpp:821
RPCConsole * rpcConsole
Definition: bitcoingui.h:175
QAction * m_wallet_selector_action
Definition: bitcoingui.h:164
QAction * m_migrate_wallet_action
Definition: bitcoingui.h:166
QAction * overviewAction
Definition: bitcoingui.h:137
QAction * verifyMessageAction
Definition: bitcoingui.h:144
QAction * quitAction
Definition: bitcoingui.h:139
QAction * m_open_wallet_action
Definition: bitcoingui.h:158
QAction * m_close_wallet_action
Definition: bitcoingui.h:161
QAction * historyAction
Definition: bitcoingui.h:138
void updateHeadersPresyncProgressLabel(int64_t height, const QDateTime &blockDate)
void setWalletActionsEnabled(bool enabled)
Enable or disable all wallet-related actions.
Definition: bitcoingui.cpp:789
QAction * aboutQtAction
Definition: bitcoingui.h:153
void setClientModel(ClientModel *clientModel=nullptr, interfaces::BlockAndHeaderTipInfo *tip_info=nullptr)
Set the client model.
Definition: bitcoingui.cpp:601
Controller between interfaces::Node, WalletModel instances and the GUI.
QMenu * m_open_wallet_menu
Definition: bitcoingui.h:159
Bitcoin GUI main class.
Definition: bitcoingui.h:69
HelpMessageDialog * helpMessageDialog
Definition: bitcoingui.h:176
QLabel * progressBarLabel
Definition: bitcoingui.h:131
QSystemTrayIcon * trayIcon
Definition: bitcoingui.h:172
QAction * showHelpMessageAction
Definition: bitcoingui.h:156
Modal overlay to display information about the chain-sync state.
Definition: modaloverlay.h:20
bool isPrivacyModeActivated() const
void changeEvent(QEvent *e) override
void changeEvent(QEvent *e) override
void setNetworkActive(bool network_active)
Set network state shown in the UI.
GUIUtil::ClickableLabel * connectionsControl
Definition: bitcoingui.h:129
QAction * backupWalletAction
Definition: bitcoingui.h:151
QAction * m_load_psbt_clipboard_action
Definition: bitcoingui.h:146
void setOptionsModel(OptionsModel *optionsModel)
Lets the control know about the Options Model (and its signals)
void dropEvent(QDropEvent *event) override
void openOptionsDialogWithTab(OptionsDialog::Tab tab)
Open the OptionsDialog on the specified tab index.
QAction * usedReceivingAddressesAction
Definition: bitcoingui.h:142
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
void showModalOverlay()
const NetworkStyle *const m_network_style
Definition: bitcoingui.h:190
WalletController * m_wallet_controller
Definition: bitcoingui.h:119
const PlatformStyle * platformStyle
Definition: bitcoingui.h:189
void showProgress(const QString &title, int nProgress)
Show progress dialog e.g.
QAction * m_wallet_selector_label_action
Definition: bitcoingui.h:163
OptionsModel * optionsModel
Definition: bitcoingui.h:342
QLabel * m_wallet_selector_label
Definition: bitcoingui.h:169
void optionsClicked()
Show configuration dialog.
Definition: bitcoingui.cpp:904
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.
QToolBar * appToolBar
Definition: bitcoingui.h:136
WalletFrame * walletFrame
Definition: bitcoingui.h:123
QAction * usedSendingAddressesAction
Definition: bitcoingui.h:141
BitcoinGUI(interfaces::Node &node, const PlatformStyle *platformStyle, const NetworkStyle *networkStyle, QWidget *parent=nullptr)
Definition: bitcoingui.cpp:83
void updateDisplayUnit(BitcoinUnit newUnits)
When Display Units are changed on OptionsModel it will refresh the display text of the control on the...
bool enableWallet
Definition: bitcoingui.h:97
QAction * openRPCConsoleAction
Definition: bitcoingui.h:154
QAction * m_close_all_wallets_action
Definition: bitcoingui.h:162
void detectShutdown()
called by a timer to check if ShutdownRequested() has been set
Cross-platform desktop notification client.
Definition: notificator.h:24
Block and header tip information.
Definition: node.h:49
GUIUtil::ClickableLabel * labelBlocksIcon
Definition: bitcoingui.h:130
GUIUtil::ClickableProgressBar * progressBar
Definition: bitcoingui.h:132
void updateWindowTitle()
void showHelpMessageClicked()
Show help message dialog.
Definition: bitcoingui.cpp:930
Notificator * notificator
Definition: bitcoingui.h:174
Model for Bitcoin network client.
Definition: clientmodel.h:53
void mousePressEvent(QMouseEvent *event) override
So that it responds to left-button clicks.
bool hasTrayIcon() const
Get the tray icon status.
Definition: bitcoingui.h:102
QAction * sendCoinsAction
Definition: bitcoingui.h:140
QAction * m_create_wallet_action
Definition: bitcoingui.h:157
SyncType
Definition: clientmodel.h:39
Definition: init.h:25
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.
QAction * openAction
Definition: bitcoingui.h:155
void updateProxyIcon()
Set the proxy-enabled icon as shown in the UI.
QAction * changePassphraseAction
Definition: bitcoingui.h:152
const std::unique_ptr< QMenu > trayIconMenu
Definition: bitcoingui.h:173
QMenu * m_network_context_menu
Definition: bitcoingui.h:179
void setPrivacy(bool privacy)
Interface from Qt to configuration data structure for Bitcoin client.
Definition: optionsmodel.h:40
std::unique_ptr< interfaces::Handler > m_handler_question
Definition: bitcoingui.h:121
Interface to Bitcoin wallet from Qt view code.
Definition: walletmodel.h:51
QAction * m_restore_wallet_action
Definition: bitcoingui.h:160
bool eventFilter(QObject *object, QEvent *event) override
int prevBlocks
Keep track of previous number of blocks, to detect progress.
Definition: bitcoingui.h:186
void toggleHidden()
Simply calls showNormalIfMinimized(true)
interfaces::Node & m_node
Definition: bitcoingui.h:118
int spinnerFrame
Definition: bitcoingui.h:187
GUIUtil::ThemedLabel * labelWalletEncryptionIcon
Definition: bitcoingui.h:126
static int count
void setNumConnections(int count)
Set number of connections shown in the UI.
"Help message" dialog box
Definition: utilitydialog.h:20
void closeEvent(QCloseEvent *event) override
QComboBox * m_wallet_selector
Definition: bitcoingui.h:170
void createContextMenu()
Creates context menu, its actions, and wires up all the relevant signals for mouse events...
void showDebugWindowActivateConsole()
Show debug window and set focus to the console.
Definition: bitcoingui.cpp:924
void createActions()
Create the main UI actions.
Definition: bitcoingui.cpp:245
QAction * optionsAction
Definition: bitcoingui.h:149
QAction * encryptWalletAction
Definition: bitcoingui.h:150
void aboutClicked()
Show about dialog.
Definition: bitcoingui.cpp:909
const PlatformStyle * m_platform_style
Definition: bitcoingui.h:344
void createWallet()
Launch the wallet creation modal (no-op if wallet is not compiled)
void updateHeadersSyncProgressLabel()
static const std::string DEFAULT_UIPLATFORM
Definition: bitcoingui.h:74
GUIUtil::ThemedLabel * labelWalletHDStatusIcon
Definition: bitcoingui.h:127
Top-level interface for a bitcoin node (bitcoind process).
Definition: node.h:69
A container for embedding all wallet-related controls into BitcoinGUI.
Definition: walletframe.h:28
void onDisplayUnitsClicked(const QPoint &point)
Shows context menu with Display Unit options by the mouse coordinates.
void createMenuBar()
Create the menu bar and sub-menus.
Definition: bitcoingui.cpp:471
void onMenuSelection(QAction *action)
Tells underlying optionsModel to update its current display unit.
std::unique_ptr< interfaces::Handler > m_handler_message_box
Definition: bitcoingui.h:120
void dragEnterEvent(QDragEnterEvent *event) override