1 // Copyright (c) 2011-2015 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 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 //! Format as HTML string (with unit) 92 static QString formatHtmlWithUnit(int unit, const CAmount& amount, bool plussign=false, SeparatorStyle separators=separatorStandard); 93 //! Parse string to coin amount 94 static bool parse(int unit, const QString &value, CAmount *val_out); 95 //! Gets title for amount column including current display unit if optionsModel reference available */ 96 static QString getAmountColumnTitle(int unit); 97 ///@} 98 99 //! @name AbstractListModel implementation 100 //! List model for unit drop-down selection box. 101 ///@{ 102 enum RoleIndex { 103 /** Unit identifier */ 104 UnitRole = Qt::UserRole 105 }; 106 int rowCount(const QModelIndex &parent) const; 107 QVariant data(const QModelIndex &index, int role) const; 108 ///@} 109 removeSpaces(QString text)110 static QString removeSpaces(QString text) 111 { 112 text.remove(' '); 113 text.remove(QChar(THIN_SP_CP)); 114 #if (THIN_SP_CP != REAL_THIN_SP_CP) 115 text.remove(QChar(REAL_THIN_SP_CP)); 116 #endif 117 return text; 118 } 119 120 //! Return maximum number of base units (Satoshis) 121 static CAmount maxMoney(); 122 123 private: 124 QList<BitcoinUnits::Unit> unitlist; 125 }; 126 typedef BitcoinUnits::Unit BitcoinUnit; 127 128 #endif // BITCOIN_QT_BITCOINUNITS_H 129