Skip to content

Commit c3bb36a

Browse files
committed
GUI: Enable customisation of QR Code font
1 parent 55bd5d8 commit c3bb36a

7 files changed

+86
-8
lines changed

src/qt/forms/optionsdialog.ui

+25
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,31 @@
796796
</item>
797797
</layout>
798798
</item>
799+
<item>
800+
<layout class="QHBoxLayout" name="horizontalLayout_qrFont">
801+
<item>
802+
<widget class="QLabel" name="qrFontLabel">
803+
<property name="text">
804+
<string>Font in QR Codes: </string>
805+
</property>
806+
<property name="buddy">
807+
<cstring>qrFont</cstring>
808+
</property>
809+
</widget>
810+
</item>
811+
<item>
812+
<widget class="QComboBox" name="qrFont"/>
813+
</item>
814+
<item>
815+
<widget class="QLabel" name="qrFont_preview">
816+
<property name="text">
817+
<string notr="true">1NS17iag9jJgT…
818+
bc1p2q3rvn3gp…</string>
819+
</property>
820+
</widget>
821+
</item>
822+
</layout>
823+
</item>
799824
<item>
800825
<spacer name="verticalSpacer_Display">
801826
<property name="orientation">

src/qt/optionsdialog.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet)
205205
}
206206

207207
setupFontOptions(ui->moneyFont, ui->moneyFont_preview);
208+
setupFontOptions(ui->qrFont, ui->qrFont_preview);
209+
#ifndef USE_QRCODE
210+
ui->qrFontLabel->setVisible(false);
211+
ui->qrFont->setVisible(false);
212+
ui->qrFont_preview->setVisible(false);
213+
#endif
208214

209215
GUIUtil::handleCloseWindowShortcut(this);
210216
}
@@ -245,6 +251,9 @@ void OptionsDialog::setModel(OptionsModel *_model)
245251
const auto& font_for_money = _model->data(_model->index(OptionsModel::FontForMoney, 0), Qt::EditRole).value<OptionsModel::FontChoice>();
246252
setFontChoice(ui->moneyFont, font_for_money);
247253

254+
const auto& font_for_qrcodes = _model->data(_model->index(OptionsModel::FontForQRCodes, 0), Qt::EditRole).value<OptionsModel::FontChoice>();
255+
setFontChoice(ui->qrFont, font_for_qrcodes);
256+
248257
updateDefaultProxyNets();
249258
}
250259

@@ -384,6 +393,7 @@ void OptionsDialog::on_openBitcoinConfButton_clicked()
384393
void OptionsDialog::on_okButton_clicked()
385394
{
386395
model->setData(model->index(OptionsModel::FontForMoney, 0), ui->moneyFont->itemData(ui->moneyFont->currentIndex()));
396+
model->setData(model->index(OptionsModel::FontForQRCodes, 0), ui->qrFont->itemData(ui->qrFont->currentIndex()));
387397

388398
mapper->submit();
389399
accept();

src/qt/optionsmodel.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,11 @@ bool OptionsModel::Init(bilingual_str& error)
258258
}
259259
Q_EMIT fontForMoneyChanged(getFontForMoney());
260260

261+
if (settings.contains("FontForQRCodes")) {
262+
m_font_qrcodes = FontChoiceFromString(settings.value("FontForQRCodes").toString());
263+
}
264+
Q_EMIT fontForQRCodesChanged(getFontChoiceForQRCodes());
265+
261266
m_mask_values = settings.value("mask_values", false).toBool();
262267

263268
return true;
@@ -466,6 +471,8 @@ QVariant OptionsModel::getOption(OptionID option, const std::string& suffix) con
466471
return QString::fromStdString(SettingToString(setting(), ""));
467472
case FontForMoney:
468473
return QVariant::fromValue(m_font_money);
474+
case FontForQRCodes:
475+
return QVariant::fromValue(m_font_qrcodes);
469476
case CoinControlFeatures:
470477
return fCoinControlFeatures;
471478
case EnablePSBTControls:
@@ -649,6 +656,15 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value, const std::
649656
Q_EMIT fontForMoneyChanged(getFontForMoney());
650657
break;
651658
}
659+
case FontForQRCodes:
660+
{
661+
const auto& new_font = value.value<FontChoice>();
662+
if (m_font_qrcodes == new_font) break;
663+
settings.setValue("FontForQRCodes", FontChoiceToString(new_font));
664+
m_font_qrcodes = new_font;
665+
Q_EMIT fontForQRCodesChanged(new_font);
666+
break;
667+
}
652668
case CoinControlFeatures:
653669
fCoinControlFeatures = value.toBool();
654670
settings.setValue("fCoinControlFeatures", fCoinControlFeatures);

src/qt/optionsmodel.h

