Skip to content

Commit 75832fd

Browse files
hebastojb55
authored andcommitted
qt: Use QVariant instead of int for BitcoinUnit in QSettings
This change improves type safety.
1 parent 5d254a2 commit 75832fd

File tree

5 files changed

+63
-11
lines changed

5 files changed

+63
-11
lines changed

src/qt/bitcoin.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ static void RegisterMetaTypes()
9595
qRegisterMetaType<std::function<void()>>("std::function<void()>");
9696
qRegisterMetaType<QMessageBox::Icon>("QMessageBox::Icon");
9797
qRegisterMetaType<interfaces::BlockAndHeaderTipInfo>("interfaces::BlockAndHeaderTipInfo");
98+
99+
qRegisterMetaTypeStreamOperators<BitcoinUnit>("BitcoinUnit");
98100
}
99101

100102
static QString GetLangTerritory()

src/qt/bitcoinunits.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,40 @@ CAmount BitcoinUnits::maxMoney()
250250
{
251251
return MAX_MONEY;
252252
}
253+
254+
namespace {
255+
qint8 ToQint8(BitcoinUnit unit)
256+
{
257+
switch (unit) {
258+
case BitcoinUnits::BTC: return 0;
259+
case BitcoinUnits::mBTC: return 1;
260+
case BitcoinUnits::uBTC: return 2;
261+
case BitcoinUnits::SAT: return 3;
262+
} // no default case, so the compiler can warn about missing cases
263+
assert(false);
264+
}
265+
266+
BitcoinUnit FromQint8(qint8 num)
267+
{
268+
switch (num) {
269+
case 0: return BitcoinUnits::BTC;
270+
case 1: return BitcoinUnits::mBTC;
271+
case 2: return BitcoinUnits::uBTC;
272+
case 3: return BitcoinUnits::SAT;
273+
}
274+
assert(false);
275+
}
276+
} // namespace
277+
278+
QDataStream& operator<<(QDataStream& out, const BitcoinUnit& unit)
279+
{
280+
return out << ToQint8(unit);
281+
}
282+
283+
QDataStream& operator>>(QDataStream& in, BitcoinUnit& unit)
284+
{
285+
qint8 input;
286+
in >> input;
287+
unit = FromQint8(input);
288+
return in;
289+
}

src/qt/bitcoinunits.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <consensus/amount.h>
99

1010
#include <QAbstractListModel>
11+
#include <QDataStream>
1112
#include <QString>
1213

1314
// U+2009 THIN SPACE = UTF-8 E2 80 89
@@ -45,6 +46,7 @@ class BitcoinUnits: public QAbstractListModel
4546
uBTC,
4647
SAT
4748
};
49+
Q_ENUM(Unit)
4850

4951
enum class SeparatorStyle
5052
{
@@ -111,4 +113,7 @@ class BitcoinUnits: public QAbstractListModel
111113
};
112114
typedef BitcoinUnits::Unit BitcoinUnit;
113115

116+
QDataStream& operator<<(QDataStream& out, const BitcoinUnit& unit);
117+
QDataStream& operator>>(QDataStream& in, BitcoinUnit& unit);
118+
114119
#endif // BITCOIN_QT_BITCOINUNITS_H

src/qt/optionsmodel.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <QLatin1Char>
2525
#include <QSettings>
2626
#include <QStringList>
27+
#include <QVariant>
2728

2829
const char *DEFAULT_GUI_PROXY_HOST = "127.0.0.1";
2930

@@ -71,9 +72,16 @@ void OptionsModel::Init(bool resetSettings)
7172
fMinimizeOnClose = settings.value("fMinimizeOnClose").toBool();
7273

7374
// Display
74-
if (!settings.contains("nDisplayUnit"))
75-
settings.setValue("nDisplayUnit", BitcoinUnits::BTC);
76-
nDisplayUnit = settings.value("nDisplayUnit").toInt();
75+
if (!settings.contains("DisplayBitcoinUnit")) {
76+
settings.setValue("DisplayBitcoinUnit", QVariant::fromValue(BitcoinUnit::BTC));
77+
}
78+
QVariant unit = settings.value("DisplayBitcoinUnit");
79+
if (unit.canConvert<BitcoinUnit>()) {
80+
m_display_bitcoin_unit = unit.value<BitcoinUnit>();
81+
} else {
82+
m_display_bitcoin_unit = BitcoinUnit::BTC;
83+
settings.setValue("DisplayBitcoinUnit", QVariant::fromValue(m_display_bitcoin_unit));
84+
}
7785

7886
if (!settings.contains("strThirdPartyTxUrls"))
7987
settings.setValue("strThirdPartyTxUrls", "");
@@ -356,7 +364,7 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
356364
return m_sub_fee_from_amount;
357365
#endif
358366
case DisplayUnit:
359-
return nDisplayUnit;
367+
return QVariant::fromValue(m_display_bitcoin_unit);
360368
case ThirdPartyTxUrls:
361369
return strThirdPartyTxUrls;
362370
case Language:
@@ -567,12 +575,11 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
567575
/** Updates current unit in memory, settings and emits displayUnitChanged(newUnit) signal */
568576
void OptionsModel::setDisplayUnit(const QVariant &value)
569577
{
570-
if (!value.isNull())
571-
{
578+
if (!value.isNull()) {
572579
QSettings settings;
573-
nDisplayUnit = value.toInt();
574-
settings.setValue("nDisplayUnit", nDisplayUnit);
575-
Q_EMIT displayUnitChanged(nDisplayUnit);
580+
m_display_bitcoin_unit = value.value<BitcoinUnit>();
581+
settings.setValue("DisplayBitcoinUnit", QVariant::fromValue(m_display_bitcoin_unit));
582+
Q_EMIT displayUnitChanged(static_cast<int>(m_display_bitcoin_unit));
576583
}
577584
}
578585

src/qt/optionsmodel.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define BITCOIN_QT_OPTIONSMODEL_H
77

88
#include <cstdint>
9+
#include <qt/bitcoinunits.h>
910
#include <qt/guiconstants.h>
1011

1112
#include <QAbstractListModel>
@@ -86,7 +87,7 @@ class OptionsModel : public QAbstractListModel
8687
bool getShowTrayIcon() const { return m_show_tray_icon; }
8788
bool getMinimizeToTray() const { return fMinimizeToTray; }
8889
bool getMinimizeOnClose() const { return fMinimizeOnClose; }
89-
int getDisplayUnit() const { return nDisplayUnit; }
90+
int getDisplayUnit() const { return static_cast<int>(m_display_bitcoin_unit); }
9091
QString getThirdPartyTxUrls() const { return strThirdPartyTxUrls; }
9192
bool getUseEmbeddedMonospacedFont() const { return m_use_embedded_monospaced_font; }
9293
bool getCoinControlFeatures() const { return fCoinControlFeatures; }
@@ -112,7 +113,7 @@ class OptionsModel : public QAbstractListModel
112113
bool fMinimizeToTray;
113114
bool fMinimizeOnClose;
114115
QString language;
115-
int nDisplayUnit;
116+
BitcoinUnit m_display_bitcoin_unit;
116117
QString strThirdPartyTxUrls;
117118
bool m_use_embedded_monospaced_font;
118119
bool fCoinControlFeatures;

0 commit comments

Comments
 (0)