Skip to content

Commit

Permalink
qt: Use QVariant instead of int for BitcoinUnit in QSettings
Browse files Browse the repository at this point in the history
This change improves type safety.
  • Loading branch information
hebasto committed Jan 21, 2021
1 parent 7f653c3 commit 77edf1b
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 12 deletions.
2 changes: 2 additions & 0 deletions src/qt/bitcoin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ static void RegisterMetaTypes()
qRegisterMetaType<std::function<void()>>("std::function<void()>");
qRegisterMetaType<QMessageBox::Icon>("QMessageBox::Icon");
qRegisterMetaType<interfaces::BlockAndHeaderTipInfo>("interfaces::BlockAndHeaderTipInfo");

qRegisterMetaTypeStreamOperators<BitcoinUnit>("BitcoinUnit");
}

static QString GetLangTerritory()
Expand Down
36 changes: 36 additions & 0 deletions src/qt/bitcoinunits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,3 +248,39 @@ CAmount BitcoinUnits::maxMoney()
{
return MAX_MONEY;
}

namespace {
qint8 ToQuint8(BitcoinUnit unit)
{
switch (unit) {
case BitcoinUnits::BTC: return 0;
case BitcoinUnits::mBTC: return 1;
case BitcoinUnits::uBTC: return 2;
case BitcoinUnits::SAT: return 3;
} // no default case, so the compiler can warn about missing cases
assert(false);
}

BitcoinUnit FromQuint8(qint8 num)
{
switch (num) {
case 3: return BitcoinUnits::SAT;
case 2: return BitcoinUnits::uBTC;
case 1: return BitcoinUnits::mBTC;
default: return BitcoinUnits::BTC;
}
}
} // namespace

QDataStream& operator<<(QDataStream& out, const BitcoinUnit& unit)
{
return out << ToQuint8(unit);
}

QDataStream& operator>>(QDataStream& in, BitcoinUnit& unit)
{
quint8 input;
in >> input;
unit = FromQuint8(input);
return in;
}
5 changes: 5 additions & 0 deletions src/qt/bitcoinunits.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <amount.h>

#include <QAbstractListModel>
#include <QDataStream>
#include <QString>

// U+2009 THIN SPACE = UTF-8 E2 80 89
Expand Down Expand Up @@ -45,6 +46,7 @@ class BitcoinUnits: public QAbstractListModel
uBTC,
SAT
};
Q_ENUM(Unit)

enum class SeparatorStyle
{
Expand Down Expand Up @@ -111,4 +113,7 @@ class BitcoinUnits: public QAbstractListModel
};
typedef BitcoinUnits::Unit BitcoinUnit;

QDataStream& operator<<(QDataStream& out, const BitcoinUnit& unit);
QDataStream& operator>>(QDataStream& in, BitcoinUnit& unit);

#endif // BITCOIN_QT_BITCOINUNITS_H
24 changes: 15 additions & 9 deletions src/qt/optionsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <QDebug>
#include <QSettings>
#include <QStringList>
#include <QVariant>

const char *DEFAULT_GUI_PROXY_HOST = "127.0.0.1";

Expand Down Expand Up @@ -70,9 +71,15 @@ void OptionsModel::Init(bool resetSettings)
fMinimizeOnClose = settings.value("fMinimizeOnClose").toBool();

// Display
if (!settings.contains("nDisplayUnit"))
settings.setValue("nDisplayUnit", BitcoinUnits::BTC);
nDisplayUnit = settings.value("nDisplayUnit").toInt();
if (!settings.contains("display_unit")) {
settings.setValue("display_unit", QVariant::fromValue(BitcoinUnit::BTC));
}
QVariant unit = settings.value("display_unit");
if (unit.isValid()) {
m_display_unit = unit.value<BitcoinUnit>();
} else {
m_display_unit = BitcoinUnit::BTC;
}

if (!settings.contains("strThirdPartyTxUrls"))
settings.setValue("strThirdPartyTxUrls", "");
Expand Down Expand Up @@ -321,7 +328,7 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
return settings.value("bSpendZeroConfChange");
#endif
case DisplayUnit:
return nDisplayUnit;
return QVariant::fromValue(m_display_unit);
case ThirdPartyTxUrls:
return strThirdPartyTxUrls;
case Language:
Expand Down Expand Up @@ -501,12 +508,11 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
/** Updates current unit in memory, settings and emits displayUnitChanged(newUnit) signal */
void OptionsModel::setDisplayUnit(const QVariant &value)
{
if (!value.isNull())
{
if (!value.isNull()) {
QSettings settings;
nDisplayUnit = value.toInt();
settings.setValue("nDisplayUnit", nDisplayUnit);
Q_EMIT displayUnitChanged(nDisplayUnit);
m_display_unit = value.value<BitcoinUnit>();
settings.setValue("display_unit", QVariant::fromValue(m_display_unit));
Q_EMIT displayUnitChanged(static_cast<int>(m_display_unit));
}
}

Expand Down
7 changes: 4 additions & 3 deletions src/qt/optionsmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
#define BITCOIN_QT_OPTIONSMODEL_H

#include <amount.h>
#include <cstdint>
#include <qt/bitcoinunits.h>
#include <qt/guiconstants.h>

#include <QAbstractListModel>

#include <assert.h>
#include <cstdint>

namespace interfaces {
class Node;
Expand Down Expand Up @@ -82,7 +83,7 @@ class OptionsModel : public QAbstractListModel
bool getShowTrayIcon() const { return m_show_tray_icon; }
bool getMinimizeToTray() const { return fMinimizeToTray; }
bool getMinimizeOnClose() const { return fMinimizeOnClose; }
int getDisplayUnit() const { return nDisplayUnit; }
int getDisplayUnit() const { return static_cast<int>(m_display_unit); }
QString getThirdPartyTxUrls() const { return strThirdPartyTxUrls; }
bool getCoinControlFeatures() const { return fCoinControlFeatures; }
const QString& getOverriddenByCommandLine() { return strOverriddenByCommandLine; }
Expand All @@ -105,7 +106,7 @@ class OptionsModel : public QAbstractListModel
bool fMinimizeToTray;
bool fMinimizeOnClose;
QString language;
int nDisplayUnit;
BitcoinUnit m_display_unit;
QString strThirdPartyTxUrls;
bool fCoinControlFeatures;
/* settings that were overridden by command-line */
Expand Down

0 comments on commit 77edf1b

Please sign in to comment.