forked from qt-creator/qt-creator
Theme: Implement QIcon::On state for new themes
The spec for the new themes defines that pressed toolbar and mode buttons have a stronger color. Defined is the change from Token_Text_Muted to Token_Text_Default. Themes which define another color than Token_Text_Muted for icons (it is the case for all other existing themes), are not affected by all of this. This change leads Utils::Icon to create an QIcon::On version of icons using the above mentioned color change. The actual painting of the new QIcon::On state is also implemeted for FancyToolBar and in ManhattanStyle. Fixes: QTCREATORBUG-31826 Change-Id: Ib57f1cbc14839cba6303220128f589883c990b9e Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
@@ -146,6 +146,25 @@ Icon::Icon(const FilePath &imageFileName)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using OptMasksAndColors = std::optional<MasksAndColors>;
|
||||||
|
OptMasksAndColors highlightMasksAndColors(const MasksAndColors &defaultState,
|
||||||
|
const QList<IconMaskAndColor> &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
|
QIcon Icon::icon() const
|
||||||
{
|
{
|
||||||
if (m_iconSourceList.isEmpty())
|
if (m_iconSourceList.isEmpty())
|
||||||
@@ -163,10 +182,20 @@ QIcon Icon::icon() const
|
|||||||
for (int dpr = 1; dpr <= maxDpr; dpr++) {
|
for (int dpr = 1; dpr <= maxDpr; dpr++) {
|
||||||
const MasksAndColors masks = masksAndColors(m_iconSourceList, dpr);
|
const MasksAndColors masks = masksAndColors(m_iconSourceList, dpr);
|
||||||
const QPixmap combinedMask = Utils::combinedMask(masks, m_style);
|
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);
|
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;
|
return m_lastIcon;
|
||||||
}
|
}
|
||||||
|
@@ -542,7 +542,8 @@ QPixmap StyleHelper::disabledSideBarIcon(const QPixmap &enabledicon)
|
|||||||
|
|
||||||
// Draws a cached pixmap with shadow
|
// Draws a cached pixmap with shadow
|
||||||
void StyleHelper::drawIconWithShadow(const QIcon &icon, const QRect &rect,
|
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;
|
QPixmap cache;
|
||||||
const qreal devicePixelRatio = p->device()->devicePixelRatioF();
|
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
|
// return a high-dpi pixmap, which will in that case have a devicePixelRatio
|
||||||
// different than 1. The shadow drawing caluculations are done in device
|
// different than 1. The shadow drawing caluculations are done in device
|
||||||
// pixels.
|
// pixels.
|
||||||
QPixmap px = icon.pixmap(rect.size(), devicePixelRatio, iconMode);
|
QPixmap px = icon.pixmap(rect.size(), devicePixelRatio, iconMode, iconState);
|
||||||
int radius = int(dipRadius * devicePixelRatio);
|
int radius = int(dipRadius * devicePixelRatio);
|
||||||
QPoint offset = dipOffset * devicePixelRatio;
|
QPoint offset = dipOffset * devicePixelRatio;
|
||||||
cache = QPixmap(px.size() + QSize(radius * 2, radius * 2));
|
cache = QPixmap(px.size() + QSize(radius * 2, radius * 2));
|
||||||
|
@@ -152,7 +152,8 @@ QTCREATOR_UTILS_EXPORT bool usePixmapCache();
|
|||||||
|
|
||||||
QTCREATOR_UTILS_EXPORT QPixmap disabledSideBarIcon(const QPixmap &enabledicon);
|
QTCREATOR_UTILS_EXPORT QPixmap disabledSideBarIcon(const QPixmap &enabledicon);
|
||||||
QTCREATOR_UTILS_EXPORT void drawIconWithShadow(const QIcon &icon, const QRect &rect, QPainter *p,
|
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 QColor &color = QColor(0, 0, 0, 130),
|
||||||
const QPoint &dipOffset = QPoint(1, -2));
|
const QPoint &dipOffset = QPoint(1, -2));
|
||||||
QTCREATOR_UTILS_EXPORT void drawCornerImage(const QImage &img, QPainter *painter, const QRect &rect,
|
QTCREATOR_UTILS_EXPORT void drawCornerImage(const QImage &img, QPainter *painter, const QRect &rect,
|
||||||
|
@@ -392,6 +392,15 @@ expected_str<Theme::Color> Theme::colorToken(const QString &tokenName,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Theme::Color Theme::highlightFor(Color role)
|
||||||
|
{
|
||||||
|
QTC_ASSERT(creatorTheme(), return role);
|
||||||
|
static const QMap<QRgb, Theme::Color> map = {
|
||||||
|
{ creatorColor(Theme::Token_Text_Muted).rgba(), Theme::Token_Text_Default},
|
||||||
|
};
|
||||||
|
return map.value(creatorColor(role).rgba(), role);
|
||||||
|
}
|
||||||
|
|
||||||
QPalette Theme::initialPalette()
|
QPalette Theme::initialPalette()
|
||||||
{
|
{
|
||||||
if (!m_initialPalette) {
|
if (!m_initialPalette) {
|
||||||
|
@@ -561,6 +561,7 @@ public:
|
|||||||
static void setHelpMenu(QMenu *menu);
|
static void setHelpMenu(QMenu *menu);
|
||||||
|
|
||||||
static expected_str<Color> colorToken(const QString &token, TokenFlags flags = {});
|
static expected_str<Color> colorToken(const QString &token, TokenFlags flags = {});
|
||||||
|
static Color highlightFor(Color role);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Theme(Theme *originTheme, QObject *parent = nullptr);
|
Theme(Theme *originTheme, QObject *parent = nullptr);
|
||||||
|
@@ -193,7 +193,7 @@ void FancyToolButton::paintEvent(QPaintEvent *event)
|
|||||||
centerRect.adjust(0, lineHeight + 4, 0, -lineHeight * 2 - 4);
|
centerRect.adjust(0, lineHeight + 4, 0, -lineHeight * 2 - 4);
|
||||||
|
|
||||||
iconRect.moveCenter(centerRect.center());
|
iconRect.moveCenter(centerRect.center());
|
||||||
StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, iconMode);
|
StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, iconMode, QIcon::Off);
|
||||||
painter.setFont(normalFont);
|
painter.setFont(normalFont);
|
||||||
|
|
||||||
QPoint textOffset = centerRect.center()
|
QPoint textOffset = centerRect.center()
|
||||||
@@ -243,7 +243,7 @@ void FancyToolButton::paintEvent(QPaintEvent *event)
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
iconRect.moveCenter(rect().center());
|
iconRect.moveCenter(rect().center());
|
||||||
StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, iconMode);
|
StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, iconMode, QIcon::Off);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pop up arrow next to icon
|
// pop up arrow next to icon
|
||||||
|
@@ -97,7 +97,7 @@ void FancyTabBar::paintEvent(QPaintEvent *event)
|
|||||||
if (!m_tabs.at(i)->visible)
|
if (!m_tabs.at(i)->visible)
|
||||||
continue;
|
continue;
|
||||||
if (i != currentIndex())
|
if (i != currentIndex())
|
||||||
paintTab(&p, i, visibleIndex);
|
paintTab(&p, i, visibleIndex, QIcon::Off);
|
||||||
else
|
else
|
||||||
visibleCurrentIndex = visibleIndex;
|
visibleCurrentIndex = visibleIndex;
|
||||||
++visibleIndex;
|
++visibleIndex;
|
||||||
@@ -105,7 +105,7 @@ void FancyTabBar::paintEvent(QPaintEvent *event)
|
|||||||
|
|
||||||
// paint active tab last, since it overlaps the neighbors
|
// paint active tab last, since it overlaps the neighbors
|
||||||
if (currentIndex() != -1)
|
if (currentIndex() != -1)
|
||||||
paintTab(&p, currentIndex(), visibleCurrentIndex);
|
paintTab(&p, currentIndex(), visibleCurrentIndex, QIcon::On);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle hover events for mouse fade ins
|
// 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,
|
static void paintIcon(QPainter *painter, const QRect &rect,
|
||||||
const QIcon &icon,
|
const QIcon &icon, QIcon::State iconState,
|
||||||
bool enabled, bool selected)
|
bool enabled, bool selected)
|
||||||
{
|
{
|
||||||
painter->save();
|
painter->save();
|
||||||
@@ -306,12 +306,12 @@ static void paintIcon(QPainter *painter, const QRect &rect,
|
|||||||
iconRect = iconRect.intersected(rect);
|
iconRect = iconRect.intersected(rect);
|
||||||
if (!enabled && !creatorTheme()->flag(Theme::FlatToolBars))
|
if (!enabled && !creatorTheme()->flag(Theme::FlatToolBars))
|
||||||
painter->setOpacity(0.7);
|
painter->setOpacity(0.7);
|
||||||
StyleHelper::drawIconWithShadow(icon, iconRect, painter, iconMode);
|
StyleHelper::drawIconWithShadow(icon, iconRect, painter, iconMode, iconState);
|
||||||
painter->restore();
|
painter->restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void paintIconAndText(QPainter *painter, const QRect &rect,
|
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)
|
bool enabled, bool selected)
|
||||||
{
|
{
|
||||||
painter->save();
|
painter->save();
|
||||||
@@ -330,7 +330,7 @@ static void paintIconAndText(QPainter *painter, const QRect &rect,
|
|||||||
iconRect = iconRect.intersected(tabIconRect);
|
iconRect = iconRect.intersected(tabIconRect);
|
||||||
if (!enabled && !creatorTheme()->flag(Theme::FlatToolBars))
|
if (!enabled && !creatorTheme()->flag(Theme::FlatToolBars))
|
||||||
painter->setOpacity(0.7);
|
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?
|
painter->setOpacity(1.0); //FIXME: was 0.7 before?
|
||||||
@@ -353,7 +353,8 @@ static void paintIconAndText(QPainter *painter, const QRect &rect,
|
|||||||
painter->restore();
|
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)) {
|
if (!validIndex(tabIndex)) {
|
||||||
qWarning("invalid index");
|
qWarning("invalid index");
|
||||||
@@ -387,9 +388,9 @@ void FancyTabBar::paintTab(QPainter *painter, int tabIndex, int visibleIndex) co
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_iconsOnly)
|
if (m_iconsOnly)
|
||||||
paintIcon(painter, rect, tab->icon, enabled, selected);
|
paintIcon(painter, rect, tab->icon, iconState, enabled, selected);
|
||||||
else
|
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))
|
if (selected && creatorTheme()->flag(Theme::FlatToolBars))
|
||||||
paintHighlight(painter, rect);
|
paintHighlight(painter, rect);
|
||||||
|
@@ -63,7 +63,7 @@ public:
|
|||||||
bool event(QEvent *event) override;
|
bool event(QEvent *event) override;
|
||||||
|
|
||||||
void paintEvent(QPaintEvent *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 mousePressEvent(QMouseEvent *event) override;
|
||||||
void mouseMoveEvent(QMouseEvent *event) override;
|
void mouseMoveEvent(QMouseEvent *event) override;
|
||||||
void enterEvent(QEnterEvent *event) override;
|
void enterEvent(QEnterEvent *event) override;
|
||||||
|
@@ -1161,6 +1161,8 @@ void ManhattanStyle::drawComplexControl(ComplexControl control, const QStyleOpti
|
|||||||
int fw = pixelMetric(PM_DefaultFrameWidth, option, widget);
|
int fw = pixelMetric(PM_DefaultFrameWidth, option, widget);
|
||||||
label.rect = button.adjusted(fw, fw, -fw, -fw);
|
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);
|
drawControl(CE_ToolButtonLabel, &label, painter, widget);
|
||||||
|
|
||||||
if (toolbutton->subControls & SC_ToolButtonMenu) {
|
if (toolbutton->subControls & SC_ToolButtonMenu) {
|
||||||
|
Reference in New Issue
Block a user