bitcoingui.h raw
1 // Copyright (c) 2011-present 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 #include <bitcoin-build-config.h> // IWYU pragma: keep
9
10 #include <qt/bitcoinunits.h>
11 #include <qt/clientmodel.h>
12 #include <qt/guiutil.h>
13 #include <qt/optionsdialog.h>
14
15 #include <consensus/amount.h>
16
17 #include <QLabel>
18 #include <QMainWindow>
19 #include <QMap>
20 #include <QMenu>
21 #include <QPoint>
22 #include <QSystemTrayIcon>
23
24 #ifdef Q_OS_MACOS
25 #include <qt/macos_appnap.h>
26 #endif
27
28 #include <memory>
29
30 class NetworkStyle;
31 class Notificator;
32 class OptionsModel;
33 class PlatformStyle;
34 class RPCConsole;
35 class SendCoinsRecipient;
36 class UnitDisplayStatusBarControl;
37 class WalletController;
38 class WalletFrame;
39 class WalletModel;
40 class HelpMessageDialog;
41 class ModalOverlay;
42 enum class SynchronizationState;
43
44 namespace interfaces {
45 class Handler;
46 class Node;
47 struct BlockAndHeaderTipInfo;
48 }
49
50 QT_BEGIN_NAMESPACE
51 class QAction;
52 class QComboBox;
53 class QDateTime;
54 class QProgressBar;
55 class QProgressDialog;
56 QT_END_NAMESPACE
57
58 namespace GUIUtil {
59 class ClickableLabel;
60 class ClickableProgressBar;
61 }
62
63 /**
64 Bitcoin GUI main class. This class represents the main window of the Bitcoin UI. It communicates with both the client and
65 wallet models to give the user an up-to-date view of the current core state.
66 */
67 class BitcoinGUI : public QMainWindow
68 {
69 Q_OBJECT
70
71 public:
72 static const std::string DEFAULT_UIPLATFORM;
73
74 explicit BitcoinGUI(interfaces::Node& node, const PlatformStyle *platformStyle, const NetworkStyle *networkStyle, QWidget *parent = nullptr);
75 ~BitcoinGUI();
76
77 /** Set the client model.
78 The client model represents the part of the core that communicates with the P2P network, and is wallet-agnostic.
79 */
80 void setClientModel(ClientModel *clientModel = nullptr, interfaces::BlockAndHeaderTipInfo* tip_info = nullptr);
81 #ifdef ENABLE_WALLET
82 void setWalletController(WalletController* wallet_controller, bool show_loading_minimized);
83 WalletController* getWalletController();
84 #endif
85
86 #ifdef ENABLE_WALLET
87 /** Set the wallet model.
88 The wallet model represents a bitcoin wallet, and offers access to the list of transactions, address book and sending
89 functionality.
90 */
91 void addWallet(WalletModel* walletModel);
92 void removeWallet(WalletModel* walletModel);
93 void removeAllWallets();
94 #endif // ENABLE_WALLET
95 bool enableWallet = false;
96
97 /** Get the tray icon status.
98 Some systems have not "system tray" or "notification area" available.
99 */
100 bool hasTrayIcon() const { return trayIcon; }
101
102 /** Disconnect core signals from GUI client */
103 void unsubscribeFromCoreSignals();
104
105 bool isPrivacyModeActivated() const;
106
107 protected:
108 void changeEvent(QEvent *e) override;
109 void closeEvent(QCloseEvent *event) override;
110 void showEvent(QShowEvent *event) override;
111 void dragEnterEvent(QDragEnterEvent *event) override;
112 void dropEvent(QDropEvent *event) override;
113 bool eventFilter(QObject *object, QEvent *event) override;
114
115 private:
116 interfaces::Node& m_node;
117 WalletController* m_wallet_controller{nullptr};
118 std::unique_ptr<interfaces::Handler> m_handler_message_box;
119 std::unique_ptr<interfaces::Handler> m_handler_question;
120 ClientModel* clientModel = nullptr;
121 WalletFrame* walletFrame = nullptr;
122
123 UnitDisplayStatusBarControl* unitDisplayControl = nullptr;
124 GUIUtil::ThemedLabel* labelWalletEncryptionIcon = nullptr;
125 GUIUtil::ThemedLabel* labelWalletHDStatusIcon = nullptr;
126 GUIUtil::ClickableLabel* labelProxyIcon = nullptr;
127 GUIUtil::ClickableLabel* connectionsControl = nullptr;
128 GUIUtil::ClickableLabel* labelBlocksIcon = nullptr;
129 QLabel* progressBarLabel = nullptr;
130 GUIUtil::ClickableProgressBar* progressBar = nullptr;
131 QProgressDialog* progressDialog = nullptr;
132
133 QMenuBar* appMenuBar = nullptr;
134 QToolBar* appToolBar = nullptr;
135 QAction* overviewAction = nullptr;
136 QAction* historyAction = nullptr;
137 QAction* quitAction = nullptr;
138 QAction* sendCoinsAction = nullptr;
139 QAction* usedSendingAddressesAction = nullptr;
140 QAction* usedReceivingAddressesAction = nullptr;
141 QAction* signMessageAction = nullptr;
142 QAction* verifyMessageAction = nullptr;
143 QAction* m_load_psbt_action = nullptr;
144 QAction* m_load_psbt_clipboard_action = nullptr;
145 QAction* aboutAction = nullptr;
146 QAction* receiveCoinsAction = nullptr;
147 QAction* optionsAction = nullptr;
148 QAction* encryptWalletAction = nullptr;
149 QAction* backupWalletAction = nullptr;
150 QAction* changePassphraseAction = nullptr;
151 QAction* aboutQtAction = nullptr;
152 QAction* openRPCConsoleAction = nullptr;
153 QAction* openAction = nullptr;
154 QAction* showHelpMessageAction = nullptr;
155 QAction* m_create_wallet_action{nullptr};
156 QAction* m_open_wallet_action{nullptr};
157 QMenu* m_open_wallet_menu{nullptr};
158 QAction* m_restore_wallet_action{nullptr};
159 QAction* m_close_wallet_action{nullptr};
160 QAction* m_close_all_wallets_action{nullptr};
161 QAction* m_wallet_selector_label_action = nullptr;
162 QAction* m_wallet_selector_action = nullptr;
163 QAction* m_mask_values_action{nullptr};
164 QAction* m_migrate_wallet_action{nullptr};
165 QMenu* m_migrate_wallet_menu{nullptr};
166
167 QLabel *m_wallet_selector_label = nullptr;
168 QComboBox* m_wallet_selector = nullptr;
169
170 QSystemTrayIcon* trayIcon = nullptr;
171 const std::unique_ptr<QMenu> trayIconMenu;
172 Notificator* notificator = nullptr;
173 RPCConsole* rpcConsole = nullptr;
174 HelpMessageDialog* helpMessageDialog = nullptr;
175 ModalOverlay* modalOverlay = nullptr;
176
177 QMenu* m_network_context_menu = new QMenu(this);
178
179 #ifdef Q_OS_MACOS
180 CAppNapInhibitor* m_app_nap_inhibitor = nullptr;
181 #endif
182
183 /** Keep track of previous number of blocks, to detect progress */
184 int prevBlocks = 0;
185 int spinnerFrame = 0;
186
187 const PlatformStyle *platformStyle;
188 const NetworkStyle* const m_network_style;
189
190 /** Create the main UI actions. */
191 void createActions();
192 /** Create the menu bar and sub-menus. */
193 void createMenuBar();
194 /** Create the toolbars */
195 void createToolBars();
196 /** Create system tray icon and notification */
197 void createTrayIcon();
198 /** Create system tray menu (or setup the dock menu) */
199 void createTrayIconMenu();
200
201 /** Enable or disable all wallet-related actions */
202 void setWalletActionsEnabled(bool enabled);
203
204 /** Connect core signals to GUI client */
205 void subscribeToCoreSignals();
206
207 /** Update UI with latest network info from model. */
208 void updateNetworkState();
209
210 void updateHeadersSyncProgressLabel();
211 void updateHeadersPresyncProgressLabel(int64_t height, const QDateTime& blockDate);
212
213 /** Open the OptionsDialog on the specified tab index */
214 void openOptionsDialogWithTab(OptionsDialog::Tab tab);
215
216 Q_SIGNALS:
217 void quitRequested();
218 /** Signal raised when a URI was entered or dragged to the GUI */
219 void receivedURI(const QString &uri);
220 /** Signal raised when RPC console shown */
221 void consoleShown(RPCConsole* console);
222 void setPrivacy(bool privacy);
223
224 public Q_SLOTS:
225 /** Set number of connections shown in the UI */
226 void setNumConnections(int count);
227 /** Set network state shown in the UI */
228 void setNetworkActive(bool network_active);
229 /** Set number of blocks and last block date shown in the UI */
230 void setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state);
231 /** Launch the wallet creation modal (no-op if wallet is not compiled) **/
232 void createWallet();
233
234 /** Notify the user of an event from the core network or transaction handling code.
235 @param[in] title the message box / notification title
236 @param[in] message the displayed text
237 @param[in] style modality and style definitions (icon and used buttons - buttons only for message boxes)
238 @see CClientUIInterface::MessageBoxFlags
239 @param[in] ret pointer to a bool that will be modified to whether Ok was clicked (modal only)
240 @param[in] detailed_message the text to be displayed in the details area
241 */
242 void message(const QString& title, QString message, unsigned int style, bool* ret = nullptr, const QString& detailed_message = QString());
243
244 #ifdef ENABLE_WALLET
245 void setCurrentWallet(WalletModel* wallet_model);
246 void setCurrentWalletBySelectorIndex(int index);
247 /** Set the UI status indicators based on the currently selected wallet.
248 */
249 void updateWalletStatus();
250
251 private:
252 /** Set the encryption status as shown in the UI.
253 @param[in] status current encryption status
254 @see WalletModel::EncryptionStatus
255 */
256 void setEncryptionStatus(int status);
257
258 /** Set the hd-enabled status as shown in the UI.
259 @param[in] hdEnabled current hd enabled status
260 @see WalletModel::EncryptionStatus
261 */
262 void setHDStatus(bool privkeyDisabled, int hdEnabled);
263
264 public Q_SLOTS:
265 bool handlePaymentRequest(const SendCoinsRecipient& recipient);
266
267 /** Show incoming transaction notification for new transactions. */
268 void incomingTransaction(const QString& date, BitcoinUnit unit, const CAmount& amount, const QString& type, const QString& address, const QString& label, const QString& walletName);
269 #endif // ENABLE_WALLET
270
271 private:
272 /** Set the proxy-enabled icon as shown in the UI. */
273 void updateProxyIcon();
274 void updateWindowTitle();
275
276 public Q_SLOTS:
277 #ifdef ENABLE_WALLET
278 /** Switch to overview (home) page */
279 void gotoOverviewPage();
280 /** Switch to history (transactions) page */
281 void gotoHistoryPage();
282 /** Switch to receive coins page */
283 void gotoReceiveCoinsPage();
284 /** Switch to send coins page */
285 void gotoSendCoinsPage(QString addr = "");
286
287 /** Show Sign/Verify Message dialog and switch to sign message tab */
288 void gotoSignMessageTab(QString addr = "");
289 /** Show Sign/Verify Message dialog and switch to verify message tab */
290 void gotoVerifyMessageTab(QString addr = "");
291 /** Load Partially Signed Bitcoin Transaction from file or clipboard */
292 void gotoLoadPSBT(bool from_clipboard = false);
293 /** Enable history action when privacy is changed */
294 void enableHistoryAction(bool privacy);
295
296 /** Show open dialog */
297 void openClicked();
298 #endif // ENABLE_WALLET
299 /** Show configuration dialog */
300 void optionsClicked();
301 /** Show about dialog */
302 void aboutClicked();
303 /** Show debug window */
304 void showDebugWindow();
305 /** Show debug window and set focus to the console */
306 void showDebugWindowActivateConsole();
307 /** Show help message dialog */
308 void showHelpMessageClicked();
309
310 /** Show window if hidden, unminimize when minimized, rise when obscured or show if hidden and fToggleHidden is true */
311 void showNormalIfMinimized() { showNormalIfMinimized(false); }
312 void showNormalIfMinimized(bool fToggleHidden);
313 /** Simply calls showNormalIfMinimized(true) */
314 void toggleHidden();
315
316 /** called by a timer to check if shutdown has been requested */
317 void detectShutdown();
318
319 /** Show progress dialog e.g. for verifychain */
320 void showProgress(const QString &title, int nProgress);
321
322 void showModalOverlay();
323 };
324
325 class UnitDisplayStatusBarControl : public QLabel
326 {
327 Q_OBJECT
328
329 public:
330 explicit UnitDisplayStatusBarControl(const PlatformStyle *platformStyle);
331 /** Lets the control know about the Options Model (and its signals) */
332 void setOptionsModel(OptionsModel *optionsModel);
333
334 protected:
335 /** So that it responds to left-button clicks */
336 void mousePressEvent(QMouseEvent *event) override;
337 void changeEvent(QEvent* e) override;
338
339 private:
340 OptionsModel* optionsModel{nullptr};
341 QMenu* menu{nullptr};
342 const PlatformStyle* m_platform_style;
343
344 /** Shows context menu with Display Unit options by the mouse coordinates */
345 void onDisplayUnitsClicked(const QPoint& point);
346 /** Creates context menu, its actions, and wires up all the relevant signals for mouse events. */
347 void createContextMenu();
348
349 private Q_SLOTS:
350 /** When Display Units are changed on OptionsModel it will refresh the display text of the control on the status bar */
351 void updateDisplayUnit(BitcoinUnit newUnits);
352 /** Tells underlying optionsModel to update its current display unit. */
353 void onMenuSelection(QAction* action);
354 };
355
356 #endif // BITCOIN_QT_BITCOINGUI_H
357