From f9d9a1d1cfd08096aa4f734e8d9134eac80e6e9b Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Mon, 13 Dec 2021 05:56:44 +0000 Subject: [PATCH 1/7] Bugfix: GUI/QRImageWidget: Correctly calculate sizes - Margin of QRCode should be constant, not change based on complexity of QRCode - Text region should be sized based on height of actual text, not a constant guess - Width of image should not be adjusted based on vertical text size/margins - Adjusted constant QRCode and margin sizes to visually match what we had previously --- src/qt/qrimagewidget.cpp | 31 ++++++++++++++++++------------- src/qt/qrimagewidget.h | 6 +++--- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/qt/qrimagewidget.cpp b/src/qt/qrimagewidget.cpp index 52f1e60957..ae2e77bbf1 100644 --- a/src/qt/qrimagewidget.cpp +++ b/src/qt/qrimagewidget.cpp @@ -54,33 +54,38 @@ bool QRImageWidget::setQR(const QString& data, const QString& text) return false; } - QImage qrImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32); - qrImage.fill(0xffffff); + QImage qrImage = QImage(code->width, code->width, QImage::Format_RGB32); unsigned char *p = code->data; for (int y = 0; y < code->width; ++y) { for (int x = 0; x < code->width; ++x) { - qrImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff)); + qrImage.setPixel(x, y, ((*p & 1) ? 0x0 : 0xffffff)); ++p; } } QRcode_free(code); - const int qr_image_size = QR_IMAGE_SIZE + (text.isEmpty() ? 0 : 2 * QR_IMAGE_MARGIN); - QImage qrAddrImage(qr_image_size, qr_image_size, QImage::Format_RGB32); + const int qr_image_width = QR_IMAGE_SIZE + (2 * QR_IMAGE_MARGIN); + int qr_image_height = qr_image_width; + QFont font; + if (!text.isEmpty()) { + font = GUIUtil::fixedPitchFont(); + font.setStretch(QFont::SemiCondensed); + font.setLetterSpacing(QFont::AbsoluteSpacing, 1); + const qreal font_size = GUIUtil::calculateIdealFontSize(qr_image_width - 2 * QR_IMAGE_TEXT_MARGIN, text, font); + font.setPointSizeF(font_size); + + QFontMetrics fm(font); + qr_image_height += fm.height() + QR_IMAGE_TEXT_MARGIN; + } + QImage qrAddrImage(qr_image_width, qr_image_height, QImage::Format_RGB32); qrAddrImage.fill(0xffffff); { QPainter painter(&qrAddrImage); - painter.drawImage(QR_IMAGE_MARGIN, 0, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE)); + painter.drawImage(QR_IMAGE_MARGIN, QR_IMAGE_MARGIN, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE)); if (!text.isEmpty()) { QRect paddedRect = qrAddrImage.rect(); - paddedRect.setHeight(QR_IMAGE_SIZE + QR_IMAGE_TEXT_MARGIN); - - QFont font = GUIUtil::fixedPitchFont(); - font.setStretch(QFont::SemiCondensed); - font.setLetterSpacing(QFont::AbsoluteSpacing, 1); - const qreal font_size = GUIUtil::calculateIdealFontSize(paddedRect.width() - 2 * QR_IMAGE_TEXT_MARGIN, text, font); - font.setPointSizeF(font_size); + paddedRect.setHeight(paddedRect.height() - QR_IMAGE_TEXT_MARGIN); painter.setFont(font); painter.drawText(paddedRect, Qt::AlignBottom | Qt::AlignCenter, text); diff --git a/src/qt/qrimagewidget.h b/src/qt/qrimagewidget.h index a031bd7632..55ae49e161 100644 --- a/src/qt/qrimagewidget.h +++ b/src/qt/qrimagewidget.h @@ -12,9 +12,9 @@ static const int MAX_URI_LENGTH = 255; /* Size of exported QR Code image */ -static constexpr int QR_IMAGE_SIZE = 300; -static constexpr int QR_IMAGE_TEXT_MARGIN = 10; -static constexpr int QR_IMAGE_MARGIN = 2 * QR_IMAGE_TEXT_MARGIN; +static constexpr int QR_IMAGE_SIZE = 252; +static constexpr int QR_IMAGE_TEXT_MARGIN = 8; +static constexpr int QR_IMAGE_MARGIN = 24; QT_BEGIN_NAMESPACE class QMenu; From 91d24c84ba4bc929df96ffd46c591ad3a92757bd Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Mon, 13 Dec 2021 06:19:21 +0000 Subject: [PATCH 2/7] Bugfix: GUI/QRImageWidget: If text won't fit, split across multiple lines This ensures even with a font we can't scale down enough, the text doesn't get cut off --- src/qt/qrimagewidget.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/qt/qrimagewidget.cpp b/src/qt/qrimagewidget.cpp index ae2e77bbf1..7f955700d5 100644 --- a/src/qt/qrimagewidget.cpp +++ b/src/qt/qrimagewidget.cpp @@ -64,31 +64,47 @@ bool QRImageWidget::setQR(const QString& data, const QString& text) } QRcode_free(code); - const int qr_image_width = QR_IMAGE_SIZE + (2 * QR_IMAGE_MARGIN); + int qr_image_width = QR_IMAGE_SIZE + (2 * QR_IMAGE_MARGIN); int qr_image_height = qr_image_width; + int qr_image_x_margin = QR_IMAGE_MARGIN; + int text_lines; QFont font; - if (!text.isEmpty()) { + if (text.isEmpty()) { + text_lines = 0; + } else { + // Determine font to use font = GUIUtil::fixedPitchFont(); font.setStretch(QFont::SemiCondensed); font.setLetterSpacing(QFont::AbsoluteSpacing, 1); - const qreal font_size = GUIUtil::calculateIdealFontSize(qr_image_width - 2 * QR_IMAGE_TEXT_MARGIN, text, font); + const int max_text_width = qr_image_width - (2 * QR_IMAGE_TEXT_MARGIN); + const qreal font_size = GUIUtil::calculateIdealFontSize(max_text_width, text, font); font.setPointSizeF(font_size); + // Plan how many lines are needed QFontMetrics fm(font); - qr_image_height += fm.height() + QR_IMAGE_TEXT_MARGIN; + const int text_width = GUIUtil::TextWidth(fm, text); + text_lines = (text_width + max_text_width - 1) / max_text_width; + qr_image_height += (fm.height() * text_lines) + QR_IMAGE_TEXT_MARGIN; } QImage qrAddrImage(qr_image_width, qr_image_height, QImage::Format_RGB32); qrAddrImage.fill(0xffffff); { QPainter painter(&qrAddrImage); - painter.drawImage(QR_IMAGE_MARGIN, QR_IMAGE_MARGIN, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE)); + painter.drawImage(qr_image_x_margin, QR_IMAGE_MARGIN, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE)); if (!text.isEmpty()) { QRect paddedRect = qrAddrImage.rect(); paddedRect.setHeight(paddedRect.height() - QR_IMAGE_TEXT_MARGIN); + QString text_wrapped = text; + const int char_per_line = (text.size() + text_lines - 1) / text_lines; + for (int line = 1, pos = 0; line < text_lines; ++line) { + pos += char_per_line; + text_wrapped.insert(pos, QChar{'\n'}); + } + painter.setFont(font); - painter.drawText(paddedRect, Qt::AlignBottom | Qt::AlignCenter, text); + painter.drawText(paddedRect, Qt::AlignBottom | Qt::AlignCenter, text_wrapped); } } From 4c5143d56c98d4f9f961059692f155bbe2248c44 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Mon, 13 Dec 2021 06:19:49 +0000 Subject: [PATCH 3/7] GUI/QRImageWidget: Allow image to grow up to 25% wider to accomidate single-line text Accomidates addresses that are just barely too long for the QRCode width --- src/qt/qrimagewidget.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/qt/qrimagewidget.cpp b/src/qt/qrimagewidget.cpp index 7f955700d5..e8017cee54 100644 --- a/src/qt/qrimagewidget.cpp +++ b/src/qt/qrimagewidget.cpp @@ -83,7 +83,14 @@ bool QRImageWidget::setQR(const QString& data, const QString& text) // Plan how many lines are needed QFontMetrics fm(font); const int text_width = GUIUtil::TextWidth(fm, text); - text_lines = (text_width + max_text_width - 1) / max_text_width; + if (text_width > max_text_width && text_width < max_text_width * 5 / 4) { + // Allow the image to grow up to 25% wider + qr_image_width = text_width + (2 * QR_IMAGE_TEXT_MARGIN); + qr_image_x_margin = (qr_image_width - QR_IMAGE_SIZE) / 2; + text_lines = 1; + } else { + text_lines = (text_width + max_text_width - 1) / max_text_width; + } qr_image_height += (fm.height() * text_lines) + QR_IMAGE_TEXT_MARGIN; } QImage qrAddrImage(qr_image_width, qr_image_height, QImage::Format_RGB32); From 9166bb76d5cbef95d37503485dd0f33c1ea5feb0 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Sat, 1 May 2021 16:40:28 +0300 Subject: [PATCH 4/7] qt: Add "Alternating Row Color" settings for the Peers Tab Github-Pull: gui#307 Rebased-From: b124c2fe600b343a2bc66ff8eb0aaf43aa99f4db --- src/qt/forms/debugwindow.ui | 6 ------ src/qt/forms/optionsdialog.ui | 14 ++++++++++++-- src/qt/optionsdialog.cpp | 1 + src/qt/optionsmodel.cpp | 13 +++++++++++++ src/qt/optionsmodel.h | 4 ++++ src/qt/rpcconsole.cpp | 9 +++++++++ src/qt/rpcconsole.h | 1 + 7 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui index 60e9bcde33..3b146c2514 100644 --- a/src/qt/forms/debugwindow.ui +++ b/src/qt/forms/debugwindow.ui @@ -893,9 +893,6 @@ false - - true - Qt::ElideMiddle @@ -957,9 +954,6 @@ false - - true - true diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index 99fb238772..19063e5238 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -6,8 +6,8 @@ 0 0 - 560 - 440 + 646 + 529 @@ -796,6 +796,16 @@ + + + + Alternate the row colors for the "Peers" and "Banned peers" tables in the Peers tab. + + + Alternate row colors in the Peers tab + + + diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index a87bef796c..a7cb75d198 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -319,6 +319,7 @@ void OptionsDialog::setMapper() #endif /* Display */ + mapper->addMapping(ui->peersTabAlternatingRowColors, OptionsModel::PeersTabAlternatingRowColors); mapper->addMapping(ui->lang, OptionsModel::Language); mapper->addMapping(ui->unit, OptionsModel::DisplayUnit); mapper->addMapping(ui->thirdPartyTxUrls, OptionsModel::ThirdPartyTxUrls); diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index d816a72ca3..bfd368f704 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -258,6 +258,12 @@ bool OptionsModel::Init(bilingual_str& error) } Q_EMIT fontForMoneyChanged(getFontForMoney()); + if (!settings.contains("PeersTabAlternatingRowColors")) { + settings.setValue("PeersTabAlternatingRowColors", "false"); + } + m_peers_tab_alternating_row_colors = settings.value("PeersTabAlternatingRowColors").toBool(); + Q_EMIT peersTabAlternatingRowColorsChanged(m_peers_tab_alternating_row_colors); + m_mask_values = settings.value("mask_values", false).toBool(); return true; @@ -466,6 +472,8 @@ QVariant OptionsModel::getOption(OptionID option, const std::string& suffix) con return QString::fromStdString(SettingToString(setting(), "")); case FontForMoney: return QVariant::fromValue(m_font_money); + case PeersTabAlternatingRowColors: + return m_peers_tab_alternating_row_colors; case CoinControlFeatures: return fCoinControlFeatures; case EnablePSBTControls: @@ -649,6 +657,11 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value, const std:: Q_EMIT fontForMoneyChanged(getFontForMoney()); break; } + case PeersTabAlternatingRowColors: + m_peers_tab_alternating_row_colors = value.toBool(); + settings.setValue("PeersTabAlternatingRowColors", m_peers_tab_alternating_row_colors); + Q_EMIT peersTabAlternatingRowColorsChanged(m_peers_tab_alternating_row_colors); + break; case CoinControlFeatures: fCoinControlFeatures = value.toBool(); settings.setValue("fCoinControlFeatures", fCoinControlFeatures); diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index b5ea6c783e..0c45828222 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -63,6 +63,7 @@ public: ThirdPartyTxUrls, // QString Language, // QString FontForMoney, // FontChoice + PeersTabAlternatingRowColors, // bool CoinControlFeatures, // bool SubFeeFromAmount, // bool ThreadsScriptVerif, // int @@ -104,6 +105,7 @@ public: BitcoinUnit getDisplayUnit() const { return m_display_bitcoin_unit; } QString getThirdPartyTxUrls() const { return strThirdPartyTxUrls; } QFont getFontForMoney() const; + bool getPeersTabAlternatingRowColors() const { return m_peers_tab_alternating_row_colors; } bool getCoinControlFeatures() const { return fCoinControlFeatures; } bool getSubFeeFromAmount() const { return m_sub_fee_from_amount; } bool getEnablePSBTControls() const { return m_enable_psbt_controls; } @@ -131,6 +133,7 @@ private: BitcoinUnit m_display_bitcoin_unit; QString strThirdPartyTxUrls; FontChoice m_font_money{FontChoiceAbstract::EmbeddedFont}; + bool m_peers_tab_alternating_row_colors; bool fCoinControlFeatures; bool m_sub_fee_from_amount; bool m_enable_psbt_controls; @@ -153,6 +156,7 @@ Q_SIGNALS: void coinControlFeaturesChanged(bool); void showTrayIconChanged(bool); void fontForMoneyChanged(const QFont&); + void peersTabAlternatingRowColorsChanged(bool); }; Q_DECLARE_METATYPE(OptionsModel::FontChoice) diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index d2b184ebdf..2d00791175 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -489,6 +490,7 @@ RPCConsole::RPCConsole(interfaces::Node& node, const PlatformStyle *_platformSty m_peer_widget_header_state = settings.value("PeersTabPeerHeaderState").toByteArray(); m_banlist_widget_header_state = settings.value("PeersTabBanlistHeaderState").toByteArray(); + m_alternating_row_colors = settings.value("PeersTabAlternatingRowColors").toBool(); constexpr QChar nonbreaking_hyphen(8209); const std::vector CONNECTION_TYPE_DOC{ @@ -684,6 +686,11 @@ void RPCConsole::setClientModel(ClientModel *model, int bestblock_height, int64_ connect(model, &ClientModel::mempoolSizeChanged, this, &RPCConsole::setMempoolSize); + connect(model->getOptionsModel(), &OptionsModel::peersTabAlternatingRowColorsChanged, [this](bool alternating_row_colors) { + ui->peerWidget->setAlternatingRowColors(alternating_row_colors); + ui->banlistWidget->setAlternatingRowColors(alternating_row_colors); + }); + // set up peer table ui->peerWidget->setModel(model->peerTableSortProxy()); ui->peerWidget->verticalHeader()->hide(); @@ -699,6 +706,7 @@ void RPCConsole::setClientModel(ClientModel *model, int bestblock_height, int64_ ui->peerWidget->horizontalHeader()->setSectionResizeMode(PeerTableModel::Age, QHeaderView::ResizeToContents); ui->peerWidget->horizontalHeader()->setStretchLastSection(true); ui->peerWidget->setItemDelegateForColumn(PeerTableModel::NetNodeId, new PeerIdViewDelegate(this)); + ui->peerWidget->setAlternatingRowColors(m_alternating_row_colors); // create peer table context menu peersTableContextMenu = new QMenu(this); @@ -731,6 +739,7 @@ void RPCConsole::setClientModel(ClientModel *model, int bestblock_height, int64_ } ui->banlistWidget->horizontalHeader()->setSectionResizeMode(BanTableModel::Address, QHeaderView::ResizeToContents); ui->banlistWidget->horizontalHeader()->setStretchLastSection(true); + ui->banlistWidget->setAlternatingRowColors(m_alternating_row_colors); // create ban table context menu banTableContextMenu = new QMenu(this); diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h index 358f68c3c8..5079887900 100644 --- a/src/qt/rpcconsole.h +++ b/src/qt/rpcconsole.h @@ -179,6 +179,7 @@ private: bool m_is_executing{false}; QByteArray m_peer_widget_header_state; QByteArray m_banlist_widget_header_state; + bool m_alternating_row_colors{false}; /** Update UI with latest network info from model. */ void updateNetworkState(); From d1815ce04df2097f18200f40650694e0ddfef52c Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 6 Dec 2022 03:28:50 +0000 Subject: [PATCH 5/7] Diff-minimise --- src/qt/forms/debugwindow.ui | 6 ++++++ src/qt/forms/optionsdialog.ui | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui index 3b146c2514..60e9bcde33 100644 --- a/src/qt/forms/debugwindow.ui +++ b/src/qt/forms/debugwindow.ui @@ -893,6 +893,9 @@ false + + true + Qt::ElideMiddle @@ -954,6 +957,9 @@ false + + true + true diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index 19063e5238..e70bf3764d 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -6,8 +6,8 @@ 0 0 - 646 - 529 + 560 + 440 From 52ecf5b65ec43b3d0ab45cf07854794604194c2f Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 11 Jan 2022 01:26:16 +0000 Subject: [PATCH 6/7] GUI: Enable customisation of QR Code font --- src/qt/forms/optionsdialog.ui | 25 +++++++++++++++++++++++++ src/qt/optionsdialog.cpp | 10 ++++++++++ src/qt/optionsmodel.cpp | 16 ++++++++++++++++ src/qt/optionsmodel.h | 4 ++++ src/qt/qrimagewidget.cpp | 27 ++++++++++++++++++++------- src/qt/qrimagewidget.h | 5 ++++- src/qt/receiverequestdialog.cpp | 5 ++++- 7 files changed, 83 insertions(+), 9 deletions(-) diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index e70bf3764d..7d8d8446aa 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -796,6 +796,31 @@ + + + + + + Font in QR Codes: + + + qrFont + + + + + + + + + + 1NS17iag9jJgT… +bc1p2q3rvn3gp… + + + + + diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index a7cb75d198..da330e71b2 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -205,6 +205,12 @@ OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet) } setupFontOptions(ui->moneyFont, ui->moneyFont_preview); + setupFontOptions(ui->qrFont, ui->qrFont_preview); +#ifndef USE_QRCODE + ui->qrFontLabel->setVisible(false); + ui->qrFont->setVisible(false); + ui->qrFont_preview->setVisible(false); +#endif GUIUtil::handleCloseWindowShortcut(this); } @@ -245,6 +251,9 @@ void OptionsDialog::setModel(OptionsModel *_model) const auto& font_for_money = _model->data(_model->index(OptionsModel::FontForMoney, 0), Qt::EditRole).value(); setFontChoice(ui->moneyFont, font_for_money); + const auto& font_for_qrcodes = _model->data(_model->index(OptionsModel::FontForQRCodes, 0), Qt::EditRole).value(); + setFontChoice(ui->qrFont, font_for_qrcodes); + updateDefaultProxyNets(); } @@ -385,6 +394,7 @@ void OptionsDialog::on_openBitcoinConfButton_clicked() void OptionsDialog::on_okButton_clicked() { model->setData(model->index(OptionsModel::FontForMoney, 0), ui->moneyFont->itemData(ui->moneyFont->currentIndex())); + model->setData(model->index(OptionsModel::FontForQRCodes, 0), ui->qrFont->itemData(ui->qrFont->currentIndex())); mapper->submit(); accept(); diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index bfd368f704..8a8898ab3f 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -258,6 +258,11 @@ bool OptionsModel::Init(bilingual_str& error) } Q_EMIT fontForMoneyChanged(getFontForMoney()); + if (settings.contains("FontForQRCodes")) { + m_font_qrcodes = FontChoiceFromString(settings.value("FontForQRCodes").toString()); + } + Q_EMIT fontForQRCodesChanged(getFontChoiceForQRCodes()); + if (!settings.contains("PeersTabAlternatingRowColors")) { settings.setValue("PeersTabAlternatingRowColors", "false"); } @@ -472,6 +477,8 @@ QVariant OptionsModel::getOption(OptionID option, const std::string& suffix) con return QString::fromStdString(SettingToString(setting(), "")); case FontForMoney: return QVariant::fromValue(m_font_money); + case FontForQRCodes: + return QVariant::fromValue(m_font_qrcodes); case PeersTabAlternatingRowColors: return m_peers_tab_alternating_row_colors; case CoinControlFeatures: @@ -657,6 +664,15 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value, const std:: Q_EMIT fontForMoneyChanged(getFontForMoney()); break; } + case FontForQRCodes: + { + const auto& new_font = value.value(); + if (m_font_qrcodes == new_font) break; + settings.setValue("FontForQRCodes", FontChoiceToString(new_font)); + m_font_qrcodes = new_font; + Q_EMIT fontForQRCodesChanged(new_font); + break; + } case PeersTabAlternatingRowColors: m_peers_tab_alternating_row_colors = value.toBool(); settings.setValue("PeersTabAlternatingRowColors", m_peers_tab_alternating_row_colors); diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 0c45828222..db677fc16c 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -63,6 +63,7 @@ public: ThirdPartyTxUrls, // QString Language, // QString FontForMoney, // FontChoice + FontForQRCodes, // FontChoice PeersTabAlternatingRowColors, // bool CoinControlFeatures, // bool SubFeeFromAmount, // bool @@ -105,6 +106,7 @@ public: BitcoinUnit getDisplayUnit() const { return m_display_bitcoin_unit; } QString getThirdPartyTxUrls() const { return strThirdPartyTxUrls; } QFont getFontForMoney() const; + FontChoice getFontChoiceForQRCodes() const { return m_font_qrcodes; } bool getPeersTabAlternatingRowColors() const { return m_peers_tab_alternating_row_colors; } bool getCoinControlFeatures() const { return fCoinControlFeatures; } bool getSubFeeFromAmount() const { return m_sub_fee_from_amount; } @@ -133,6 +135,7 @@ private: BitcoinUnit m_display_bitcoin_unit; QString strThirdPartyTxUrls; FontChoice m_font_money{FontChoiceAbstract::EmbeddedFont}; + FontChoice m_font_qrcodes{FontChoiceAbstract::BestSystemFont}; bool m_peers_tab_alternating_row_colors; bool fCoinControlFeatures; bool m_sub_fee_from_amount; @@ -156,6 +159,7 @@ Q_SIGNALS: void coinControlFeaturesChanged(bool); void showTrayIconChanged(bool); void fontForMoneyChanged(const QFont&); + void fontForQRCodesChanged(const FontChoice&); void peersTabAlternatingRowColorsChanged(bool); }; diff --git a/src/qt/qrimagewidget.cpp b/src/qt/qrimagewidget.cpp index 2ee742edb2..b692c76e2e 100644 --- a/src/qt/qrimagewidget.cpp +++ b/src/qt/qrimagewidget.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -31,7 +32,7 @@ QRImageWidget::QRImageWidget(QWidget* parent) contextMenu->addAction(tr("&Copy Image"), this, &QRImageWidget::copyImage); } -bool QRImageWidget::setQR(const QString& data, const QString& text) +bool QRImageWidget::setQR(const QString& data, const QString& text, const OptionsModel::FontChoice& fontchoice) { #ifdef USE_QRCODE setText(""); @@ -68,13 +69,20 @@ bool QRImageWidget::setQR(const QString& data, const QString& text) if (text.isEmpty()) { text_lines = 0; } else { - // Determine font to use - font = GUIUtil::fixedPitchFont(); - font.setStretch(QFont::SemiCondensed); - font.setLetterSpacing(QFont::AbsoluteSpacing, 1); const int max_text_width = qr_image_width - (2 * QR_IMAGE_TEXT_MARGIN); - const qreal font_size = GUIUtil::calculateIdealFontSize(max_text_width, text, font); - font.setPointSizeF(font_size); + + // Determine font to use + if (std::holds_alternative(fontchoice)) { + font = GUIUtil::fixedPitchFont(fontchoice != OptionsModel::UseBestSystemFont); + font.setWeight(QFont::Bold); + font.setStretch(QFont::SemiCondensed); + font.setLetterSpacing(QFont::AbsoluteSpacing, 1); + + const qreal font_size = GUIUtil::calculateIdealFontSize(max_text_width, text, font); + font.setPointSizeF(font_size); + } else { + font = std::get(fontchoice); + } // Plan how many lines are needed QFontMetrics fm(font); @@ -120,6 +128,11 @@ bool QRImageWidget::setQR(const QString& data, const QString& text) #endif } +bool QRImageWidget::setQR(const QString& data) +{ + return setQR(data, "", OptionsModel::FontChoiceAbstract::EmbeddedFont); +} + QImage QRImageWidget::exportImage() { return GUIUtil::GetImage(this); diff --git a/src/qt/qrimagewidget.h b/src/qt/qrimagewidget.h index 11339f06b2..7f775cf146 100644 --- a/src/qt/qrimagewidget.h +++ b/src/qt/qrimagewidget.h @@ -5,6 +5,8 @@ #ifndef BITCOIN_QT_QRIMAGEWIDGET_H #define BITCOIN_QT_QRIMAGEWIDGET_H +#include + #include #include @@ -29,7 +31,8 @@ class QRImageWidget : public QLabel public: explicit QRImageWidget(QWidget *parent = nullptr); - bool setQR(const QString& data, const QString& text = ""); + bool setQR(const QString& data); + bool setQR(const QString& data, const QString& text, const OptionsModel::FontChoice& fontchoice); QImage exportImage(); public Q_SLOTS: diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/receiverequestdialog.cpp index 3453857f98..c7fed91033 100644 --- a/src/qt/receiverequestdialog.cpp +++ b/src/qt/receiverequestdialog.cpp @@ -49,8 +49,11 @@ void ReceiveRequestDialog::setInfo(const SendCoinsRecipient &_info) QString uri = GUIUtil::formatBitcoinURI(info); #ifdef USE_QRCODE - if (ui->qr_code->setQR(uri, info.address)) { + if (ui->qr_code->setQR(uri, info.address, model->getOptionsModel()->getFontChoiceForQRCodes())) { connect(ui->btnSaveAs, &QPushButton::clicked, ui->qr_code, &QRImageWidget::saveImage); + connect(model->getOptionsModel(), &OptionsModel::fontForQRCodesChanged, this, [&](const OptionsModel::FontChoice& fontchoice){ + ui->qr_code->setQR(uri, info.address, fontchoice); + }); } else { ui->btnSaveAs->setEnabled(false); } From 2393def608de4e95001aa3d1a8018ea884a8663d Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Tue, 11 Jan 2022 01:39:45 +0000 Subject: [PATCH 7/7] GUI: Change default QR Code font to embedded --- src/qt/optionsmodel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index db677fc16c..e7048e4b2e 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -135,7 +135,7 @@ private: BitcoinUnit m_display_bitcoin_unit; QString strThirdPartyTxUrls; FontChoice m_font_money{FontChoiceAbstract::EmbeddedFont}; - FontChoice m_font_qrcodes{FontChoiceAbstract::BestSystemFont}; + FontChoice m_font_qrcodes{FontChoiceAbstract::EmbeddedFont}; bool m_peers_tab_alternating_row_colors; bool fCoinControlFeatures; bool m_sub_fee_from_amount;