mirror of https://github.com/PCSX2/pcsx2.git
Qt: Fix broken icon styling in Win11 theme
This commit is contained in:
parent
b50e39e5cb
commit
cbc3c4e6eb
|
@ -19,6 +19,7 @@
|
||||||
#include <QtCore/QSortFilterProxyModel>
|
#include <QtCore/QSortFilterProxyModel>
|
||||||
#include <QtGui/QPainter>
|
#include <QtGui/QPainter>
|
||||||
#include <QtGui/QPixmap>
|
#include <QtGui/QPixmap>
|
||||||
|
#include <QtGui/QPixmapCache>
|
||||||
#include <QtGui/QWheelEvent>
|
#include <QtGui/QWheelEvent>
|
||||||
#include <QtWidgets/QApplication>
|
#include <QtWidgets/QApplication>
|
||||||
#include <QtWidgets/QHeaderView>
|
#include <QtWidgets/QHeaderView>
|
||||||
|
@ -113,20 +114,51 @@ namespace
|
||||||
// https://stackoverflow.com/questions/32216568/how-to-set-icon-center-in-qtableview
|
// https://stackoverflow.com/questions/32216568/how-to-set-icon-center-in-qtableview
|
||||||
Q_ASSERT(index.isValid());
|
Q_ASSERT(index.isValid());
|
||||||
|
|
||||||
// draw default item
|
// Draw the base item, with a blank icon
|
||||||
QStyleOptionViewItem opt = option;
|
QStyleOptionViewItem opt = option;
|
||||||
initStyleOption(&opt, index);
|
initStyleOption(&opt, index);
|
||||||
opt.type = QStyleOption::SO_Default;
|
opt.icon = QIcon();
|
||||||
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, 0);
|
// Based on QStyledItemDelegate::paint()
|
||||||
|
const QStyle* style = option.widget ? option.widget->style() : QApplication::style();
|
||||||
|
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, option.widget);
|
||||||
|
|
||||||
|
// Fetch icon pixmap
|
||||||
const QRect r = option.rect;
|
const QRect r = option.rect;
|
||||||
const QPixmap pix = qvariant_cast<QPixmap>(index.data(Qt::DecorationRole));
|
const QPixmap pix = qvariant_cast<QPixmap>(index.data(Qt::DecorationRole));
|
||||||
const int pix_width = static_cast<int>(pix.width() / pix.devicePixelRatio());
|
const int pix_width = static_cast<int>(pix.width() / pix.devicePixelRatio());
|
||||||
const int pix_height = static_cast<int>(pix.width() / pix.devicePixelRatio());
|
const int pix_height = static_cast<int>(pix.height() / pix.devicePixelRatio());
|
||||||
|
|
||||||
// draw pixmap at center of item
|
// Draw the icon, using code derived from QItemDelegate::drawDecoration()
|
||||||
|
const bool enabled = option.state & QStyle::State_Enabled;
|
||||||
const QPoint p = QPoint((r.width() - pix_width) / 2, (r.height() - pix_height) / 2);
|
const QPoint p = QPoint((r.width() - pix_width) / 2, (r.height() - pix_height) / 2);
|
||||||
painter->drawPixmap(r.topLeft() + p, pix);
|
if (option.state & QStyle::State_Selected)
|
||||||
|
{
|
||||||
|
// See QItemDelegate::selectedPixmap()
|
||||||
|
QString key = QString::fromStdString(fmt::format("{:016X}-{:d}", pix.cacheKey(), enabled));
|
||||||
|
QPixmap pm;
|
||||||
|
if (!QPixmapCache::find(key, &pm))
|
||||||
|
{
|
||||||
|
QImage img = pix.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied);
|
||||||
|
|
||||||
|
QColor color = option.palette.color(enabled ? QPalette::Normal : QPalette::Disabled,
|
||||||
|
QPalette::Highlight);
|
||||||
|
color.setAlphaF(0.3f);
|
||||||
|
|
||||||
|
QPainter tinted_painter(&img);
|
||||||
|
tinted_painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
|
||||||
|
tinted_painter.fillRect(0, 0, img.width(), img.height(), color);
|
||||||
|
tinted_painter.end();
|
||||||
|
|
||||||
|
pm = QPixmap(QPixmap::fromImage(img));
|
||||||
|
QPixmapCache::insert(key, pm);
|
||||||
|
}
|
||||||
|
|
||||||
|
painter->drawPixmap(r.topLeft() + p, pm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
painter->drawPixmap(r.topLeft() + p, pix);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
Loading…
Reference in New Issue