From 5960bb33ef79c29d6c23e9dd7ba34b01ebec7e7a Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 27 Jun 2024 16:50:49 +0200 Subject: [PATCH] ExtensionManager: Draw icon of disabled items with less intensity Since recently, the green background is used for enabled plugins and grey is for disabled ones. With that change comes the requirement to draw the icon for disabled icons with less intensity, to make it really appear disabled. I took this opportunity to unify the drawing of small/big enabled/ disabled pack/extension icon variants in a central helper function. Change-Id: Ia68218c774ccb8e9e7ed48620ac36f4bca0724fd Reviewed-by: Cristian Adam --- .../extensionmanagerwidget.cpp | 31 +------- .../extensionmanager/extensionsbrowser.cpp | 77 +++++++++++-------- .../extensionmanager/extensionsbrowser.h | 9 ++- 3 files changed, 57 insertions(+), 60 deletions(-) diff --git a/src/plugins/extensionmanager/extensionmanagerwidget.cpp b/src/plugins/extensionmanager/extensionmanagerwidget.cpp index 5ab0126a94b..429d9a241f3 100644 --- a/src/plugins/extensionmanager/extensionmanagerwidget.cpp +++ b/src/plugins/extensionmanager/extensionmanagerwidget.cpp @@ -113,7 +113,6 @@ private: class HeadingWidget : public QWidget { - static constexpr QSize iconBgS{68, 68}; static constexpr int dividerH = 16; Q_OBJECT @@ -123,7 +122,7 @@ public: : QWidget(parent) { m_icon = new QLabel; - m_icon->setFixedSize(iconBgS); + m_icon->setFixedSize(iconBgSizeBig); static const TextFormat titleTF {Theme::Token_Text_Default, UiElementH4}; @@ -200,7 +199,7 @@ public: if (!current.isValid()) return; - m_icon->setPixmap(icon(current)); + m_icon->setPixmap(itemIcon(current, SizeBig)); const QString name = current.data(RoleName).toString(); m_title->setText(name); @@ -236,32 +235,6 @@ signals: void vendorClicked(const QString &vendor); private: - static QPixmap icon(const QModelIndex &index) - { - const qreal dpr = qApp->devicePixelRatio(); - QPixmap pixmap(iconBgS * dpr); - pixmap.fill(Qt::transparent); - pixmap.setDevicePixelRatio(dpr); - const QRect bgR(QPoint(), pixmap.deviceIndependentSize().toSize()); - - QPainter p(&pixmap); - QLinearGradient gradient(bgR.topRight(), bgR.bottomLeft()); - gradient.setStops(iconGradientStops(index)); - constexpr int iconRectRounding = 4; - WelcomePageHelpers::drawCardBackground(&p, bgR, gradient, Qt::NoPen, iconRectRounding); - - // Icon - constexpr Theme::Color color = Theme::Token_Basic_White; - static const QIcon pack = Icon({{":/extensionmanager/images/packbig.png", color}}, - Icon::Tint).icon(); - static const QIcon extension = Icon({{":/extensionmanager/images/extensionbig.png", - color}}, Icon::Tint).icon(); - const ItemType itemType = index.data(RoleItemType).value(); - (itemType == ItemTypePack ? pack : extension).paint(&p, bgR); - - return pixmap; - } - QLabel *m_icon; QLabel *m_title; Button *m_vendor; diff --git a/src/plugins/extensionmanager/extensionsbrowser.cpp b/src/plugins/extensionmanager/extensionsbrowser.cpp index ad96ac5901c..21d4a79a7ce 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.cpp +++ b/src/plugins/extensionmanager/extensionsbrowser.cpp @@ -61,7 +61,6 @@ class ExtensionItemDelegate : public QItemDelegate { public: constexpr static QSize dividerS{1, 16}; - constexpr static QSize iconBgS{50, 50}; constexpr static TextFormat itemNameTF {Theme::Token_Text_Default, UiElement::UiElementH6}; constexpr static TextFormat countTF @@ -102,15 +101,15 @@ public: const QRect bgRGlobal = option.rect.adjusted(0, 0, -gapSize, -gapSize); const QRect bgR = bgRGlobal.translated(-option.rect.topLeft()); - const int middleColumnW = bgR.width() - ExPaddingGapL - iconBgS.width() - ExPaddingGapL - - ExPaddingGapL; + const int middleColumnW = bgR.width() - ExPaddingGapL - iconBgSizeSmall.width() + - ExPaddingGapL - ExPaddingGapL; int x = bgR.x(); int y = bgR.y(); x += ExPaddingGapL; - const QRect iconBgR(x, y + (bgR.height() - iconBgS.height()) / 2, - iconBgS.width(), iconBgS.height()); - x += iconBgS.width() + ExPaddingGapL; + const QRect iconBgR(x, y + (bgR.height() - iconBgSizeSmall.height()) / 2, + iconBgSizeSmall.width(), iconBgSizeSmall.height()); + x += iconBgSizeSmall.width() + ExPaddingGapL; y += ExPaddingGapL; const QRect itemNameR(x, y, middleColumnW, itemNameTF.lineHeight()); const QString itemName = index.data().toString(); @@ -142,18 +141,8 @@ public: WelcomePageHelpers::drawCardBackground(painter, bgR, fillColor, strokeColor); } { - QLinearGradient gradient(iconBgR.topRight(), iconBgR.bottomLeft()); - gradient.setStops(iconGradientStops(index)); - constexpr int iconRectRounding = 4; - drawCardBackground(painter, iconBgR, gradient, Qt::NoPen, iconRectRounding); - - // Icon - constexpr Theme::Color color = Theme::Token_Basic_White; - static const QIcon pack = Icon({{":/extensionmanager/images/packsmall.png", color}}, - Icon::Tint).icon(); - static const QIcon extension = Icon({{":/extensionmanager/images/extensionsmall.png", - color}}, Icon::Tint).icon(); - (isPack ? pack : extension).paint(painter, iconBgR); + const QPixmap icon = itemIcon(index, SizeSmall); + painter->drawPixmap(iconBgR.topLeft(), icon); } if (isPack) { constexpr int circleSize = 18; @@ -241,7 +230,7 @@ public: + tagsTF.lineHeight(); const int height = ExPaddingGapL - + qMax(iconBgS.height(), middleColumnH) + + qMax(iconBgSizeSmall.height(), middleColumnH) + ExPaddingGapL; return {cellWidth, height + gapSize}; } @@ -462,20 +451,48 @@ QLabel *tfLabel(const TextFormat &tf, bool singleLine) return label; } -QGradientStops iconGradientStops(const QModelIndex &index) +QPixmap itemIcon(const QModelIndex &index, Size size) { - const PluginSpec *ps = pluginSpecForName(index.data(RoleName).toString()); - const bool greenGradient = ps != nullptr && ps->isEffectivelyEnabled(); + const QSize iconBgS = size == SizeSmall ? iconBgSizeSmall : iconBgSizeBig; + const qreal dpr = qApp->devicePixelRatio(); + QPixmap pixmap(iconBgS * dpr); + pixmap.fill(Qt::transparent); + pixmap.setDevicePixelRatio(dpr); + const QRect iconBgR(QPoint(), pixmap.deviceIndependentSize().toSize()); - const QColor startColor = creatorColor(greenGradient ? Theme::Token_Gradient01_Start - : Theme::Token_Gradient02_Start); - const QColor endColor = creatorColor(greenGradient ? Theme::Token_Gradient01_End - : Theme::Token_Gradient02_End); - const QGradientStops gradient = { - {0, startColor}, - {1, endColor}, + const PluginSpec *ps = pluginSpecForName(index.data(RoleName).toString()); + const bool isEnabled = ps == nullptr || ps->isEffectivelyEnabled(); + const QGradientStops gradientStops = { + {0, creatorColor(isEnabled ? Theme::Token_Gradient01_Start + : Theme::Token_Gradient02_Start)}, + {1, creatorColor(isEnabled ? Theme::Token_Gradient01_End + : Theme::Token_Gradient02_End)}, }; - return gradient; + + const Theme::Color color = Theme::Token_Basic_White; + static const QIcon packS = Icon({{":/extensionmanager/images/packsmall.png", color}}, + Icon::Tint).icon(); + static const QIcon packB = Icon({{":/extensionmanager/images/packbig.png", color}}, + Icon::Tint).icon(); + static const QIcon extensionS = Icon({{":/extensionmanager/images/extensionsmall.png", + color}}, Icon::Tint).icon(); + static const QIcon extensionB = Icon({{":/extensionmanager/images/extensionbig.png", + color}}, Icon::Tint).icon(); + const ItemType itemType = index.data(RoleItemType).value(); + const QIcon &icon = (itemType == ItemTypePack) ? (size == SizeSmall ? packS : packB) + : (size == SizeSmall ? extensionS : extensionB); + const int iconRectRounding = 4; + const qreal iconOpacityDisabled = 0.6; + + QPainter p(&pixmap); + QLinearGradient gradient(iconBgR.topRight(), iconBgR.bottomLeft()); + gradient.setStops(gradientStops); + WelcomePageHelpers::drawCardBackground(&p, iconBgR, gradient, Qt::NoPen, iconRectRounding); + if (!isEnabled) + p.setOpacity(iconOpacityDisabled); + icon.paint(&p, iconBgR); + + return pixmap; } } // ExtensionManager::Internal diff --git a/src/plugins/extensionmanager/extensionsbrowser.h b/src/plugins/extensionmanager/extensionsbrowser.h index 4e0b87c5936..f132f598810 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.h +++ b/src/plugins/extensionmanager/extensionsbrowser.h @@ -40,6 +40,13 @@ private: }; QLabel *tfLabel(const Core::WelcomePageHelpers::TextFormat &tf, bool singleLine = true); -QGradientStops iconGradientStops(const QModelIndex &index); + +constexpr static QSize iconBgSizeSmall{50, 50}; +constexpr static QSize iconBgSizeBig{68, 68}; +enum Size { + SizeSmall, + SizeBig, +}; +QPixmap itemIcon(const QModelIndex &index, Size size); } // ExtensionManager::Internal