Skip to content

Commit 77edf1b

Browse files
committed
qt: Use QVariant instead of int for BitcoinUnit in QSettings
This change improves type safety.
1 parent 7f653c3 commit 77edf1b

File tree

5 files changed

+62
-12
lines changed

5 files changed

+62
-12
lines changed

src/qt/bitcoin.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ static void RegisterMetaTypes()
8585
qRegisterMetaType<std::function<void()>>("std::function<void()>");
8686
qRegisterMetaType<QMessageBox::Icon>("QMessageBox::Icon");
8787
qRegisterMetaType<interfaces::BlockAndHeaderTipInfo>("interfaces::BlockAndHeaderTipInfo");
88+
89+
qRegisterMetaTypeStreamOperators<BitcoinUnit>("BitcoinUnit");
8890
}
8991

9092
static QString GetLangTerritory()

src/qt/bitcoinunits.cpp

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

src/qt/bitcoinunits.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <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: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <QDebug>
2424
#include <QSettings>
2525
#include <QStringList>
26+
#include <QVariant>
2627

2728
const char *DEFAULT_GUI_PROXY_HOST = "127.0.0.1";
2829

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

7273
// Display
73-
if (!settings.contains("nDisplayUnit"))
74-
settings.setValue("nDisplayUnit", BitcoinUnits::BTC);
75-
nDisplayUnit = settings.value("nDisplayUnit").toInt();
74+
if (!settings.contains("display_unit")) {
75+
settings.setValue("display_unit", QVariant::fromValue(BitcoinUnit::BTC));
76+
}
77+
QVariant unit = settings.value("display_unit");
78+
if (unit.isValid()) {
79+
m_display_unit = unit.value<BitcoinUnit>();
80+
} else {
81+
m_display_unit = BitcoinUnit::BTC;
82+
}
7683

7784
if (!settings.contains("strThirdPartyTxUrls"))
7885
settings.setValue("strThirdPartyTxUrls", "");
@@ -321,7 +328,7 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const
321328
return settings.value("bSpendZeroConfChange");
322329
#endif
323330
case DisplayUnit:
324-
return nDisplayUnit;
331+
return QVariant::fromValue(m_display_unit);
325332
case ThirdPartyTxUrls:
326333
return strThirdPartyTxUrls;
327334
case Language:
@@ -501,12 +508,11 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
501508
/** Updates current unit in memory, settings and emits displayUnitChanged(newUnit) signal */
502509
void OptionsModel::setDisplayUnit(const QVariant &value)
503510
{
504-
if (!value.isNull())
505-
{
511+
if (!value.isNull()) {
506512
QSettings settings;
507-
nDisplayUnit = value.toInt();
508-
settings.setValue("nDisplayUnit", nDisplayUnit);
509-
Q_EMIT displayUnitChanged(nDisplayUnit);
513+
m_display_unit = value.value<BitcoinUnit>();
514+
settings.setValue("display_unit", QVariant::fromValue(m_display_unit));
515+
Q_EMIT displayUnitChanged(static_cast<int>(m_display_unit));
510516
}
511517
}
512518

src/qt/optionsmodel.h

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

88
#include <amount.h>
9-
#include <cstdint>
9+
#include <qt/bitcoinunits.h>
1010
#include <qt/guiconstants.h>
1111

1212
#include <QAbstractListModel>
1313

1414
#include <assert.h>
15+
#include <cstdint>
1516

1617
namespace interfaces {
1718
class Node;
@@ -82,7 +83,7 @@ class OptionsModel : public QAbstractListModel
8283
bool getShowTrayIcon() const { return m_show_tray_icon; }
8384
bool getMinimizeToTray() const { return fMinimizeToTray; }
8485
bool getMinimizeOnClose() const { return fMinimizeOnClose; }
85-
int getDisplayUnit() const { return nDisplayUnit; }
86+
int getDisplayUnit() const { return static_cast<int>(m_display_unit); }
8687
QString getThirdPartyTxUrls() const { return strThirdPartyTxUrls; }
8788
bool getCoinControlFeatures() const { return fCoinControlFeatures; }
8889
const QString& getOverriddenByCommandLine() { return strOverriddenByCommandLine; }
@@ -105,7 +106,7 @@ class OptionsModel : public QAbstractListModel
105106
bool fMinimizeToTray;
106107
bool fMinimizeOnClose;
107108
QString language;
108-
int nDisplayUnit;
109+
BitcoinUnit m_display_unit;
109110
QString strThirdPartyTxUrls;
110111
bool fCoinControlFeatures;
111112
/* settings that were overridden by command-line */

0 commit comments

Comments
 (0)