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_BITCOINUNITS_H
6 : #define BITCOIN_QT_BITCOINUNITS_H
7 :
8 : #include "amount.h"
9 :
10 : #include <QAbstractListModel>
11 : #include <QString>
12 :
13 : // U+2009 THIN SPACE = UTF-8 E2 80 89
14 : #define REAL_THIN_SP_CP 0x2009
15 : #define REAL_THIN_SP_UTF8 "\xE2\x80\x89"
16 : #define REAL_THIN_SP_HTML " "
17 :
18 : // U+200A HAIR SPACE = UTF-8 E2 80 8A
19 : #define HAIR_SP_CP 0x200A
20 : #define HAIR_SP_UTF8 "\xE2\x80\x8A"
21 : #define HAIR_SP_HTML " "
22 :
23 : // U+2006 SIX-PER-EM SPACE = UTF-8 E2 80 86
24 : #define SIXPEREM_SP_CP 0x2006
25 : #define SIXPEREM_SP_UTF8 "\xE2\x80\x86"
26 : #define SIXPEREM_SP_HTML " "
27 :
28 : // U+2007 FIGURE SPACE = UTF-8 E2 80 87
29 : #define FIGURE_SP_CP 0x2007
30 : #define FIGURE_SP_UTF8 "\xE2\x80\x87"
31 : #define FIGURE_SP_HTML " "
32 :
33 : // QMessageBox seems to have a bug whereby it doesn't display thin/hair spaces
34 : // correctly. Workaround is to display a space in a small font. If you
35 : // change this, please test that it doesn't cause the parent span to start
36 : // wrapping.
37 : #define HTML_HACK_SP "<span style='white-space: nowrap; font-size: 6pt'> </span>"
38 :
39 : // Define THIN_SP_* variables to be our preferred type of thin space
40 : #define THIN_SP_CP REAL_THIN_SP_CP
41 : #define THIN_SP_UTF8 REAL_THIN_SP_UTF8
42 : #define THIN_SP_HTML HTML_HACK_SP
43 :
44 : /** Bitcoin unit definitions. Encapsulates parsing and formatting
45 : and serves as list model for drop-down selection boxes.
46 : */
47 0 : class BitcoinUnits: public QAbstractListModel
48 : {
49 : Q_OBJECT
50 :
51 : public:
52 : explicit BitcoinUnits(QObject *parent);
53 :
54 : /** Bitcoin units.
55 : @note Source: https://en.bitcoin.it/wiki/Units . Please add only sensible ones
56 : */
57 : enum Unit
58 : {
59 : BTC,
60 : mBTC,
61 : uBTC
62 : };
63 :
64 : enum SeparatorStyle
65 : {
66 : separatorNever,
67 : separatorStandard,
68 : separatorAlways
69 : };
70 :
71 : //! @name Static API
72 : //! Unit conversion and formatting
73 : ///@{
74 :
75 : //! Get list of units, for drop-down box
76 : static QList<Unit> availableUnits();
77 : //! Is unit ID valid?
78 : static bool valid(int unit);
79 : //! Short name
80 : static QString name(int unit);
81 : //! Longer description
82 : static QString description(int unit);
83 : //! Number of Satoshis (1e-8) per unit
84 : static qint64 factor(int unit);
85 : //! Number of decimals left
86 : static int decimals(int unit);
87 : //! Format as string
88 : static QString format(int unit, const CAmount& amount, bool plussign=false, SeparatorStyle separators=separatorStandard);
89 : //! Format as string (with unit)
90 : static QString formatWithUnit(int unit, const CAmount& amount, bool plussign=false, SeparatorStyle separators=separatorStandard);
91 : static QString formatHtmlWithUnit(int unit, const CAmount& amount, bool plussign=false, SeparatorStyle separators=separatorStandard);
92 : //! Parse string to coin amount
93 : static bool parse(int unit, const QString &value, CAmount *val_out);
94 : //! Gets title for amount column including current display unit if optionsModel reference available */
95 : static QString getAmountColumnTitle(int unit);
96 : ///@}
97 :
98 : //! @name AbstractListModel implementation
99 : //! List model for unit drop-down selection box.
100 : ///@{
101 : enum RoleIndex {
102 : /** Unit identifier */
103 : UnitRole = Qt::UserRole
104 : };
105 : int rowCount(const QModelIndex &parent) const;
106 : QVariant data(const QModelIndex &index, int role) const;
107 : ///@}
108 :
109 5 : static QString removeSpaces(QString text)
110 : {
111 5 : text.remove(' ');
112 5 : text.remove(QChar(THIN_SP_CP));
113 : #if (THIN_SP_CP != REAL_THIN_SP_CP)
114 : text.remove(QChar(REAL_THIN_SP_CP));
115 : #endif
116 5 : return text;
117 : }
118 :
119 : //! Return maximum number of base units (Satoshis)
120 : static CAmount maxMoney();
121 :
122 : private:
123 : QList<BitcoinUnits::Unit> unitlist;
124 : };
125 : typedef BitcoinUnits::Unit BitcoinUnit;
126 :
127 : #endif // BITCOIN_QT_BITCOINUNITS_H
|