+4
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class OptionsModel : public QAbstractListModel
6363
ThirdPartyTxUrls, // QString
6464
Language, // QString
6565
FontForMoney, // FontChoice
66+
FontForQRCodes, // FontChoice
6667
CoinControlFeatures, // bool
6768
SubFeeFromAmount, // bool
6869
ThreadsScriptVerif, // int
@@ -104,6 +105,7 @@ class OptionsModel : public QAbstractListModel
104105
BitcoinUnit getDisplayUnit() const { return m_display_bitcoin_unit; }
105106
QString getThirdPartyTxUrls() const { return strThirdPartyTxUrls; }
106107
QFont getFontForMoney() const;
108+
FontChoice getFontChoiceForQRCodes() const { return m_font_qrcodes; }
107109
bool getCoinControlFeatures() const { return fCoinControlFeatures; }
108110
bool getSubFeeFromAmount() const { return m_sub_fee_from_amount; }
109111
bool getEnablePSBTControls() const { return m_enable_psbt_controls; }
@@ -131,6 +133,7 @@ class OptionsModel : public QAbstractListModel
131133
BitcoinUnit m_display_bitcoin_unit;
132134
QString strThirdPartyTxUrls;
133135
FontChoice m_font_money{FontChoiceAbstract::EmbeddedFont};
136+
FontChoice m_font_qrcodes{FontChoiceAbstract::BestSystemFont};
134137
bool fCoinControlFeatures;
135138
bool m_sub_fee_from_amount;
136139
bool m_enable_psbt_controls;
@@ -153,6 +156,7 @@ class OptionsModel : public QAbstractListModel
153156
void coinControlFeaturesChanged(bool);
154157
void showTrayIconChanged(bool);
155158
void fontForMoneyChanged(const QFont&);
159+
void fontForQRCodesChanged(const FontChoice&);
156160
};
157161

158162
Q_DECLARE_METATYPE(OptionsModel::FontChoice)

src/qt/qrimagewidget.cpp

+23-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <qt/qrimagewidget.h>
66

77
#include <qt/guiutil.h>
8+
#include <qt/optionsmodel.h>
89

910
#include <QApplication>
1011
#include <QClipboard>
@@ -31,7 +32,7 @@ QRImageWidget::QRImageWidget(QWidget* parent)
3132
contextMenu->addAction(tr("&Copy Image"), this, &QRImageWidget::copyImage);
3233
}
3334

34-
bool QRImageWidget::setQR(const QString& data, const QString& text)
35+
bool QRImageWidget::setQR(const QString& data, const QString& text, const OptionsModel::FontChoice& fontchoice)
3536
{
3637
#ifdef USE_QRCODE
3738
setText("");
@@ -72,11 +73,22 @@ bool QRImageWidget::setQR(const QString& data, const QString& text)
7273
QRect paddedRect = qrAddrImage.rect();
7374
paddedRect.setHeight(QR_IMAGE_SIZE + QR_IMAGE_TEXT_MARGIN);
7475

75-
QFont font = GUIUtil::fixedPitchFont();
76-
font.setStretch(QFont::SemiCondensed);
77-
font.setLetterSpacing(QFont::AbsoluteSpacing, 1);
78-
const qreal font_size = GUIUtil::calculateIdealFontSize(paddedRect.width() - 2 * QR_IMAGE_TEXT_MARGIN, text, font);
79-
font.setPointSizeF(font_size);
76+
QFont font;
77+
78+
// Determine font to use
79+
if (std::holds_alternative<OptionsModel::FontChoiceAbstract>(fontchoice)) {
80+
font = GUIUtil::fixedPitchFont(fontchoice != OptionsModel::UseBestSystemFont);
81+
font.setWeight(QFont::Bold);
82+
font.setStretch(QFont::SemiCondensed);
83+
font.setLetterSpacing(QFont::AbsoluteSpacing, 1);
84+
85+
const auto qr_image_width = paddedRect.width();
86+
const int max_text_width = qr_image_width - (2 * QR_IMAGE_TEXT_MARGIN);
87+
const qreal font_size = GUIUtil::calculateIdealFontSize(max_text_width, text, font);
88+
font.setPointSizeF(font_size);
89+
} else {
90+
font = std::get<QFont>(fontchoice);
91+
}
8092

8193
painter.setFont(font);
8294
painter.drawText(paddedRect, Qt::AlignBottom | Qt::AlignCenter, text);
@@ -92,6 +104,11 @@ bool QRImageWidget::setQR(const QString& data, const QString& text)
92104
#endif
93105
}
94106

107+
bool QRImageWidget::setQR(const QString& data)
108+
{
109+
return setQR(data, "", OptionsModel::FontChoiceAbstract::EmbeddedFont);
110+
}
111+
95112
QImage QRImageWidget::exportImage()
96113
{
97114
return GUIUtil::GetImage(this);

src/qt/qrimagewidget.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#ifndef BITCOIN_QT_QRIMAGEWIDGET_H
66
#define BITCOIN_QT_QRIMAGEWIDGET_H
77

8+
#include <qt/optionsmodel.h>
9+
810
#include <QImage>
911
#include <QLabel>
1012

@@ -29,7 +31,8 @@ class QRImageWidget : public QLabel
2931

3032
public:
3133
explicit QRImageWidget(QWidget *parent = nullptr);
32-
bool setQR(const QString& data, const QString& text = "");
34+
bool setQR(const QString& data);
35+
bool setQR(const QString& data, const QString& text, const OptionsModel::FontChoice& fontchoice);
3336
QImage exportImage();
3437

3538
public Q_SLOTS:

src/qt/receiverequestdialog.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ void ReceiveRequestDialog::setInfo(const SendCoinsRecipient &_info)
4949
QString uri = GUIUtil::formatBitcoinURI(info);
5050

5151
#ifdef USE_QRCODE
52-
if (ui->qr_code->setQR(uri, info.address)) {
52+
if (ui->qr_code->setQR(uri, info.address, model->getOptionsModel()->getFontChoiceForQRCodes())) {
5353
connect(ui->btnSaveAs, &QPushButton::clicked, ui->qr_code, &QRImageWidget::saveImage);
54+
connect(model->getOptionsModel(), &OptionsModel::fontForQRCodesChanged, this, [&](const OptionsModel::FontChoice& fontchoice){
55+
ui->qr_code->setQR(uri, info.address, fontchoice);
56+
});
5457
} else {
5558
ui->btnSaveAs->setEnabled(false);
5659
}

0 commit comments

Comments
 (0)