From f726b0d90ba5c586425e4e8e5c08421e97997720 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 13 Jul 2020 17:17:39 +0200 Subject: [PATCH] QmlDesigner: Enable modes/states with icon font Add functionality to use modes and states when generating a QIcon from a font in StyleHelper Task-number: QDS-2558 Change-Id: I764e8434a645d0984c6104cd1868fd5b0091d225 Reviewed-by: Thomas Hartmann --- src/libs/utils/stylehelper.cpp | 35 ++++++++++++++++++++++++++++++++++ src/libs/utils/stylehelper.h | 30 +++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 6f8868cc7b2..4b317116c42 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -546,6 +546,41 @@ QLinearGradient StyleHelper::statusBarGradient(const QRect &statusBarRect) return grad; } +QIcon StyleHelper::getIconFromIconFont(const QString &fontName, const QList ¶meters) +{ + QFontDatabase a; + + QTC_ASSERT(a.hasFamily(fontName), {}); + + if (!a.hasFamily(fontName)) + return {}; + + QIcon icon; + + for (const IconFontHelper &p : parameters) { + const int maxDpr = qRound(qApp->devicePixelRatio()); + for (int dpr = 1; dpr <= maxDpr; dpr++) { + QPixmap pixmap(p.size() * dpr); + pixmap.setDevicePixelRatio(dpr); + pixmap.fill(Qt::transparent); + + QFont font(fontName); + font.setPixelSize(p.size().height()); + + QPainter painter(&pixmap); + painter.save(); + painter.setPen(p.color()); + painter.setFont(font); + painter.drawText(QRectF(QPoint(0, 0), p.size()), p.iconSymbol()); + painter.restore(); + + icon.addPixmap(pixmap, p.mode(), p.state()); + } + } + + return icon; +} + QIcon StyleHelper::getIconFromIconFont(const QString &fontName, const QString &iconSymbol, int fontSize, int iconSize, QColor color) { QFontDatabase a; diff --git a/src/libs/utils/stylehelper.h b/src/libs/utils/stylehelper.h index 09f32534352..a1a24a8d5b5 100644 --- a/src/libs/utils/stylehelper.h +++ b/src/libs/utils/stylehelper.h @@ -93,6 +93,36 @@ public: static void tintImage(QImage &img, const QColor &tintColor); static QLinearGradient statusBarGradient(const QRect &statusBarRect); + class IconFontHelper + { + public: + IconFontHelper(const QString &iconSymbol, + const QColor &color, + const QSize &size, + QIcon::Mode mode = QIcon::Normal, + QIcon::State state = QIcon::Off) + : m_iconSymbol(iconSymbol) + , m_color(color) + , m_size(size) + , m_mode(mode) + , m_state(state) + {} + + QString iconSymbol() const { return m_iconSymbol; } + QColor color() const { return m_color; } + QSize size() const { return m_size; } + QIcon::Mode mode() const { return m_mode; } + QIcon::State state() const { return m_state; } + + private: + QString m_iconSymbol; + QColor m_color; + QSize m_size; + QIcon::Mode m_mode; + QIcon::State m_state; + }; + + static QIcon getIconFromIconFont(const QString &fontName, const QList ¶meters); static QIcon getIconFromIconFont(const QString &fontName, const QString &iconSymbol, int fontSize, int iconSize, QColor color); static QIcon getIconFromIconFont(const QString &fontName, const QString &iconSymbol, int fontSize, int iconSize);