diff --git a/src/libs/utils/icon.cpp b/src/libs/utils/icon.cpp index c40314d6d75..f63a5e094a4 100644 --- a/src/libs/utils/icon.cpp +++ b/src/libs/utils/icon.cpp @@ -146,6 +146,25 @@ Icon::Icon(const FilePath &imageFileName) { } +using OptMasksAndColors = std::optional; +OptMasksAndColors highlightMasksAndColors(const MasksAndColors &defaultState, + const QList &masks) +{ + MasksAndColors highlighted = defaultState; + bool colorsReplaced = false; + int index = 0; + for (const IconMaskAndColor &mask : masks) { + const Theme::Color highlight = Theme::highlightFor(mask.second); + if (highlight != mask.second) { + highlighted[index].second = creatorColor(highlight); + colorsReplaced = true; + continue; + } + ++index; + } + return colorsReplaced ? std::make_optional(highlighted) : std::nullopt; +} + QIcon Icon::icon() const { if (m_iconSourceList.isEmpty()) @@ -163,10 +182,20 @@ QIcon Icon::icon() const for (int dpr = 1; dpr <= maxDpr; dpr++) { const MasksAndColors masks = masksAndColors(m_iconSourceList, dpr); const QPixmap combinedMask = Utils::combinedMask(masks, m_style); - m_lastIcon.addPixmap(masksToIcon(masks, combinedMask, m_style)); - + m_lastIcon.addPixmap(masksToIcon(masks, combinedMask, m_style), QIcon::Normal, QIcon::Off); const QColor disabledColor = creatorColor(Theme::IconsDisabledColor); - m_lastIcon.addPixmap(maskToColorAndAlpha(combinedMask, disabledColor), QIcon::Disabled); + const QPixmap disabledIcon = maskToColorAndAlpha(combinedMask, disabledColor); + if (const OptMasksAndColors activeMasks = + highlightMasksAndColors(masks, m_iconSourceList); + activeMasks.has_value()) { + const QPixmap activePixmap = masksToIcon(activeMasks.value(), + combinedMask, m_style); + m_lastIcon.addPixmap(activePixmap, QIcon::Active, QIcon::On); + m_lastIcon.addPixmap(disabledIcon, QIcon::Disabled, QIcon::On); + m_lastIcon.addPixmap(disabledIcon, QIcon::Disabled, QIcon::Off); + } else { + m_lastIcon.addPixmap(disabledIcon, QIcon::Disabled); + } } return m_lastIcon; } diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 12db1cbda69..f06bae0c7b7 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -542,7 +542,8 @@ QPixmap StyleHelper::disabledSideBarIcon(const QPixmap &enabledicon) // Draws a cached pixmap with shadow void StyleHelper::drawIconWithShadow(const QIcon &icon, const QRect &rect, - QPainter *p, QIcon::Mode iconMode, int dipRadius, const QColor &color, const QPoint &dipOffset) + QPainter *p, QIcon::Mode iconMode, QIcon::State iconState, + int dipRadius, const QColor &color, const QPoint &dipOffset) { QPixmap cache; const qreal devicePixelRatio = p->device()->devicePixelRatioF(); @@ -555,7 +556,7 @@ void StyleHelper::drawIconWithShadow(const QIcon &icon, const QRect &rect, // return a high-dpi pixmap, which will in that case have a devicePixelRatio // different than 1. The shadow drawing caluculations are done in device // pixels. - QPixmap px = icon.pixmap(rect.size(), devicePixelRatio, iconMode); + QPixmap px = icon.pixmap(rect.size(), devicePixelRatio, iconMode, iconState); int radius = int(dipRadius * devicePixelRatio); QPoint offset = dipOffset * devicePixelRatio; cache = QPixmap(px.size() + QSize(radius * 2, radius * 2)); diff --git a/src/libs/utils/stylehelper.h b/src/libs/utils/stylehelper.h index d774caaae90..1e3d3636eb5 100644 --- a/src/libs/utils/stylehelper.h +++ b/src/libs/utils/stylehelper.h @@ -152,7 +152,8 @@ QTCREATOR_UTILS_EXPORT bool usePixmapCache(); QTCREATOR_UTILS_EXPORT QPixmap disabledSideBarIcon(const QPixmap &enabledicon); QTCREATOR_UTILS_EXPORT void drawIconWithShadow(const QIcon &icon, const QRect &rect, QPainter *p, - QIcon::Mode iconMode, int dipRadius = 3, + QIcon::Mode iconMode, QIcon::State iconState, + int dipRadius = 3, const QColor &color = QColor(0, 0, 0, 130), const QPoint &dipOffset = QPoint(1, -2)); QTCREATOR_UTILS_EXPORT void drawCornerImage(const QImage &img, QPainter *painter, const QRect &rect, diff --git a/src/libs/utils/theme/theme.cpp b/src/libs/utils/theme/theme.cpp index 0654dfc6ff5..322e6a26a6c 100644 --- a/src/libs/utils/theme/theme.cpp +++ b/src/libs/utils/theme/theme.cpp @@ -392,6 +392,15 @@ expected_str Theme::colorToken(const QString &tokenName, return result; } +Theme::Color Theme::highlightFor(Color role) +{ + QTC_ASSERT(creatorTheme(), return role); + static const QMap map = { + { creatorColor(Theme::Token_Text_Muted).rgba(), Theme::Token_Text_Default}, + }; + return map.value(creatorColor(role).rgba(), role); +} + QPalette Theme::initialPalette() { if (!m_initialPalette) { diff --git a/src/libs/utils/theme/theme.h b/src/libs/utils/theme/theme.h index b2459b445f1..9540324154d 100644 --- a/src/libs/utils/theme/theme.h +++ b/src/libs/utils/theme/theme.h @@ -561,6 +561,7 @@ public: static void setHelpMenu(QMenu *menu); static expected_str colorToken(const QString &token, TokenFlags flags = {}); + static Color highlightFor(Color role); protected: Theme(Theme *originTheme, QObject *parent = nullptr); diff --git a/src/plugins/coreplugin/fancyactionbar.cpp b/src/plugins/coreplugin/fancyactionbar.cpp index 9a873b1af32..f59c9987535 100644 --- a/src/plugins/coreplugin/fancyactionbar.cpp +++ b/src/plugins/coreplugin/fancyactionbar.cpp @@ -193,7 +193,7 @@ void FancyToolButton::paintEvent(QPaintEvent *event) centerRect.adjust(0, lineHeight + 4, 0, -lineHeight * 2 - 4); iconRect.moveCenter(centerRect.center()); - StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, iconMode); + StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, iconMode, QIcon::Off); painter.setFont(normalFont); QPoint textOffset = centerRect.center() @@ -243,7 +243,7 @@ void FancyToolButton::paintEvent(QPaintEvent *event) } else { iconRect.moveCenter(rect().center()); - StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, iconMode); + StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, iconMode, QIcon::Off); } // pop up arrow next to icon diff --git a/src/plugins/coreplugin/fancytabwidget.cpp b/src/plugins/coreplugin/fancytabwidget.cpp index 65fd61641d6..d5f9cc7e90e 100644 --- a/src/plugins/coreplugin/fancytabwidget.cpp +++ b/src/plugins/coreplugin/fancytabwidget.cpp @@ -97,7 +97,7 @@ void FancyTabBar::paintEvent(QPaintEvent *event) if (!m_tabs.at(i)->visible) continue; if (i != currentIndex()) - paintTab(&p, i, visibleIndex); + paintTab(&p, i, visibleIndex, QIcon::Off); else visibleCurrentIndex = visibleIndex; ++visibleIndex; @@ -105,7 +105,7 @@ void FancyTabBar::paintEvent(QPaintEvent *event) // paint active tab last, since it overlaps the neighbors if (currentIndex() != -1) - paintTab(&p, currentIndex(), visibleCurrentIndex); + paintTab(&p, currentIndex(), visibleCurrentIndex, QIcon::On); } // Handle hover events for mouse fade ins @@ -295,7 +295,7 @@ static void paintHighlight(QPainter *painter, const QRect &rect) } static void paintIcon(QPainter *painter, const QRect &rect, - const QIcon &icon, + const QIcon &icon, QIcon::State iconState, bool enabled, bool selected) { painter->save(); @@ -306,12 +306,12 @@ static void paintIcon(QPainter *painter, const QRect &rect, iconRect = iconRect.intersected(rect); if (!enabled && !creatorTheme()->flag(Theme::FlatToolBars)) painter->setOpacity(0.7); - StyleHelper::drawIconWithShadow(icon, iconRect, painter, iconMode); + StyleHelper::drawIconWithShadow(icon, iconRect, painter, iconMode, iconState); painter->restore(); } static void paintIconAndText(QPainter *painter, const QRect &rect, - const QIcon &icon, const QString &text, + const QIcon &icon, QIcon::State iconState, const QString &text, bool enabled, bool selected) { painter->save(); @@ -330,7 +330,7 @@ static void paintIconAndText(QPainter *painter, const QRect &rect, iconRect = iconRect.intersected(tabIconRect); if (!enabled && !creatorTheme()->flag(Theme::FlatToolBars)) painter->setOpacity(0.7); - StyleHelper::drawIconWithShadow(icon, iconRect, painter, iconMode); + StyleHelper::drawIconWithShadow(icon, iconRect, painter, iconMode, iconState); } painter->setOpacity(1.0); //FIXME: was 0.7 before? @@ -353,7 +353,8 @@ static void paintIconAndText(QPainter *painter, const QRect &rect, painter->restore(); } -void FancyTabBar::paintTab(QPainter *painter, int tabIndex, int visibleIndex) const +void FancyTabBar::paintTab(QPainter *painter, int tabIndex, int visibleIndex, + QIcon::State iconState) const { if (!validIndex(tabIndex)) { qWarning("invalid index"); @@ -387,9 +388,9 @@ void FancyTabBar::paintTab(QPainter *painter, int tabIndex, int visibleIndex) co } if (m_iconsOnly) - paintIcon(painter, rect, tab->icon, enabled, selected); + paintIcon(painter, rect, tab->icon, iconState, enabled, selected); else - paintIconAndText(painter, rect, tab->icon, tab->text, enabled, selected); + paintIconAndText(painter, rect, tab->icon, iconState, tab->text, enabled, selected); if (selected && creatorTheme()->flag(Theme::FlatToolBars)) paintHighlight(painter, rect); diff --git a/src/plugins/coreplugin/fancytabwidget.h b/src/plugins/coreplugin/fancytabwidget.h index 30de90b8f74..d2f716865e8 100644 --- a/src/plugins/coreplugin/fancytabwidget.h +++ b/src/plugins/coreplugin/fancytabwidget.h @@ -63,7 +63,7 @@ public: bool event(QEvent *event) override; void paintEvent(QPaintEvent *event) override; - void paintTab(QPainter *painter, int tabIndex, int visibleIndex) const; + void paintTab(QPainter *painter, int tabIndex, int visibleIndex, QIcon::State iconState) const; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void enterEvent(QEnterEvent *event) override; diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp index 3ac5562fcdf..a4df206fcf0 100644 --- a/src/plugins/coreplugin/manhattanstyle.cpp +++ b/src/plugins/coreplugin/manhattanstyle.cpp @@ -1161,6 +1161,8 @@ void ManhattanStyle::drawComplexControl(ComplexControl control, const QStyleOpti int fw = pixelMetric(PM_DefaultFrameWidth, option, widget); label.rect = button.adjusted(fw, fw, -fw, -fw); + if (toolbutton->state.testAnyFlags(State_Sunken)) + label.state.setFlag(State_On); drawControl(CE_ToolButtonLabel, &label, painter, widget); if (toolbutton->subControls & SC_ToolButtonMenu) {