interface_ui.h raw
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2012-2022 The Limenka developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6 #ifndef LIMENKA_NODE_INTERFACE_UI_H
7 #define LIMENKA_NODE_INTERFACE_UI_H
8
9 #include <cstdint>
10 #include <functional>
11 #include <string>
12 #include <vector>
13
14 class CBlockIndex;
15 enum class SynchronizationState;
16 struct bilingual_str;
17
18 namespace boost {
19 namespace signals2 {
20 class connection;
21 }
22 } // namespace boost
23
24 /** Signals for UI communication. */
25 class CClientUIInterface
26 {
27 public:
28 /** Flags for CClientUIInterface::ThreadSafeMessageBox */
29 enum MessageBoxFlags : uint32_t {
30 ICON_INFORMATION = 0,
31 ICON_WARNING = (1U << 0),
32 ICON_ERROR = (1U << 1),
33 /**
34 * Mask of all available icons in CClientUIInterface::MessageBoxFlags
35 * This needs to be updated, when icons are changed there!
36 */
37 ICON_MASK = (ICON_INFORMATION | ICON_WARNING | ICON_ERROR),
38
39 /** These values are taken from qmessagebox.h "enum StandardButton" to be directly usable */
40 BTN_OK = 0x00000400U, // QMessageBox::Ok
41 BTN_YES = 0x00004000U, // QMessageBox::Yes
42 BTN_NO = 0x00010000U, // QMessageBox::No
43 BTN_ABORT = 0x00040000U, // QMessageBox::Abort
44 BTN_RETRY = 0x00080000U, // QMessageBox::Retry
45 BTN_IGNORE = 0x00100000U, // QMessageBox::Ignore
46 BTN_CLOSE = 0x00200000U, // QMessageBox::Close
47 BTN_CANCEL = 0x00400000U, // QMessageBox::Cancel
48 BTN_DISCARD = 0x00800000U, // QMessageBox::Discard
49 BTN_HELP = 0x01000000U, // QMessageBox::Help
50 BTN_APPLY = 0x02000000U, // QMessageBox::Apply
51 BTN_RESET = 0x04000000U, // QMessageBox::Reset
52 /**
53 * Mask of all available buttons in CClientUIInterface::MessageBoxFlags
54 * This needs to be updated, when buttons are changed there!
55 */
56 BTN_MASK = (BTN_OK | BTN_YES | BTN_NO | BTN_ABORT | BTN_RETRY | BTN_IGNORE |
57 BTN_CLOSE | BTN_CANCEL | BTN_DISCARD | BTN_HELP | BTN_APPLY | BTN_RESET),
58
59 /** Force blocking, modal message box dialog (not just OS notification) */
60 MODAL = 0x10000000U,
61
62 /** Do not print contents of message to debug log */
63 SECURE = 0x40000000U,
64
65 /** Predefined combinations for certain default usage cases */
66 MSG_INFORMATION = ICON_INFORMATION,
67 MSG_WARNING = (ICON_WARNING | BTN_OK | MODAL),
68 MSG_ERROR = (ICON_ERROR | BTN_OK | MODAL)
69 };
70
71 #define ADD_SIGNALS_DECL_WRAPPER(signal_name, rtype, ...) \
72 rtype signal_name(__VA_ARGS__); \
73 using signal_name##Sig = rtype(__VA_ARGS__); \
74 boost::signals2::connection signal_name##_connect(std::function<signal_name##Sig> fn);
75
76 /** Show message box. */
77 ADD_SIGNALS_DECL_WRAPPER(ThreadSafeMessageBox, bool, const bilingual_str& message, const std::string& caption, unsigned int style);
78
79 /** If possible, ask the user a question. If not, falls back to ThreadSafeMessageBox(noninteractive_message, caption, style) and returns false. */
80 ADD_SIGNALS_DECL_WRAPPER(ThreadSafeQuestion, bool, const bilingual_str& message, const std::string& noninteractive_message, const std::string& caption, unsigned int style);
81
82 /** Progress message during initialization. */
83 ADD_SIGNALS_DECL_WRAPPER(InitMessage, void, const std::string& message);
84
85 /** Wallet loader created. */
86 ADD_SIGNALS_DECL_WRAPPER(InitWallet, void, );
87
88 /** Number of network connections changed. */
89 ADD_SIGNALS_DECL_WRAPPER(NotifyNumConnectionsChanged, void, int newNumConnections);
90
91 /** Network activity state changed. */
92 ADD_SIGNALS_DECL_WRAPPER(NotifyNetworkActiveChanged, void, bool networkActive);
93
94 /** Network local addresses changed. */
95 ADD_SIGNALS_DECL_WRAPPER(NotifyNetworkLocalChanged, void, );
96
97 /**
98 * Status bar alerts changed.
99 */
100 ADD_SIGNALS_DECL_WRAPPER(NotifyAlertChanged, void, );
101
102 /**
103 * Show progress e.g. for verifychain.
104 * resume_possible indicates shutting down now will result in the current progress action resuming upon restart.
105 */
106 ADD_SIGNALS_DECL_WRAPPER(ShowProgress, void, const std::string& title, int nProgress, bool resume_possible);
107
108 /** New block has been accepted */
109 ADD_SIGNALS_DECL_WRAPPER(NotifyBlockTip, void, SynchronizationState, const CBlockIndex*);
110
111 /** Best header has changed */
112 ADD_SIGNALS_DECL_WRAPPER(NotifyHeaderTip, void, SynchronizationState, int64_t height, int64_t timestamp, bool presync);
113
114 /** Banlist did change. */
115 ADD_SIGNALS_DECL_WRAPPER(BannedListChanged, void, void);
116 };
117
118 /** Show warning message **/
119 void InitWarning(const bilingual_str& str);
120
121 /** Show error message **/
122 bool InitError(const bilingual_str& str);
123 bool InitError(const bilingual_str& str, const std::vector<std::string>& details);
124
125 extern CClientUIInterface uiInterface;
126
127 #endif // LIMENKA_NODE_INTERFACE_UI_H
128