diff options
| author | Akseli Lahtinen <[email protected]> | 2025-06-20 00:15:31 +0300 |
|---|---|---|
| committer | Akseli Lahtinen <[email protected]> | 2025-06-20 00:15:31 +0300 |
| commit | c1e71289082ec7416ac19c822393ea70f63d1b75 (patch) | |
| tree | 58e43ee607af7c6586235417d1056d7df5e8838b /src/kitemviews/kstandarditemlistwidget.cpp | |
| parent | b1d46a3cbd6dd70a6ec7e31d2d11056a5f5c6d91 (diff) | |
New selection effects
This adds a new selection effect that is similar to what we have in QtQuick file item views.
There are also changes to some usability: Instead of only the icon and text being the clickable area in icon and details mode, the whole selection is now the clickable area.
Otherwise the usability should stay the same, it's mostly a visual change.
See also: https://invent.kde.org/teams/vdg/issues/-/issues/94
Diffstat (limited to 'src/kitemviews/kstandarditemlistwidget.cpp')
| -rw-r--r-- | src/kitemviews/kstandarditemlistwidget.cpp | 108 |
1 files changed, 33 insertions, 75 deletions
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 49d2f26bf..d078b0657 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -271,7 +271,6 @@ KStandardItemListWidget::KStandardItemListWidget(KItemListWidgetInformant *infor , m_scaledPixmapSize() , m_columnWidthSum() , m_iconRect() - , m_hoverPixmap() , m_textRect() , m_sortedVisibleRoles() , m_expansionArea() @@ -346,7 +345,7 @@ void KStandardItemListWidget::paint(QPainter *painter, const QStyleOptionGraphic drawSiblingsInformation(painter); } - auto pixmap = isHovered() ? m_hoverPixmap : m_pixmap; + auto pixmap = m_pixmap; if (!m_overlays.isEmpty()) { const qreal dpr = KItemViewsUtils::devicePixelRatio(this); @@ -388,7 +387,7 @@ void KStandardItemListWidget::paint(QPainter *painter, const QStyleOptionGraphic { QPainter p(&pixmap2); p.setOpacity(hoverOpacity()); - p.drawPixmap(0, 0, m_hoverPixmap); + p.drawPixmap(0, 0, m_pixmap); } // Paint pixmap2 on pixmap1 using CompositionMode_Plus @@ -484,12 +483,6 @@ void KStandardItemListWidget::paint(QPainter *painter, const QStyleOptionGraphic #endif } -QRectF KStandardItemListWidget::iconRect() const -{ - const_cast<KStandardItemListWidget *>(this)->triggerCacheRefreshing(); - return m_iconRect; -} - QRectF KStandardItemListWidget::textRect() const { const_cast<KStandardItemListWidget *>(this)->triggerCacheRefreshing(); @@ -537,35 +530,36 @@ QRectF KStandardItemListWidget::textFocusRect() const return m_textRect; } -QRectF KStandardItemListWidget::selectionRect() const +QRectF KStandardItemListWidget::selectionRectFull() const { const_cast<KStandardItemListWidget *>(this)->triggerCacheRefreshing(); - - switch (m_layout) { - case IconsLayout: - return m_textRect; - - case CompactLayout: - case DetailsLayout: { - const int padding = styleOption().padding; - QRectF adjustedIconRect = iconRect().adjusted(-padding, -padding, padding, padding); - QRectF result = adjustedIconRect | m_textRect; + const int padding = styleOption().padding; + if (m_layout == DetailsLayout) { + auto rect = m_iconRect | m_textRect; if (m_highlightEntireRow) { if (layoutDirection() == Qt::LeftToRight) { - result.setRight(leftPadding() + m_columnWidthSum); + rect.setRight(leftPadding() + m_columnWidthSum); } else { - result.setLeft(size().width() - m_columnWidthSum - rightPadding()); + rect.setLeft(size().width() - m_columnWidthSum - rightPadding()); } } - return result; + return rect.adjusted(-padding, 0, padding, 0); + } else { + if (m_layout == CompactLayout) { + return rect().adjusted(-padding, 0, padding, 0); + } + return rect(); } +} - default: - Q_ASSERT(false); - break; +QRectF KStandardItemListWidget::selectionRectCore() const +{ + // Allow dragging from selection area in details view. + if (m_layout == DetailsLayout && highlightEntireRow() && !isSelected()) { + QRectF result = m_iconRect | m_textRect; + return result; } - - return m_textRect; + return selectionRectFull(); } QRectF KStandardItemListWidget::expansionToggleRect() const @@ -578,7 +572,6 @@ QRectF KStandardItemListWidget::selectionToggleRect() const { const_cast<KStandardItemListWidget *>(this)->triggerCacheRefreshing(); - const QRectF widgetIconRect = iconRect(); const int widgetIconSize = iconSize(); int toggleSize = KIconLoader::SizeSmall; if (widgetIconSize >= KIconLoader::SizeEnormous) { @@ -587,29 +580,11 @@ QRectF KStandardItemListWidget::selectionToggleRect() const toggleSize = KIconLoader::SizeSmallMedium; } - QPointF pos = widgetIconRect.topLeft(); - - // If the selection toggle has a very small distance to the - // widget borders, the size of the selection toggle will get - // increased to prevent an accidental clicking of the item - // when trying to hit the toggle. - const int widgetHeight = size().height(); - const int widgetWidth = size().width(); - const int minMargin = 2; - - if (toggleSize + minMargin * 2 >= widgetHeight) { - pos.rx() -= (widgetHeight - toggleSize) / 2; - toggleSize = widgetHeight; - pos.setY(0); - } - if (toggleSize + minMargin * 2 >= widgetWidth) { - pos.ry() -= (widgetWidth - toggleSize) / 2; - toggleSize = widgetWidth; - pos.setX(0); - } - + const int padding = styleOption().padding; + const QRectF selectionRectMinusPadding = selectionRectFull().adjusted(padding, padding, -padding, -padding); + QPointF pos = selectionRectMinusPadding.topLeft(); if (QApplication::isRightToLeft()) { - pos.setX(widgetIconRect.right() - (pos.x() + toggleSize - widgetIconRect.left())); + pos.setX(selectionRectMinusPadding.right() - (pos.x() + toggleSize - selectionRectMinusPadding.left())); } return QRectF(pos, QSizeF(toggleSize, toggleSize)); @@ -725,7 +700,11 @@ QFont KStandardItemListWidget::customizedFont(const QFont &baseFont) const QPalette::ColorRole KStandardItemListWidget::normalTextColorRole() const { - return QPalette::Text; + if (isPressed()) { + return QPalette::HighlightedText; + } else { + return QPalette::Text; + } } void KStandardItemListWidget::setTextColor(const QColor &color) @@ -748,7 +727,7 @@ QColor KStandardItemListWidget::textColor(const QWidget &widget) const } const QPalette::ColorGroup group = isActiveWindow() && widget.hasFocus() ? QPalette::Active : QPalette::Inactive; - const QPalette::ColorRole role = isSelected() ? QPalette::HighlightedText : normalTextColorRole(); + const QPalette::ColorRole role = normalTextColorRole(); return styleOption().palette.color(group, role); } @@ -1136,7 +1115,6 @@ void KStandardItemListWidget::updatePixmapCache() } if (m_pixmap.isNull()) { - m_hoverPixmap = QPixmap(); return; } @@ -1147,17 +1125,6 @@ void KStandardItemListWidget::updatePixmapCache() if (m_isHidden) { KIconEffect::semiTransparent(m_pixmap); } - - if (m_layout == IconsLayout && isSelected()) { - const QColor color = palette().brush(QPalette::Normal, QPalette::Highlight).color(); - QImage image = m_pixmap.toImage(); - if (image.isNull()) { - m_hoverPixmap = QPixmap(); - return; - } - KIconEffect::colorize(image, color, 0.8f); - m_pixmap = QPixmap::fromImage(image); - } } int scaledIconSize = 0; @@ -1205,15 +1172,6 @@ void KStandardItemListWidget::updatePixmapCache() const QSizeF squareIconSize(widgetIconSize, widgetIconSize); m_iconRect = QRectF(squareIconPos, squareIconSize); } - - // Prepare the pixmap that is used when the item gets hovered - if (isHovered()) { - m_hoverPixmap = m_pixmap; - KIconEffect::toActive(m_hoverPixmap); - } else if (hoverOpacity() <= 0.0) { - // No hover animation is ongoing. Clear m_hoverPixmap to save memory. - m_hoverPixmap = QPixmap(); - } } void KStandardItemListWidget::updateTextsCache() @@ -1571,7 +1529,7 @@ void KStandardItemListWidget::updateAdditionalInfoTextColor() } else if (isSelected() && hasFocus && (m_layout != DetailsLayout || m_highlightEntireRow)) { // The detail text color needs to match the main text (HighlightedText) for the same level // of readability. We short circuit early here to avoid interpolating with another color. - m_additionalInfoTextColor = styleOption().palette.color(QPalette::HighlightedText); + m_additionalInfoTextColor = styleOption().palette.color(normalTextColorRole()); return; } else { c1 = styleOption().palette.text().color(); |
