From d99ef327a885874fed1c4e35e0f47b10290c6bd9 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Thu, 8 Apr 2021 14:27:14 +0300 Subject: [PATCH] qt: Add GUIUtil::ThemedLabel class The ThemedLabel class correctly handles appearance changes on macOS. --- src/qt/guiutil.cpp | 31 +++++++++++++++++++++++++++++++ src/qt/guiutil.h | 20 ++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index d10bf9f9aeb..3c4f3df89d0 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -61,6 +62,7 @@ #include #include +#include #include #if defined(Q_OS_MAC) @@ -786,6 +788,35 @@ qreal calculateIdealFontSize(int width, const QString& text, QFont font, qreal m return font_size; } +ThemedLabel::ThemedLabel(const PlatformStyle* platform_style, QWidget* parent) + : QLabel{parent}, m_platform_style{platform_style} +{ + assert(m_platform_style); +} + +void ThemedLabel::setThemedPixmap(const QString& image_filename, int width, int height) +{ + m_image_filename = image_filename; + m_pixmap_width = width; + m_pixmap_height = height; + updateThemedPixmap(); +} + +void ThemedLabel::changeEvent(QEvent* e) +{ +#ifdef Q_OS_MACOS + if (e->type() == QEvent::PaletteChange) { + updateThemedPixmap(); + } +#endif + QLabel::changeEvent(e); +} + +void ThemedLabel::updateThemedPixmap() +{ + setPixmap(m_platform_style->SingleColorIcon(m_image_filename).pixmap(m_pixmap_width, m_pixmap_height)); +} + void ClickableLabel::mouseReleaseEvent(QMouseEvent *event) { Q_EMIT clicked(event->pos()); diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index a1cf2743549..31e7aa73355 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -27,6 +27,7 @@ #include #include +class PlatformStyle; class QValidatedLineEdit; class SendCoinsRecipient; @@ -221,6 +222,25 @@ namespace GUIUtil qreal calculateIdealFontSize(int width, const QString& text, QFont font, qreal minPointSize = 4, qreal startPointSize = 14); + class ThemedLabel : public QLabel + { + Q_OBJECT + + public: + explicit ThemedLabel(const PlatformStyle* platform_style, QWidget* parent = nullptr); + void setThemedPixmap(const QString& image_filename, int width, int height); + + protected: + void changeEvent(QEvent* e) override; + + private: + const PlatformStyle* m_platform_style; + QString m_image_filename; + int m_pixmap_width; + int m_pixmap_height; + void updateThemedPixmap(); + }; + class ClickableLabel : public QLabel { Q_OBJECT