Line data Source code
1 : // Copyright (c) 2011-2013 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_GUIUTIL_H
6 : #define BITCOIN_QT_GUIUTIL_H
7 :
8 : #include "amount.h"
9 :
10 : #include <QEvent>
11 : #include <QHeaderView>
12 : #include <QMessageBox>
13 : #include <QObject>
14 : #include <QProgressBar>
15 : #include <QString>
16 : #include <QTableView>
17 :
18 : #include <boost/filesystem.hpp>
19 :
20 : class QValidatedLineEdit;
21 : class SendCoinsRecipient;
22 :
23 : QT_BEGIN_NAMESPACE
24 : class QAbstractItemView;
25 : class QDateTime;
26 : class QFont;
27 : class QLineEdit;
28 : class QUrl;
29 : class QWidget;
30 : QT_END_NAMESPACE
31 :
32 : /** Utility functions used by the Bitcoin Qt UI.
33 : */
34 : namespace GUIUtil
35 : {
36 : // Create human-readable string from date
37 : QString dateTimeStr(const QDateTime &datetime);
38 : QString dateTimeStr(qint64 nTime);
39 :
40 : // Render Bitcoin addresses in monospace font
41 : QFont bitcoinAddressFont();
42 :
43 : // Set up widgets for address and amounts
44 : void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent);
45 : void setupAmountWidget(QLineEdit *widget, QWidget *parent);
46 :
47 : // Parse "bitcoin:" URI into recipient object, return true on successful parsing
48 : bool parseBitcoinURI(const QUrl &uri, SendCoinsRecipient *out);
49 : bool parseBitcoinURI(QString uri, SendCoinsRecipient *out);
50 : QString formatBitcoinURI(const SendCoinsRecipient &info);
51 :
52 : // Returns true if given address+amount meets "dust" definition
53 : bool isDust(const QString& address, const CAmount& amount);
54 :
55 : // HTML escaping for rich text controls
56 : QString HtmlEscape(const QString& str, bool fMultiLine=false);
57 : QString HtmlEscape(const std::string& str, bool fMultiLine=false);
58 :
59 : /** Copy a field of the currently selected entry of a view to the clipboard. Does nothing if nothing
60 : is selected.
61 : @param[in] column Data column to extract from the model
62 : @param[in] role Data role to extract from the model
63 : @see TransactionView::copyLabel, TransactionView::copyAmount, TransactionView::copyAddress
64 : */
65 : void copyEntryData(QAbstractItemView *view, int column, int role=Qt::EditRole);
66 :
67 : /** Return a field of the currently selected entry as a QString. Does nothing if nothing
68 : is selected.
69 : @param[in] column Data column to extract from the model
70 : @param[in] role Data role to extract from the model
71 : @see TransactionView::copyLabel, TransactionView::copyAmount, TransactionView::copyAddress
72 : */
73 : QString getEntryData(QAbstractItemView *view, int column, int role);
74 :
75 : void setClipboard(const QString& str);
76 :
77 : /** Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix
78 : when no suffix is provided by the user.
79 :
80 : @param[in] parent Parent window (or 0)
81 : @param[in] caption Window caption (or empty, for default)
82 : @param[in] dir Starting directory (or empty, to default to documents directory)
83 : @param[in] filter Filter specification such as "Comma Separated Files (*.csv)"
84 : @param[out] selectedSuffixOut Pointer to return the suffix (file type) that was selected (or 0).
85 : Can be useful when choosing the save file format based on suffix.
86 : */
87 : QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir,
88 : const QString &filter,
89 : QString *selectedSuffixOut);
90 :
91 : /** Get open filename, convenience wrapper for QFileDialog::getOpenFileName.
92 :
93 : @param[in] parent Parent window (or 0)
94 : @param[in] caption Window caption (or empty, for default)
95 : @param[in] dir Starting directory (or empty, to default to documents directory)
96 : @param[in] filter Filter specification such as "Comma Separated Files (*.csv)"
97 : @param[out] selectedSuffixOut Pointer to return the suffix (file type) that was selected (or 0).
98 : Can be useful when choosing the save file format based on suffix.
99 : */
100 : QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir,
101 : const QString &filter,
102 : QString *selectedSuffixOut);
103 :
104 : /** Get connection type to call object slot in GUI thread with invokeMethod. The call will be blocking.
105 :
106 : @returns If called from the GUI thread, return a Qt::DirectConnection.
107 : If called from another thread, return a Qt::BlockingQueuedConnection.
108 : */
109 : Qt::ConnectionType blockingGUIThreadConnection();
110 :
111 : // Determine whether a widget is hidden behind other windows
112 : bool isObscured(QWidget *w);
113 :
114 : // Open debug.log
115 : void openDebugLogfile();
116 :
117 : // Replace invalid default fonts with known good ones
118 : void SubstituteFonts(const QString& language);
119 :
120 : /** Qt event filter that intercepts ToolTipChange events, and replaces the tooltip with a rich text
121 : representation if needed. This assures that Qt can word-wrap long tooltip messages.
122 : Tooltips longer than the provided size threshold (in characters) are wrapped.
123 : */
124 0 : class ToolTipToRichTextFilter : public QObject
125 : {
126 : Q_OBJECT
127 :
128 : public:
129 : explicit ToolTipToRichTextFilter(int size_threshold, QObject *parent = 0);
130 :
131 : protected:
132 : bool eventFilter(QObject *obj, QEvent *evt);
133 :
134 : private:
135 : int size_threshold;
136 : };
137 :
138 : /**
139 : * Makes a QTableView last column feel as if it was being resized from its left border.
140 : * Also makes sure the column widths are never larger than the table's viewport.
141 : * In Qt, all columns are resizable from the right, but it's not intuitive resizing the last column from the right.
142 : * Usually our second to last columns behave as if stretched, and when on strech mode, columns aren't resizable
143 : * interactively or programatically.
144 : *
145 : * This helper object takes care of this issue.
146 : *
147 : */
148 0 : class TableViewLastColumnResizingFixer: public QObject
149 : {
150 : Q_OBJECT
151 :
152 : public:
153 : TableViewLastColumnResizingFixer(QTableView* table, int lastColMinimumWidth, int allColsMinimumWidth);
154 : void stretchColumnWidth(int column);
155 :
156 : private:
157 : QTableView* tableView;
158 : int lastColumnMinimumWidth;
159 : int allColumnsMinimumWidth;
160 : int lastColumnIndex;
161 : int columnCount;
162 : int secondToLastColumnIndex;
163 :
164 : void adjustTableColumnsWidth();
165 : int getAvailableWidthForColumn(int column);
166 : int getColumnsWidth();
167 : void connectViewHeadersSignals();
168 : void disconnectViewHeadersSignals();
169 : void setViewHeaderResizeMode(int logicalIndex, QHeaderView::ResizeMode resizeMode);
170 : void resizeColumn(int nColumnIndex, int width);
171 :
172 : private Q_SLOTS:
173 : void on_sectionResized(int logicalIndex, int oldSize, int newSize);
174 : void on_geometriesChanged();
175 : };
176 :
177 : bool GetStartOnSystemStartup();
178 : bool SetStartOnSystemStartup(bool fAutoStart);
179 :
180 : /** Save window size and position */
181 : void saveWindowGeometry(const QString& strSetting, QWidget *parent);
182 : /** Restore window size and position */
183 : void restoreWindowGeometry(const QString& strSetting, const QSize &defaultSizeIn, QWidget *parent);
184 :
185 : /* Convert QString to OS specific boost path through UTF-8 */
186 : boost::filesystem::path qstringToBoostPath(const QString &path);
187 :
188 : /* Convert OS specific boost path to QString through UTF-8 */
189 : QString boostPathToQString(const boost::filesystem::path &path);
190 :
191 : /* Convert seconds into a QString with days, hours, mins, secs */
192 : QString formatDurationStr(int secs);
193 :
194 : /* Format CNodeStats.nServices bitmask into a user-readable string */
195 : QString formatServicesStr(quint64 mask);
196 :
197 : /* Format a CNodeCombinedStats.dPingTime into a user-readable string or display N/A, if 0*/
198 : QString formatPingTime(double dPingTime);
199 :
200 : /* Format a CNodeCombinedStats.nTimeOffset into a user-readable string. */
201 : QString formatTimeOffset(int64_t nTimeOffset);
202 :
203 : #if defined(Q_OS_MAC) && QT_VERSION >= 0x050000
204 : // workaround for Qt OSX Bug:
205 : // https://bugreports.qt-project.org/browse/QTBUG-15631
206 : // QProgressBar uses around 10% CPU even when app is in background
207 : class ProgressBar : public QProgressBar
208 : {
209 : bool event(QEvent *e) {
210 : return (e->type() != QEvent::StyleAnimationUpdate) ? QProgressBar::event(e) : false;
211 : }
212 : };
213 : #else
214 : typedef QProgressBar ProgressBar;
215 : #endif
216 :
217 : } // namespace GUIUtil
218 :
219 : #endif // BITCOIN_QT_GUIUTIL_H
|