X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e348bc58267b3dc06f2fc044f9e5ce5a5dfcd087..600166152d857ccfc9df15b25bd1237b74c71d43:/src/kitemviews/kstandarditemlistwidget.cpp diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index e1f0f9df1..f0394dfda 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -249,22 +249,52 @@ void KStandardItemListWidget::paint(QPainter* painter, const QStyleOptionGraphic const KItemListStyleOption& itemListStyleOption = styleOption(); if (isHovered()) { - // Blend the unhovered and hovered pixmap if the hovering - // animation is ongoing if (hoverOpacity() < 1.0) { - drawPixmap(painter, m_pixmap); - } + /* + * Linear interpolation between m_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 + * https://git.reviewboard.kde.org/r/109614/ + */ + // Paint pixmap1 so that pixmap1 = m_pixmap * (1.0 - hoverOpacity()) + QPixmap pixmap1(m_pixmap.size()); + pixmap1.fill(Qt::transparent); + { + QPainter p(&pixmap1); + p.setOpacity(1.0 - hoverOpacity()); + p.drawPixmap(0, 0, m_pixmap); + } + + // Paint pixmap2 so that pixmap2 = m_hoverPixmap * hoverOpacity() + QPixmap pixmap2(pixmap1.size()); + pixmap2.fill(Qt::transparent); + { + QPainter p(&pixmap2); + p.setOpacity(hoverOpacity()); + p.drawPixmap(0, 0, m_hoverPixmap); + } + + // Paint pixmap2 on pixmap1 using CompositionMode_Plus + // Now pixmap1 = pixmap2 + m_pixmap * (1.0 - hoverOpacity()) + // = m_hoverPixmap * hoverOpacity() + m_pixmap * (1.0 - hoverOpacity()) + { + QPainter p(&pixmap1); + p.setCompositionMode(QPainter::CompositionMode_Plus); + p.drawPixmap(0, 0, pixmap2); + } - const qreal opacity = painter->opacity(); - painter->setOpacity(hoverOpacity() * opacity); - drawPixmap(painter, m_hoverPixmap); - painter->setOpacity(opacity); + // Finally paint pixmap1 on the widget + drawPixmap(painter, pixmap1); + } else { + drawPixmap(painter, m_hoverPixmap); + } } else { drawPixmap(painter, m_pixmap); } painter->setFont(m_customizedFont); - painter->setPen(m_isHidden ? m_additionalInfoTextColor : textColor()); + painter->setPen(textColor()); const TextInfo* textInfo = m_textInfo.value("text"); if (!textInfo) { @@ -493,8 +523,12 @@ void KStandardItemListWidget::setTextColor(const QColor& color) QColor KStandardItemListWidget::textColor() const { - if (m_customTextColor.isValid() && !isSelected()) { - return m_customTextColor; + if (!isSelected()) { + if (m_isHidden) { + return m_additionalInfoTextColor; + } else if (m_customTextColor.isValid()) { + return m_customTextColor; + } } const QPalette::ColorGroup group = isActiveWindow() ? QPalette::Active : QPalette::Inactive; @@ -840,7 +874,7 @@ void KStandardItemListWidget::updatePixmapCache() if (isSelected()) { const QColor color = palette().brush(QPalette::Normal, QPalette::Highlight).color(); QImage image = m_pixmap.toImage(); - KIconEffect::colorize(image, color, 1.0f); + KIconEffect::colorize(image, color, 0.8f); m_pixmap = QPixmap::fromImage(image); } }