X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e4786b4e7ae03e1f67762c38635f08df958e97d4..0464ea82a6850f58805bc4d6fc1df5369d83c3df:/src/kitemviews/kstandarditemlistwidget.cpp diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 7677299e8..566c4dec2 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -345,24 +345,39 @@ void KStandardItemListWidget::paint(QPainter *painter, const QStyleOptionGraphic drawSiblingsInformation(painter); } + auto pixmap = isHovered() ? m_hoverPixmap : m_pixmap; + if (!m_overlays.isEmpty()) { + const qreal dpr = KItemViewsUtils::devicePixelRatio(this); + + const bool iconOnTop = (m_layout == IconsLayout); + const KItemListStyleOption &option = styleOption(); + const qreal padding = option.padding; + + const int widgetIconSize = iconSize(); + const int maxIconWidth = iconOnTop ? size().width() - 2 * padding : widgetIconSize; + const int maxIconHeight = widgetIconSize; + + pixmap = addOverlays(pixmap, m_overlays, QSize(maxIconWidth, maxIconHeight), dpr); + } + const KItemListStyleOption &itemListStyleOption = styleOption(); - if (isHovered() && !m_pixmap.isNull()) { + if (isHovered() && !pixmap.isNull()) { if (hoverOpacity() < 1.0) { /* - * Linear interpolation between m_pixmap and m_hoverPixmap. + * Linear interpolation between pixmap and m_hoverPixmap. * * Note that this cannot be achieved by painting m_hoverPixmap over - * m_pixmap, even if the opacities are adjusted. For details see + * pixmap, even if the opacities are adjusted. For details see * https://git.reviewboard.kde.org/r/109614/ */ - // Paint pixmap1 so that pixmap1 = m_pixmap * (1.0 - hoverOpacity()) - QPixmap pixmap1(m_pixmap.size()); - pixmap1.setDevicePixelRatio(m_pixmap.devicePixelRatio()); + // Paint pixmap1 so that pixmap1 = pixmap * (1.0 - hoverOpacity()) + QPixmap pixmap1(pixmap.size()); + pixmap1.setDevicePixelRatio(pixmap.devicePixelRatio()); pixmap1.fill(Qt::transparent); { QPainter p(&pixmap1); p.setOpacity(1.0 - hoverOpacity()); - p.drawPixmap(0, 0, m_pixmap); + p.drawPixmap(0, 0, pixmap); } // Paint pixmap2 so that pixmap2 = m_hoverPixmap * hoverOpacity() @@ -376,8 +391,8 @@ void KStandardItemListWidget::paint(QPainter *painter, const QStyleOptionGraphic } // Paint pixmap2 on pixmap1 using CompositionMode_Plus - // Now pixmap1 = pixmap2 + m_pixmap * (1.0 - hoverOpacity()) - // = m_hoverPixmap * hoverOpacity() + m_pixmap * (1.0 - hoverOpacity()) + // Now pixmap1 = pixmap2 + pixmap * (1.0 - hoverOpacity()) + // = m_hoverPixmap * hoverOpacity() + pixmap * (1.0 - hoverOpacity()) { QPainter p(&pixmap1); p.setCompositionMode(QPainter::CompositionMode_Plus); @@ -387,10 +402,10 @@ void KStandardItemListWidget::paint(QPainter *painter, const QStyleOptionGraphic // Finally paint pixmap1 on the widget drawPixmap(painter, pixmap1); } else { - drawPixmap(painter, m_hoverPixmap); + drawPixmap(painter, pixmap); } - } else if (!m_pixmap.isNull()) { - drawPixmap(painter, m_pixmap); + } else if (!pixmap.isNull()) { + drawPixmap(painter, pixmap); } painter->setFont(m_customizedFont); @@ -632,7 +647,7 @@ void KStandardItemListWidget::startActivateSoonAnimation(int timeUntilActivation m_activateSoonAnimation->setEndValue(1.0); m_activateSoonAnimation->setDuration(timeUntilActivation); - const QVariant originalIconName{data()["iconName"]}; + const QVariant originalIconName{value("iconName")}; connect(m_activateSoonAnimation, &QVariantAnimation::valueChanged, this, [originalIconName, this](const QVariant &value) { auto progress = value.toFloat(); @@ -667,7 +682,7 @@ void KStandardItemListWidget::startActivateSoonAnimation(int timeUntilActivation bool KStandardItemListWidget::isIconControlledByActivateSoonAnimation() const { - return m_activateSoonAnimation && data()["iconName"] == "folder-open"; + return m_activateSoonAnimation && value("iconName") == "folder-open"; } KItemListWidgetInformant *KStandardItemListWidget::createInformant() @@ -1106,17 +1121,13 @@ void KStandardItemListWidget::updatePixmapCache() // use a generic icon as fallback iconName = QStringLiteral("unknown"); } - const QStringList overlays = values["iconOverlays"].toStringList(); const bool hasFocus = scene()->views()[0]->parentWidget()->hasFocus(); m_pixmap = pixmapForIcon(iconName, - m_overlays, QSize(maxIconWidth, maxIconHeight), m_layout != IconsLayout && isActiveWindow() && isSelected() && hasFocus ? QIcon::Selected : QIcon::Normal); } else { - if (!m_overlays.isEmpty()) { - m_pixmap = addOverlays(m_pixmap, m_overlays, QSize(maxIconWidth, maxIconHeight), dpr); - } else if (m_pixmap.width() / m_pixmap.devicePixelRatio() != maxIconWidth || m_pixmap.height() / m_pixmap.devicePixelRatio() != maxIconHeight) { + if (m_pixmap.width() / m_pixmap.devicePixelRatio() != maxIconWidth || m_pixmap.height() / m_pixmap.devicePixelRatio() != maxIconHeight) { // A custom pixmap has been applied. Assure that the pixmap // is scaled to the maximum available size. KPixmapModifier::scale(m_pixmap, QSize(maxIconWidth, maxIconHeight) * dpr); @@ -1698,7 +1709,7 @@ void KStandardItemListWidget::closeRoleEditor() m_roleEditor = nullptr; } -QPixmap KStandardItemListWidget::pixmapForIcon(const QString &name, const QHash &overlays, const QSize &size, QIcon::Mode mode) const +QPixmap KStandardItemListWidget::pixmapForIcon(const QString &name, const QSize &size, QIcon::Mode mode) const { static const QIcon fallbackIcon = QIcon::fromTheme(QStringLiteral("unknown")); const qreal dpr = KItemViewsUtils::devicePixelRatio(this); @@ -1706,8 +1717,7 @@ QPixmap KStandardItemListWidget::pixmapForIcon(const QString &name, const QHash< int iconHeight = size.height(); QSize iconSize = QSize(iconHeight, iconHeight); - const QString key = "KStandardItemListWidget:" % name % ":" % overlays.values().join(QLatin1Char(':')) % ":" % QString::number(iconHeight) % "@" - % QString::number(dpr) % ":" % QString::number(mode); + const QString key = "KStandardItemListWidget:" % name % ":" % QString::number(iconHeight) % "@" % QString::number(dpr) % ":" % QString::number(mode); QPixmap pixmap; if (!QPixmapCache::find(key, &pixmap)) { @@ -1726,8 +1736,6 @@ QPixmap KStandardItemListWidget::pixmapForIcon(const QString &name, const QHash< KPixmapModifier::scale(pixmap, iconSize * dpr); } - pixmap = addOverlays(pixmap, overlays, size, dpr, mode); - QPixmapCache::insert(key, pixmap); } pixmap.setDevicePixelRatio(dpr);