// Copyright (c) 2011-2021 The Limenka developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef LIMENKA_QT_LIMENKAUNITS_H #define LIMENKA_QT_LIMENKAUNITS_H #include #include #include #include #include // U+2009 THIN SPACE = UTF-8 E2 80 89 #define REAL_THIN_SP_CP 0x2009 #define REAL_THIN_SP_UTF8 "\xE2\x80\x89" // QMessageBox seems to have a bug whereby it doesn't display thin/hair spaces // correctly. Workaround is to display a space in a small font. If you // change this, please test that it doesn't cause the parent span to start // wrapping. #define HTML_HACK_SP " " // Define THIN_SP_* variables to be our preferred type of thin space #define THIN_SP_CP REAL_THIN_SP_CP #define THIN_SP_UTF8 REAL_THIN_SP_UTF8 #define THIN_SP_HTML HTML_HACK_SP /** Limenka ticker and symbol constants. */ static constexpr const char* TICKER = "LMKA"; static constexpr const char* SYMBOL_WHOLE = "\xce\xbb"; // λ (lambda) static constexpr const char* SYMBOL_ATTO = "\xce\x9b"; // Λ (capital lambda) /** Limenka unit definitions. Encapsulates parsing and formatting and serves as list model for drop-down selection boxes. */ class LimenkaUnits: public QAbstractListModel { Q_OBJECT public: explicit LimenkaUnits(QObject *parent); /** Limenka units. @note Source: https://en.limenka.it/wiki/Units . Please add only sensible ones */ enum class Unit { BTC, // λ whole units (1.23456789 λ) mBTC, // millisats (legacy, deprecated) uBTC, // microsats (legacy, deprecated) SAT, // satoshis (integer) ATTO, // attosats (Λ) - only available post-activation bTBC, // legacy sTBC, // legacy TBC, // legacy }; Q_ENUM(Unit) /** Check if unit requires fork activation. */ static bool requiresActivation(Unit unit) { return unit == Unit::ATTO; } enum class SeparatorStyle { NEVER, STANDARD, ALWAYS }; //! @name Static API //! Unit conversion and formatting ///@{ //! Get list of units, for drop-down box static QList availableUnits(); //! String for setting(s) static std::variant ToSetting(Unit unit); //! Convert setting(s) string to unit static Unit FromSetting(const QString&, Unit def); //! Long name static QString longName(Unit unit); //! Short name static QString shortName(Unit unit); //! Longer description static QString description(Unit unit); //! Number of Satoshis (1e-8) per unit static qint64 factor(Unit unit); //! Number of fractional places static int decimals(Unit unit); //! Radix static int radix(Unit unit); //! Number system static Unit numsys(Unit unit); //! Number of digits total in maximum value static qint64 max_digits(Unit unit); //! "Single step" amount, in satoshis static qint64 singlestep(Unit unit); //! Format as string static QString format(Unit unit, const CAmount& amount, bool plussign = false, SeparatorStyle separators = SeparatorStyle::STANDARD, bool justify = false); //! Format as string (with unit) static QString formatWithUnit(Unit unit, const CAmount& amount, bool plussign = false, SeparatorStyle separators = SeparatorStyle::STANDARD); //! Format as HTML string (with unit) static QString formatHtmlWithUnit(const QFont& font, Unit unit, const CAmount& amount, bool plussign = false, SeparatorStyle separators = SeparatorStyle::STANDARD); /** Format amount with sub-satoshi precision (dimmed trailing digits). */ static QString formatWithSubSatoshi(const QFont& font, Unit unit, const CAmount& amount, uint64_t subSatoshi = 0, bool plussign = false, SeparatorStyle separators = SeparatorStyle::STANDARD); //! Format as string (with unit) of fixed length to preserve privacy, if it is set. static QString formatWithPrivacy(Unit unit, const CAmount& amount, SeparatorStyle separators, bool privacy); //! Parse string to coin amount static bool parse(Unit unit, const QString& value, CAmount* val_out); //! Gets title for amount column including current display unit if optionsModel reference available */ static QString getAmountColumnTitle(Unit unit); ///@} //! @name AbstractListModel implementation //! List model for unit drop-down selection box. ///@{ enum RoleIndex { /** Unit identifier */ UnitRole = Qt::UserRole }; int rowCount(const QModelIndex &parent) const override; QVariant data(const QModelIndex &index, int role) const override; ///@} static QString removeSpaces(QString text) { text.remove(' '); text.remove(QChar(THIN_SP_CP)); return text; } //! Return maximum number of base units (Satoshis) static CAmount maxMoney(); private: QList unitlist; }; typedef LimenkaUnits::Unit LimenkaUnit; QDataStream& operator<<(QDataStream& out, const LimenkaUnit& unit); QDataStream& operator>>(QDataStream& in, LimenkaUnit& unit); #endif // LIMENKA_QT_LIMENKAUNITS_H