From 21990d59c176084af615b97a6e586d32aa47fb66 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 11 Apr 2025 17:31:12 +0300 Subject: [PATCH 01/69] WIP: new selection effect stuff based on felix branch https://invent.kde.org/felixernst/dolphin/-/commit/b3fa4479c1c23da08c120e8462bae42c712381d3 --- src/kitemviews/kitemlistwidget.cpp | 49 +++++++++++------ src/kitemviews/kstandarditemlistwidget.cpp | 63 +++++++--------------- 2 files changed, 52 insertions(+), 60 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index baf2445726..a6fd75a347 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -124,23 +124,11 @@ void KItemListWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *o painter->fillRect(backgroundRect, backgroundColor); } - if (m_selected && m_editedRole.isEmpty()) { + if ((m_selected || m_current) && m_editedRole.isEmpty()) { const QStyle::State activeState(isActiveWindow() && widget->hasFocus() ? QStyle::State_Active : 0); drawItemStyleOption(painter, widget, activeState | QStyle::State_Enabled | QStyle::State_Selected | QStyle::State_Item); } - if (m_current && m_editedRole.isEmpty()) { - QStyleOptionFocusRect focusRectOption; - initStyleOption(&focusRectOption); - focusRectOption.rect = textFocusRect().toRect(); - focusRectOption.state = QStyle::State_Enabled | QStyle::State_Item | QStyle::State_KeyboardFocusChange; - if (m_selected && widget->hasFocus()) { - focusRectOption.state |= QStyle::State_Selected; - } - - style()->drawPrimitive(QStyle::PE_FrameFocusRect, &focusRectOption, painter, widget); - } - if (m_hoverOpacity > 0.0) { if (!m_hoverCache) { // Initialize the m_hoverCache pixmap to improve the drawing performance @@ -623,8 +611,39 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; - viewItemOption.rect = selectionRect().toRect(); - style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &viewItemOption, painter, widget); + viewItemOption.rect = selectionRect().toRect().adjusted(2, 2, -2, -2); + QPainterPath path; + path.addRoundedRect(viewItemOption.rect, 5, 5); + QColor accentColor{widget->palette().color(QPalette::Accent)}; + painter->setRenderHint(QPainter::Antialiasing); + bool current = m_current && styleState & QStyle::State_Active; + + // Background item + accentColor.setAlphaF(0.0); + if (m_selected && m_hovered) { + accentColor.setAlphaF(0.5); + } else if (m_selected) { + accentColor.setAlphaF(0.4); + } else if (m_hovered && current) { + accentColor.setAlphaF(0.3); + } else if (m_hovered) { + accentColor.setAlphaF(0.1); + } + painter->fillPath(path, accentColor); + + // Focus decoration + if (current && m_hovered) { + accentColor.setAlphaF(1.0); + } else if (current || m_hovered) { + accentColor.setAlphaF(0.9); + } else if (m_current) { + accentColor.setAlphaF(0.3); + } + if (m_current || m_hovered) { + const QPen pen{accentColor, 2}; + painter->setPen(pen); + painter->drawPath(path); + } } #include "moc_kitemlistwidget.cpp" diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 49d2f26bfd..c320e375b4 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -541,31 +541,23 @@ QRectF KStandardItemListWidget::selectionRect() const { const_cast(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; - if (m_highlightEntireRow) { - if (layoutDirection() == Qt::LeftToRight) { - result.setRight(leftPadding() + m_columnWidthSum); - } else { - result.setLeft(size().width() - m_columnWidthSum - rightPadding()); - } + const int padding = styleOption().padding; + QRectF adjustedIconRect = iconRect().adjusted(-padding, -padding, padding, padding); + QRectF result = adjustedIconRect | m_textRect; + if (m_highlightEntireRow) { + if (layoutDirection() == Qt::LeftToRight) { + result.setRight(leftPadding() + m_columnWidthSum); + } else { + result.setLeft(size().width() - m_columnWidthSum - rightPadding()); } - return result; } - default: - Q_ASSERT(false); - break; + if (m_layout == IconsLayout) { + const int availableWidth = size().width() - 2 * padding - result.width(); + result = result.adjusted(-0.5 * availableWidth, 0, 0.5 * availableWidth, 0); } - return m_textRect; + return result; } QRectF KStandardItemListWidget::expansionToggleRect() const @@ -578,7 +570,6 @@ QRectF KStandardItemListWidget::selectionToggleRect() const { const_cast(this)->triggerCacheRefreshing(); - const QRectF widgetIconRect = iconRect(); const int widgetIconSize = iconSize(); int toggleSize = KIconLoader::SizeSmall; if (widgetIconSize >= KIconLoader::SizeEnormous) { @@ -587,29 +578,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 = selectionRect().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)); @@ -748,7 +721,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 = /*isSelected() ? QPalette::HighlightedText :*/ normalTextColorRole(); return styleOption().palette.color(group, role); } @@ -1568,7 +1541,7 @@ void KStandardItemListWidget::updateAdditionalInfoTextColor() const bool hasFocus = scene()->views()[0]->parentWidget()->hasFocus(); if (m_customTextColor.isValid()) { c1 = m_customTextColor; - } else if (isSelected() && hasFocus && (m_layout != DetailsLayout || m_highlightEntireRow)) { + } else if (false && 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); -- GitLab From 64650add73385948fd76b487a90da2c7635a2b7a Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 14 Apr 2025 14:53:01 +0300 Subject: [PATCH 02/69] Show a gap between selection and focus --- src/kitemviews/kitemlistwidget.cpp | 35 ++++++++++++++++-------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index a6fd75a347..1e82c27b1b 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -607,13 +607,16 @@ void KItemListWidget::clearHoverCache() void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QStyle::State styleState) { QStyleOptionViewItem viewItemOption; + const int focusPenWidth = 2; + const int roundness = 5; initStyleOption(&viewItemOption); viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; - viewItemOption.rect = selectionRect().toRect().adjusted(2, 2, -2, -2); + viewItemOption.rect = selectionRect().toRect(); + viewItemOption.rect = viewItemOption.rect.adjusted(focusPenWidth, focusPenWidth, -focusPenWidth, -focusPenWidth); QPainterPath path; - path.addRoundedRect(viewItemOption.rect, 5, 5); + path.addRoundedRect(viewItemOption.rect, roundness, roundness); QColor accentColor{widget->palette().color(QPalette::Accent)}; painter->setRenderHint(QPainter::Antialiasing); bool current = m_current && styleState & QStyle::State_Active; @@ -621,26 +624,26 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // Background item accentColor.setAlphaF(0.0); if (m_selected && m_hovered) { - accentColor.setAlphaF(0.5); + accentColor.setAlphaF(1.0); } else if (m_selected) { - accentColor.setAlphaF(0.4); - } else if (m_hovered && current) { - accentColor.setAlphaF(0.3); + accentColor.setAlphaF(0.8); } else if (m_hovered) { - accentColor.setAlphaF(0.1); + accentColor.setAlphaF(0.3); + } + if (current) { + auto currentGap = focusPenWidth; + auto currentPathRect = viewItemOption.rect.adjusted(currentGap, currentGap, -currentGap, -currentGap); + QPainterPath currentPath; + currentPath.addRoundedRect(currentPathRect, roundness, roundness); + painter->fillPath(currentPath, accentColor); + } else { + painter->fillPath(path, accentColor); } - painter->fillPath(path, accentColor); // Focus decoration - if (current && m_hovered) { - accentColor.setAlphaF(1.0); - } else if (current || m_hovered) { - accentColor.setAlphaF(0.9); - } else if (m_current) { - accentColor.setAlphaF(0.3); - } if (m_current || m_hovered) { - const QPen pen{accentColor, 2}; + accentColor.setAlphaF(1.0); + const QPen pen{accentColor, focusPenWidth}; painter->setPen(pen); painter->drawPath(path); } -- GitLab From da8cbfdd2d72237e2d2a13c88b5a0fafd558ea24 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 14 Apr 2025 15:20:00 +0300 Subject: [PATCH 03/69] Do not colorize icons --- src/kitemviews/kstandarditemlistwidget.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index c320e375b4..c56c859a71 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -1120,17 +1120,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; -- GitLab From 434aee5f8375f66c41eefc75206a2b2a81849ea9 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 14 Apr 2025 15:58:30 +0300 Subject: [PATCH 04/69] add highlightedTextColor back --- src/kitemviews/kstandarditemlistwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index c56c859a71..486c909de1 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -721,7 +721,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 = isSelected() ? QPalette::HighlightedText : normalTextColorRole(); return styleOption().palette.color(group, role); } -- GitLab From fa6ed958b64cf5fd39d3624a661b5984249fce30 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 14 Apr 2025 16:51:26 +0300 Subject: [PATCH 05/69] Modify padding for iconslayout --- src/kitemviews/kstandarditemlistwidget.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 486c909de1..2d209ba5bb 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -550,11 +550,11 @@ QRectF KStandardItemListWidget::selectionRect() const } else { result.setLeft(size().width() - m_columnWidthSum - rightPadding()); } - } - - if (m_layout == IconsLayout) { - const int availableWidth = size().width() - 2 * padding - result.width(); - result = result.adjusted(-0.5 * availableWidth, 0, 0.5 * availableWidth, 0); + } else { + // Make sure values are always positive + const int availableWidth = qAbs((size().width() - 2 * padding - result.width()) * 0.5); + const int availableHeight = m_layout == CompactLayout ? 0 : qAbs((size().height() - 2 * padding - result.height()) * 0.5); + result = result.adjusted(-availableWidth, -availableHeight, availableWidth, availableHeight); } return result; -- GitLab From 66c8dbf844c81197ec30a90ead4b392b803573ae Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 14 Apr 2025 16:55:17 +0300 Subject: [PATCH 06/69] Use highlight color --- src/kitemviews/kitemlistwidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 1e82c27b1b..8c5b1e6259 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -617,7 +617,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS viewItemOption.rect = viewItemOption.rect.adjusted(focusPenWidth, focusPenWidth, -focusPenWidth, -focusPenWidth); QPainterPath path; path.addRoundedRect(viewItemOption.rect, roundness, roundness); - QColor accentColor{widget->palette().color(QPalette::Accent)}; + QColor accentColor{widget->palette().color(QPalette::Highlight)}; painter->setRenderHint(QPainter::Antialiasing); bool current = m_current && styleState & QStyle::State_Active; @@ -643,7 +643,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // Focus decoration if (m_current || m_hovered) { accentColor.setAlphaF(1.0); - const QPen pen{accentColor, focusPenWidth}; + const QPen pen{accentColor.lighter(120), focusPenWidth}; painter->setPen(pen); painter->drawPath(path); } -- GitLab From 49441c8362b56b04ce0ccf25f6f45070a4ca8477 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 14 Apr 2025 17:00:54 +0300 Subject: [PATCH 07/69] adjust the viewitemoption.rect --- src/kitemviews/kitemlistwidget.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 8c5b1e6259..9444616f58 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -608,20 +608,23 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS { QStyleOptionViewItem viewItemOption; const int focusPenWidth = 2; + // Small adjustment due to how QRect coordinates work + const int viewItemRectAdjustment = focusPenWidth + 1; const int roundness = 5; initStyleOption(&viewItemOption); viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; viewItemOption.rect = selectionRect().toRect(); - viewItemOption.rect = viewItemOption.rect.adjusted(focusPenWidth, focusPenWidth, -focusPenWidth, -focusPenWidth); + viewItemOption.rect = viewItemOption.rect.adjusted(viewItemRectAdjustment, viewItemRectAdjustment, -viewItemRectAdjustment, -viewItemRectAdjustment); QPainterPath path; path.addRoundedRect(viewItemOption.rect, roundness, roundness); QColor accentColor{widget->palette().color(QPalette::Highlight)}; painter->setRenderHint(QPainter::Antialiasing); bool current = m_current && styleState & QStyle::State_Active; - // Background item + // Background item, alpha values are from + // https://invent.kde.org/plasma/libplasma/-/blob/master/src/desktoptheme/breeze/widgets/viewitem.svg accentColor.setAlphaF(0.0); if (m_selected && m_hovered) { accentColor.setAlphaF(1.0); @@ -641,7 +644,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS } // Focus decoration - if (m_current || m_hovered) { + if (current || m_hovered) { accentColor.setAlphaF(1.0); const QPen pen{accentColor.lighter(120), focusPenWidth}; painter->setPen(pen); -- GitLab From 35ffad2d67c6dca2bab0d979b8017a5da377ae05 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 15 Apr 2025 15:03:01 +0300 Subject: [PATCH 08/69] Make hovered outline transparent --- src/kitemviews/kitemlistwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 9444616f58..ddf9a4ea1a 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -645,7 +645,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // Focus decoration if (current || m_hovered) { - accentColor.setAlphaF(1.0); + accentColor.setAlphaF(m_hovered ? 0.4 : 1.0); const QPen pen{accentColor.lighter(120), focusPenWidth}; painter->setPen(pen); painter->drawPath(path); -- GitLab From 528f25f0c412073a3ae643fb5f9f8d163cc83d21 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 15 Apr 2025 15:10:27 +0300 Subject: [PATCH 09/69] Only apply hover effect to icon when its selected Better contrast this way --- src/kitemviews/kstandarditemlistwidget.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 2d209ba5bb..b9bbb68b8a 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -1171,7 +1171,9 @@ void KStandardItemListWidget::updatePixmapCache() // Prepare the pixmap that is used when the item gets hovered if (isHovered()) { m_hoverPixmap = m_pixmap; - KIconEffect::toActive(m_hoverPixmap); + if (isSelected()) { + KIconEffect::toActive(m_hoverPixmap); + } } else if (hoverOpacity() <= 0.0) { // No hover animation is ongoing. Clear m_hoverPixmap to save memory. m_hoverPixmap = QPixmap(); -- GitLab From edf7272c9c8245f7297d2bd9738996433fd8bb82 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 15 Apr 2025 16:53:09 +0300 Subject: [PATCH 10/69] Use style 2 --- src/kitemviews/kitemlistwidget.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index ddf9a4ea1a..14795af9fa 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -629,23 +629,16 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS if (m_selected && m_hovered) { accentColor.setAlphaF(1.0); } else if (m_selected) { - accentColor.setAlphaF(0.8); + accentColor.setAlphaF(0.5); } else if (m_hovered) { accentColor.setAlphaF(0.3); } - if (current) { - auto currentGap = focusPenWidth; - auto currentPathRect = viewItemOption.rect.adjusted(currentGap, currentGap, -currentGap, -currentGap); - QPainterPath currentPath; - currentPath.addRoundedRect(currentPathRect, roundness, roundness); - painter->fillPath(currentPath, accentColor); - } else { - painter->fillPath(path, accentColor); - } + + painter->fillPath(path, accentColor); // Focus decoration - if (current || m_hovered) { - accentColor.setAlphaF(m_hovered ? 0.4 : 1.0); + if (current) { + accentColor.setAlphaF(1.0); const QPen pen{accentColor.lighter(120), focusPenWidth}; painter->setPen(pen); painter->drawPath(path); -- GitLab From 9933d7c49a1d0bcf956afe69b347df18fb2f1c70 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 15 Apr 2025 17:04:08 +0300 Subject: [PATCH 11/69] Set pen color according to base lightness --- src/kitemviews/kitemlistwidget.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 14795af9fa..64584abce2 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -629,7 +629,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS if (m_selected && m_hovered) { accentColor.setAlphaF(1.0); } else if (m_selected) { - accentColor.setAlphaF(0.5); + accentColor.setAlphaF(0.8); } else if (m_hovered) { accentColor.setAlphaF(0.3); } @@ -639,7 +639,8 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // Focus decoration if (current) { accentColor.setAlphaF(1.0); - const QPen pen{accentColor.lighter(120), focusPenWidth}; + // Set the pen color lighter or darker depending on background color + const QPen pen{m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker() : accentColor.lighter(), focusPenWidth}; painter->setPen(pen); painter->drawPath(path); } -- GitLab From 0ddc8b6f93bda0afc525e57576ef00ab0ad94697 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 15 Apr 2025 17:21:11 +0300 Subject: [PATCH 12/69] Dont show focus before interaction --- src/kitemviews/kitemlistcontroller.cpp | 4 ++++ src/kitemviews/kitemlistselectionmanager.cpp | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index cd60c3a41b..f0c6a26878 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -478,6 +478,10 @@ bool KItemListController::keyPressEvent(QKeyEvent *event) return false; } + if (index < 0) { + index = 0; + } + if (m_selectionManager->currentItem() != index) { switch (m_selectionBehavior) { case NoSelection: diff --git a/src/kitemviews/kitemlistselectionmanager.cpp b/src/kitemviews/kitemlistselectionmanager.cpp index 6f7f0e0776..abf58df240 100644 --- a/src/kitemviews/kitemlistselectionmanager.cpp +++ b/src/kitemviews/kitemlistselectionmanager.cpp @@ -217,9 +217,7 @@ void KItemListSelectionManager::itemsInserted(const KItemRangeList &itemRanges) const KItemSet previousSelection = selectedItems(); // Update the current item - if (m_currentItem < 0) { - setCurrentItem(0); - } else { + if (m_currentItem >= 0) { const int previousCurrent = m_currentItem; int inc = 0; for (const KItemRange &itemRange : itemRanges) { -- GitLab From 8588d3aa3bb73e7c6f35df8844de0b9ccc335078 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 16 Apr 2025 15:23:08 +0300 Subject: [PATCH 13/69] Less intense selection lightening/darkening --- src/kitemviews/kitemlistwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 64584abce2..ebbfb98cc6 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -640,7 +640,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS if (current) { accentColor.setAlphaF(1.0); // Set the pen color lighter or darker depending on background color - const QPen pen{m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker() : accentColor.lighter(), focusPenWidth}; + const QPen pen{m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker(110) : accentColor.lighter(110), focusPenWidth}; painter->setPen(pen); painter->drawPath(path); } -- GitLab From cbec8b9acd0aa13ddb984097e9c9ea37baba6a33 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 16 Apr 2025 15:23:43 +0300 Subject: [PATCH 14/69] Clean up currentItem when clicking on empty area --- src/kitemviews/kitemlistcontroller.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index f0c6a26878..4f5c8fbb39 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1720,6 +1720,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (!m_pressedIndex.has_value()) { // We have a right-click in an empty region, don't create rubber band. + m_selectionManager->setCurrentItem(-1); return true; } } @@ -1783,6 +1784,8 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier } return !createRubberBand; + } else { + m_selectionManager->setCurrentItem(-1); } return false; -- GitLab From cfe048eabb2e29c8e01f9a0428548f8366078b73 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 16 Apr 2025 15:52:33 +0300 Subject: [PATCH 15/69] Clean up the current item after mouse drag if it selects nothing --- src/kitemviews/kitemlistcontroller.cpp | 16 ++++++++++++++-- src/kitemviews/kitemlistcontroller.h | 5 +++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 4f5c8fbb39..e8edc33c03 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1720,7 +1720,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (!m_pressedIndex.has_value()) { // We have a right-click in an empty region, don't create rubber band. - m_selectionManager->setCurrentItem(-1); + cleanUpCurrentItem(); return true; } } @@ -1785,7 +1785,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier return !createRubberBand; } else { - m_selectionManager->setCurrentItem(-1); + cleanUpCurrentItem(); } return false; @@ -1881,6 +1881,8 @@ bool KItemListController::onRelease(const QPointF &pos, const Qt::KeyboardModifi m_pressedMouseGlobalPos = QPointF(); m_pressedIndex = std::nullopt; m_clearSelectionIfItemsAreNotDragged = false; + // Clean up current item if nothing is selected after release from drag operation + cleanUpCurrentItem(); return false; } @@ -1913,4 +1915,14 @@ void KItemListController::slotStateChanged(QScroller::State newState) } } +void KItemListController::cleanUpCurrentItem() +{ + if (m_selectionManager->currentItem() != -1 && m_selectionManager->selectedItems().count() == 0) { + if (m_selectionManager->isAnchoredSelectionActive()) { + m_selectionManager->endAnchoredSelection(); + } + m_selectionManager->setCurrentItem(-1); + } +} + #include "moc_kitemlistcontroller.cpp" diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index 48da07206d..7fcda72795 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -325,6 +325,11 @@ private: bool onPress(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons); bool onRelease(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons, bool touch); void startRubberBand(); + /** + * Ends the anchoredSelection and sets the currentItem in selectionManager to -1. + * This is used to not draw the focus item when using mouse to operate the view. + */ + void cleanUpCurrentItem(); private: bool m_singleClickActivationEnforced; -- GitLab From d833acb8a5af26fef199e9dd6c1e26416947a0b9 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 16 Apr 2025 16:10:42 +0300 Subject: [PATCH 16/69] Fix text colors --- src/kitemviews/kitemlistwidget.cpp | 6 +++--- src/kitemviews/kstandarditemlistwidget.cpp | 10 ++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index ebbfb98cc6..0f85b726a8 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -619,7 +619,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS viewItemOption.rect = viewItemOption.rect.adjusted(viewItemRectAdjustment, viewItemRectAdjustment, -viewItemRectAdjustment, -viewItemRectAdjustment); QPainterPath path; path.addRoundedRect(viewItemOption.rect, roundness, roundness); - QColor accentColor{widget->palette().color(QPalette::Highlight)}; + QColor accentColor{widget->palette().color(QPalette::Accent)}; painter->setRenderHint(QPainter::Antialiasing); bool current = m_current && styleState & QStyle::State_Active; @@ -627,9 +627,9 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // https://invent.kde.org/plasma/libplasma/-/blob/master/src/desktoptheme/breeze/widgets/viewitem.svg accentColor.setAlphaF(0.0); if (m_selected && m_hovered) { - accentColor.setAlphaF(1.0); + accentColor.setAlphaF(0.5); } else if (m_selected) { - accentColor.setAlphaF(0.8); + accentColor.setAlphaF(0.4); } else if (m_hovered) { accentColor.setAlphaF(0.3); } diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index b9bbb68b8a..b60aeb19ba 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -721,7 +721,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); } @@ -1171,9 +1171,7 @@ void KStandardItemListWidget::updatePixmapCache() // Prepare the pixmap that is used when the item gets hovered if (isHovered()) { m_hoverPixmap = m_pixmap; - if (isSelected()) { - KIconEffect::toActive(m_hoverPixmap); - } + KIconEffect::toActive(m_hoverPixmap); } else if (hoverOpacity() <= 0.0) { // No hover animation is ongoing. Clear m_hoverPixmap to save memory. m_hoverPixmap = QPixmap(); @@ -1532,10 +1530,10 @@ void KStandardItemListWidget::updateAdditionalInfoTextColor() const bool hasFocus = scene()->views()[0]->parentWidget()->hasFocus(); if (m_customTextColor.isValid()) { c1 = m_customTextColor; - } else if (false && isSelected() && hasFocus && (m_layout != DetailsLayout || m_highlightEntireRow)) { + } 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(); -- GitLab From ec725291eac833b8982cda4b1592d54239626b4f Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 16 Apr 2025 16:32:35 +0300 Subject: [PATCH 17/69] Add bit more padding around the text to take outline in account --- src/kitemviews/kstandarditemlistwidget.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index b60aeb19ba..8e2515c686 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -1171,7 +1171,9 @@ void KStandardItemListWidget::updatePixmapCache() // Prepare the pixmap that is used when the item gets hovered if (isHovered()) { m_hoverPixmap = m_pixmap; - KIconEffect::toActive(m_hoverPixmap); + if (isSelected()) { + KIconEffect::toActive(m_hoverPixmap); + } } else if (hoverOpacity() <= 0.0) { // No hover animation is ongoing. Clear m_hoverPixmap to save memory. m_hoverPixmap = QPixmap(); @@ -1300,7 +1302,8 @@ void KStandardItemListWidget::updateIconsLayoutTextCache() const KItemListStyleOption &option = styleOption(); const qreal padding = option.padding; - const qreal maxWidth = size().width() - 2 * padding; + // adjust the max width according to new outline style + const qreal maxWidth = size().width() - 2 * padding - 10; const qreal lineSpacing = m_customizedFontMetrics.lineSpacing(); // Initialize properties for the "text" role. It will be used as anchor -- GitLab From 230a6221183594954086187553016d577d738a38 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 16 Apr 2025 16:36:26 +0300 Subject: [PATCH 18/69] revert padding --- src/kitemviews/kstandarditemlistwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 8e2515c686..0303547b23 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -1303,7 +1303,7 @@ void KStandardItemListWidget::updateIconsLayoutTextCache() const KItemListStyleOption &option = styleOption(); const qreal padding = option.padding; // adjust the max width according to new outline style - const qreal maxWidth = size().width() - 2 * padding - 10; + const qreal maxWidth = size().width() - 2 * padding; const qreal lineSpacing = m_customizedFontMetrics.lineSpacing(); // Initialize properties for the "text" role. It will be used as anchor -- GitLab From 462e3846d8f077f739d7551a0930df53d9c7069e Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 17 Apr 2025 11:41:33 +0300 Subject: [PATCH 19/69] Use rect instead of selectionRect for the selection painting Selectionrect is for mouse selection things --- src/kitemviews/kitemlistwidget.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 0f85b726a8..92041fc1e7 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -608,15 +608,12 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS { QStyleOptionViewItem viewItemOption; const int focusPenWidth = 2; - // Small adjustment due to how QRect coordinates work - const int viewItemRectAdjustment = focusPenWidth + 1; const int roundness = 5; initStyleOption(&viewItemOption); viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; - viewItemOption.rect = selectionRect().toRect(); - viewItemOption.rect = viewItemOption.rect.adjusted(viewItemRectAdjustment, viewItemRectAdjustment, -viewItemRectAdjustment, -viewItemRectAdjustment); + viewItemOption.rect = rect().toRect(); QPainterPath path; path.addRoundedRect(viewItemOption.rect, roundness, roundness); QColor accentColor{widget->palette().color(QPalette::Accent)}; -- GitLab From 06dbf47020e8a3bc33f8ae87a451a8418efc3306 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 17 Apr 2025 11:53:15 +0300 Subject: [PATCH 20/69] Revert currentItem changes --- src/kitemviews/kitemlistcontroller.cpp | 19 ------------------- src/kitemviews/kitemlistcontroller.h | 5 ----- src/kitemviews/kitemlistselectionmanager.cpp | 4 +++- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index e8edc33c03..cd60c3a41b 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -478,10 +478,6 @@ bool KItemListController::keyPressEvent(QKeyEvent *event) return false; } - if (index < 0) { - index = 0; - } - if (m_selectionManager->currentItem() != index) { switch (m_selectionBehavior) { case NoSelection: @@ -1720,7 +1716,6 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (!m_pressedIndex.has_value()) { // We have a right-click in an empty region, don't create rubber band. - cleanUpCurrentItem(); return true; } } @@ -1784,8 +1779,6 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier } return !createRubberBand; - } else { - cleanUpCurrentItem(); } return false; @@ -1881,8 +1874,6 @@ bool KItemListController::onRelease(const QPointF &pos, const Qt::KeyboardModifi m_pressedMouseGlobalPos = QPointF(); m_pressedIndex = std::nullopt; m_clearSelectionIfItemsAreNotDragged = false; - // Clean up current item if nothing is selected after release from drag operation - cleanUpCurrentItem(); return false; } @@ -1915,14 +1906,4 @@ void KItemListController::slotStateChanged(QScroller::State newState) } } -void KItemListController::cleanUpCurrentItem() -{ - if (m_selectionManager->currentItem() != -1 && m_selectionManager->selectedItems().count() == 0) { - if (m_selectionManager->isAnchoredSelectionActive()) { - m_selectionManager->endAnchoredSelection(); - } - m_selectionManager->setCurrentItem(-1); - } -} - #include "moc_kitemlistcontroller.cpp" diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index 7fcda72795..48da07206d 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -325,11 +325,6 @@ private: bool onPress(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons); bool onRelease(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons, bool touch); void startRubberBand(); - /** - * Ends the anchoredSelection and sets the currentItem in selectionManager to -1. - * This is used to not draw the focus item when using mouse to operate the view. - */ - void cleanUpCurrentItem(); private: bool m_singleClickActivationEnforced; diff --git a/src/kitemviews/kitemlistselectionmanager.cpp b/src/kitemviews/kitemlistselectionmanager.cpp index abf58df240..6f7f0e0776 100644 --- a/src/kitemviews/kitemlistselectionmanager.cpp +++ b/src/kitemviews/kitemlistselectionmanager.cpp @@ -217,7 +217,9 @@ void KItemListSelectionManager::itemsInserted(const KItemRangeList &itemRanges) const KItemSet previousSelection = selectedItems(); // Update the current item - if (m_currentItem >= 0) { + if (m_currentItem < 0) { + setCurrentItem(0); + } else { const int previousCurrent = m_currentItem; int inc = 0; for (const KItemRange &itemRange : itemRanges) { -- GitLab From 71ed6a4a0745770410056ad234ee8d7104c10767 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 17 Apr 2025 12:20:14 +0300 Subject: [PATCH 21/69] Make the focus effect hiding/showing visual only --- src/kitemviews/kitemlistcontroller.cpp | 14 ++++++++++++++ src/kitemviews/kitemlistcontroller.h | 1 + src/kitemviews/kitemlistview.cpp | 3 +++ src/kitemviews/kitemlistwidget.cpp | 8 +++++++- src/kitemviews/kitemlistwidget.h | 3 +++ 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index cd60c3a41b..de8bd26254 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1731,6 +1731,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (rightClick && hitTargetIsRowEmptyRegion) { // We have a right click outside the icon and text rect but within the hover highlight area. // We don't want items to get selected through this, so we return now. + showFocusWidget(false); return true; } @@ -1779,6 +1780,8 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier } return !createRubberBand; + } else { + showFocusWidget(false); } return false; @@ -1906,4 +1909,15 @@ void KItemListController::slotStateChanged(QScroller::State newState) } } +void KItemListController::showFocusWidget(bool show) +{ + const auto widgets = m_view->visibleItemListWidgets(); + for (auto widget : widgets) { + if (widget->isCurrent()) { + widget->showFocusEffect(show); + return; + } + } +} + #include "moc_kitemlistcontroller.cpp" diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index 48da07206d..d071f20ab0 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -325,6 +325,7 @@ private: bool onPress(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons); bool onRelease(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons, bool touch); void startRubberBand(); + void showFocusWidget(bool show); private: bool m_singleClickActivationEnforced; diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 265e41e6ca..4db8d4ed0a 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -1529,6 +1529,8 @@ void KItemListView::slotCurrentChanged(int current, int previous) KItemListWidget *currentWidget = m_visibleItems.value(current, nullptr); if (currentWidget) { + // If previous item was -1, we're setting the first item current, so we can hide focus + currentWidget->showFocusEffect(previous >= 0 ? true : false); currentWidget->setCurrent(true); } } @@ -1548,6 +1550,7 @@ void KItemListView::slotSelectionChanged(const KItemSet ¤t, const KItemSet KItemListWidget *widget = it.value(); const bool isSelected(current.contains(index)); widget->setSelected(isSelected); + widget->showFocusEffect(true); #ifndef QT_NO_ACCESSIBILITY if (!QAccessible::isActive()) { diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 92041fc1e7..e41f8a1557 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -37,6 +37,7 @@ KItemListWidget::KItemListWidget(KItemListWidgetInformant *informant, QGraphicsI , m_expansionAreaHovered(false) , m_alternateBackground(false) , m_enabledSelectionToggle(false) + , m_showFocusEffect(true) , m_data() , m_visibleRoles() , m_columnWidths() @@ -634,7 +635,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS painter->fillPath(path, accentColor); // Focus decoration - if (current) { + if (current && m_showFocusEffect) { accentColor.setAlphaF(1.0); // Set the pen color lighter or darker depending on background color const QPen pen{m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker(110) : accentColor.lighter(110), focusPenWidth}; @@ -643,4 +644,9 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS } } +void KItemListWidget::showFocusEffect(bool show) +{ + m_showFocusEffect = show; +} + #include "moc_kitemlistwidget.cpp" diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 0e07d7ab55..06ed511155 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -194,6 +194,8 @@ public: */ virtual void startActivateSoonAnimation(int timeUntilActivation); + void showFocusEffect(bool showFocusEffect); + Q_SIGNALS: void roleEditingCanceled(int index, const QByteArray &role, const QVariant &value); void roleEditingFinished(int index, const QByteArray &role, const QVariant &value); @@ -258,6 +260,7 @@ private: bool m_expansionAreaHovered; bool m_alternateBackground; bool m_enabledSelectionToggle; + bool m_showFocusEffect; QHash m_data; QList m_visibleRoles; QHash m_columnWidths; -- GitLab From e89ce5966ac02f7349922b4a0794d433f705d1dd Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 17 Apr 2025 14:46:51 +0300 Subject: [PATCH 22/69] Start drag from background area Now that we have full size selection item, starting drag when mouse is in there makes sense. Signed-off-by: Akseli Lahtinen --- src/kitemviews/kitemlistcontroller.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index de8bd26254..3757fae1f2 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1721,19 +1721,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier } if (m_pressedIndex.has_value()) { - // The hover highlight area of an item is being pressed. - const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); // anything outside of row.contains() will be the empty region of the row rect - const bool hitTargetIsRowEmptyRegion = !row->contains(row->mapFromItem(m_view, pos)); - // again, when this method returns false, a rubberBand selection is created as the event is not consumed; - // createRubberBand here tells us whether to return true or false. - bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); - - if (rightClick && hitTargetIsRowEmptyRegion) { - // We have a right click outside the icon and text rect but within the hover highlight area. - // We don't want items to get selected through this, so we return now. - showFocusWidget(false); - return true; - } + bool createRubberBand = false; m_selectionManager->setCurrentItem(m_pressedIndex.value()); -- GitLab From d92820622459bf1c15f24cc76747680e7e15fbf0 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 17 Apr 2025 15:39:58 +0300 Subject: [PATCH 23/69] Show focus effects always on keypress --- src/kitemviews/kitemlistcontroller.cpp | 6 ++---- src/kitemviews/kitemlistwidget.cpp | 5 ++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 3757fae1f2..190402c705 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -238,6 +238,7 @@ bool KItemListController::isSearchAsYouTypeActive() const bool KItemListController::keyPressEvent(QKeyEvent *event) { int index = m_selectionManager->currentItem(); + showFocusWidget(true); int key = event->key(); const bool shiftPressed = event->modifiers() & Qt::ShiftModifier; @@ -1901,10 +1902,7 @@ void KItemListController::showFocusWidget(bool show) { const auto widgets = m_view->visibleItemListWidgets(); for (auto widget : widgets) { - if (widget->isCurrent()) { - widget->showFocusEffect(show); - return; - } + widget->showFocusEffect(show); } } diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index e41f8a1557..174e2feb6a 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -646,7 +646,10 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS void KItemListWidget::showFocusEffect(bool show) { - m_showFocusEffect = show; + if (m_showFocusEffect != show) { + m_showFocusEffect = show; + update(); + } } #include "moc_kitemlistwidget.cpp" -- GitLab From 39063dd2c47d79a1adadbeefd9c612c03fe8b24c Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 17 Apr 2025 16:20:12 +0300 Subject: [PATCH 24/69] Rename methods, add method for checking if focus is shown for widget --- src/kitemviews/kitemlistcontroller.cpp | 8 ++++---- src/kitemviews/kitemlistcontroller.h | 2 +- src/kitemviews/kitemlistview.cpp | 3 --- src/kitemviews/kitemlistwidget.cpp | 15 ++++++++++----- src/kitemviews/kitemlistwidget.h | 5 +++-- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 190402c705..f30453e9cb 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -238,7 +238,7 @@ bool KItemListController::isSearchAsYouTypeActive() const bool KItemListController::keyPressEvent(QKeyEvent *event) { int index = m_selectionManager->currentItem(); - showFocusWidget(true); + showKeyboardFocusEffect(true); int key = event->key(); const bool shiftPressed = event->modifiers() & Qt::ShiftModifier; @@ -1770,7 +1770,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier return !createRubberBand; } else { - showFocusWidget(false); + showKeyboardFocusEffect(false); } return false; @@ -1898,11 +1898,11 @@ void KItemListController::slotStateChanged(QScroller::State newState) } } -void KItemListController::showFocusWidget(bool show) +void KItemListController::showKeyboardFocusEffect(bool show) { const auto widgets = m_view->visibleItemListWidgets(); for (auto widget : widgets) { - widget->showFocusEffect(show); + widget->showKeyboardFocusEffect(show); } } diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index d071f20ab0..d424f92dd0 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -325,7 +325,7 @@ private: bool onPress(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons); bool onRelease(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons, bool touch); void startRubberBand(); - void showFocusWidget(bool show); + void showKeyboardFocusEffect(bool show); private: bool m_singleClickActivationEnforced; diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 4db8d4ed0a..265e41e6ca 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -1529,8 +1529,6 @@ void KItemListView::slotCurrentChanged(int current, int previous) KItemListWidget *currentWidget = m_visibleItems.value(current, nullptr); if (currentWidget) { - // If previous item was -1, we're setting the first item current, so we can hide focus - currentWidget->showFocusEffect(previous >= 0 ? true : false); currentWidget->setCurrent(true); } } @@ -1550,7 +1548,6 @@ void KItemListView::slotSelectionChanged(const KItemSet ¤t, const KItemSet KItemListWidget *widget = it.value(); const bool isSelected(current.contains(index)); widget->setSelected(isSelected); - widget->showFocusEffect(true); #ifndef QT_NO_ACCESSIBILITY if (!QAccessible::isActive()) { diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 174e2feb6a..6d1f40a444 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -37,7 +37,7 @@ KItemListWidget::KItemListWidget(KItemListWidgetInformant *informant, QGraphicsI , m_expansionAreaHovered(false) , m_alternateBackground(false) , m_enabledSelectionToggle(false) - , m_showFocusEffect(true) + , m_showKeyboardFocusEffect(false) , m_data() , m_visibleRoles() , m_columnWidths() @@ -635,7 +635,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS painter->fillPath(path, accentColor); // Focus decoration - if (current && m_showFocusEffect) { + if (current && m_showKeyboardFocusEffect) { accentColor.setAlphaF(1.0); // Set the pen color lighter or darker depending on background color const QPen pen{m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker(110) : accentColor.lighter(110), focusPenWidth}; @@ -644,12 +644,17 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS } } -void KItemListWidget::showFocusEffect(bool show) +void KItemListWidget::showKeyboardFocusEffect(bool show) { - if (m_showFocusEffect != show) { - m_showFocusEffect = show; + if (m_showKeyboardFocusEffect != show) { + m_showKeyboardFocusEffect = show; update(); } } +bool KItemListWidget::keyboardFocusEffectShown() +{ + return m_showKeyboardFocusEffect; +} + #include "moc_kitemlistwidget.cpp" diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 06ed511155..21e2af4ba1 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -194,7 +194,8 @@ public: */ virtual void startActivateSoonAnimation(int timeUntilActivation); - void showFocusEffect(bool showFocusEffect); + void showKeyboardFocusEffect(bool showFocusEffect); + bool keyboardFocusEffectShown(); Q_SIGNALS: void roleEditingCanceled(int index, const QByteArray &role, const QVariant &value); @@ -260,7 +261,7 @@ private: bool m_expansionAreaHovered; bool m_alternateBackground; bool m_enabledSelectionToggle; - bool m_showFocusEffect; + bool m_showKeyboardFocusEffect; QHash m_data; QList m_visibleRoles; QHash m_columnWidths; -- GitLab From 80eaae9049df5806380de6a68f957dc503d8b06a Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 17 Apr 2025 16:50:45 +0300 Subject: [PATCH 25/69] Show focus when selection mode is toggled or navigation keys pressed --- src/kitemviews/kitemlistcontroller.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index f30453e9cb..466bf401ed 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -222,6 +222,9 @@ bool KItemListController::singleClickActivationEnforced() const void KItemListController::setSelectionModeEnabled(bool enabled) { + if (enabled) { + showKeyboardFocusEffect(true); + } m_selectionMode = enabled; } @@ -238,7 +241,6 @@ bool KItemListController::isSearchAsYouTypeActive() const bool KItemListController::keyPressEvent(QKeyEvent *event) { int index = m_selectionManager->currentItem(); - showKeyboardFocusEffect(true); int key = event->key(); const bool shiftPressed = event->modifiers() & Qt::ShiftModifier; @@ -291,6 +293,10 @@ bool KItemListController::keyPressEvent(QKeyEvent *event) const bool navigationPressed = key == Qt::Key_Home || key == Qt::Key_End || key == Qt::Key_PageUp || key == Qt::Key_PageDown || key == Qt::Key_Up || key == Qt::Key_Down || key == Qt::Key_Left || key == Qt::Key_Right; + if (navigationPressed) { + showKeyboardFocusEffect(true); + } + const int itemCount = m_model->count(); // For horizontal scroll orientation, transform -- GitLab From 0faf1eeabd4f6be73b622b13058c0b56a473be61 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 22 Apr 2025 16:23:18 +0300 Subject: [PATCH 26/69] Always show focus, make focus when unselected more transparent, remove showKeyboardFocusEffect --- src/kitemviews/kitemlistcontroller.cpp | 17 ----------------- src/kitemviews/kitemlistcontroller.h | 1 - src/kitemviews/kitemlistwidget.cpp | 23 +++++------------------ src/kitemviews/kitemlistwidget.h | 4 ---- 4 files changed, 5 insertions(+), 40 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 466bf401ed..cd19cd7f69 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -222,9 +222,6 @@ bool KItemListController::singleClickActivationEnforced() const void KItemListController::setSelectionModeEnabled(bool enabled) { - if (enabled) { - showKeyboardFocusEffect(true); - } m_selectionMode = enabled; } @@ -293,10 +290,6 @@ bool KItemListController::keyPressEvent(QKeyEvent *event) const bool navigationPressed = key == Qt::Key_Home || key == Qt::Key_End || key == Qt::Key_PageUp || key == Qt::Key_PageDown || key == Qt::Key_Up || key == Qt::Key_Down || key == Qt::Key_Left || key == Qt::Key_Right; - if (navigationPressed) { - showKeyboardFocusEffect(true); - } - const int itemCount = m_model->count(); // For horizontal scroll orientation, transform @@ -1775,8 +1768,6 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier } return !createRubberBand; - } else { - showKeyboardFocusEffect(false); } return false; @@ -1904,12 +1895,4 @@ void KItemListController::slotStateChanged(QScroller::State newState) } } -void KItemListController::showKeyboardFocusEffect(bool show) -{ - const auto widgets = m_view->visibleItemListWidgets(); - for (auto widget : widgets) { - widget->showKeyboardFocusEffect(show); - } -} - #include "moc_kitemlistcontroller.cpp" diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index d424f92dd0..48da07206d 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -325,7 +325,6 @@ private: bool onPress(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons); bool onRelease(const QPointF &pos, const Qt::KeyboardModifiers modifiers, const Qt::MouseButtons buttons, bool touch); void startRubberBand(); - void showKeyboardFocusEffect(bool show); private: bool m_singleClickActivationEnforced; diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 6d1f40a444..a67759d087 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -37,7 +37,6 @@ KItemListWidget::KItemListWidget(KItemListWidgetInformant *informant, QGraphicsI , m_expansionAreaHovered(false) , m_alternateBackground(false) , m_enabledSelectionToggle(false) - , m_showKeyboardFocusEffect(false) , m_data() , m_visibleRoles() , m_columnWidths() @@ -608,7 +607,6 @@ void KItemListWidget::clearHoverCache() void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QStyle::State styleState) { QStyleOptionViewItem viewItemOption; - const int focusPenWidth = 2; const int roundness = 5; initStyleOption(&viewItemOption); viewItemOption.state = styleState; @@ -635,26 +633,15 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS painter->fillPath(path, accentColor); // Focus decoration - if (current && m_showKeyboardFocusEffect) { - accentColor.setAlphaF(1.0); + if (current) { + accentColor = m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker(110) : accentColor.lighter(110); + accentColor.setAlphaF(m_selected || m_hovered ? 1.0 : 0.5); // Set the pen color lighter or darker depending on background color - const QPen pen{m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker(110) : accentColor.lighter(110), focusPenWidth}; + QPen pen{accentColor, 1.5}; + pen.setCosmetic(true); painter->setPen(pen); painter->drawPath(path); } } -void KItemListWidget::showKeyboardFocusEffect(bool show) -{ - if (m_showKeyboardFocusEffect != show) { - m_showKeyboardFocusEffect = show; - update(); - } -} - -bool KItemListWidget::keyboardFocusEffectShown() -{ - return m_showKeyboardFocusEffect; -} - #include "moc_kitemlistwidget.cpp" diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 21e2af4ba1..0e07d7ab55 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -194,9 +194,6 @@ public: */ virtual void startActivateSoonAnimation(int timeUntilActivation); - void showKeyboardFocusEffect(bool showFocusEffect); - bool keyboardFocusEffectShown(); - Q_SIGNALS: void roleEditingCanceled(int index, const QByteArray &role, const QVariant &value); void roleEditingFinished(int index, const QByteArray &role, const QVariant &value); @@ -261,7 +258,6 @@ private: bool m_expansionAreaHovered; bool m_alternateBackground; bool m_enabledSelectionToggle; - bool m_showKeyboardFocusEffect; QHash m_data; QList m_visibleRoles; QHash m_columnWidths; -- GitLab From c372ea1e5c1fa65c86f971a20a0cb4ccaf1e3d41 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 22 Apr 2025 16:59:40 +0300 Subject: [PATCH 27/69] Fix inconsistent hover area sizing, refactor selectionRect --- src/kitemviews/kitemlistcontroller.cpp | 9 ++++----- src/kitemviews/kitemlistview.cpp | 2 +- src/kitemviews/kitemlistwidget.cpp | 2 +- src/kitemviews/kitemlistwidget.h | 10 +++++----- src/kitemviews/kstandarditemlistwidget.cpp | 14 +++++--------- 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index cd19cd7f69..6ef03dc609 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -990,7 +990,7 @@ bool KItemListController::hoverMoveEvent(QGraphicsSceneHoverEvent *event, const // we also unhover any old expansion toggle hovers, in case the mouse movement from expansion toggle to icon+text is too fast (i.e. newHoveredWidget is never null between the transition) unhoverOldExpansionWidget(); - const bool isOverIconAndText = newHoveredWidget->iconRect().contains(mappedPos) || newHoveredWidget->textRect().contains(mappedPos); + const bool isOverIconAndText = newHoveredWidget->selectionRect().contains(mappedPos); const bool hasMultipleSelection = m_selectionManager->selectedItems().count() > 1; if (hasMultipleSelection && !isOverIconAndText) { @@ -1366,8 +1366,7 @@ void KItemListController::slotRubberBandChanged() if (widgetRect.intersects(rubberBandRect)) { // Select the full row intersecting with the rubberband rectangle const QRectF selectionRect = widget->selectionRect().translated(widgetRect.topLeft()); - const QRectF iconRect = widget->iconRect().translated(widgetRect.topLeft()); - if (selectionRect.intersects(rubberBandRect) || iconRect.intersects(rubberBandRect)) { + if (selectionRect.intersects(rubberBandRect)) { selectedItems.insert(index); } } @@ -1661,7 +1660,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (selectedItemsCount > 1 && m_pressedIndex.has_value()) { const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); const auto mappedPos = row->mapFromItem(m_view, pos); - if (pressedItemAlreadySelected || row->iconRect().contains(mappedPos) || row->textRect().contains(mappedPos)) { + if (pressedItemAlreadySelected || row->selectionRect().contains(mappedPos)) { // we are indeed inside the text/icon rect, keep m_pressedIndex what it is // and short-circuit for single-click activation (it will then propagate to onRelease and activate the item) // or we just keep going for double-click activation @@ -1744,7 +1743,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier // We rule out the latter, if the item is not clicked directly and was unselected previously. const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); const auto mappedPos = row->mapFromItem(m_view, pos); - if (!row->iconRect().contains(mappedPos) && !row->textRect().contains(mappedPos) && !pressedItemAlreadySelected) { + if (!row->selectionRect().contains(mappedPos) && !pressedItemAlreadySelected) { createRubberBand = true; } else { m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Toggle); diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 265e41e6ca..9e0a9e0e5c 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -542,7 +542,7 @@ QRectF KItemListView::itemContextRect(int index) const const KItemListWidget *widget = m_visibleItems.value(index); if (widget) { - contextRect = widget->iconRect() | widget->textRect(); + contextRect = widget->selectionRect(); contextRect.translate(itemRect(index).topLeft()); } diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index a67759d087..8c2432967a 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -612,7 +612,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; - viewItemOption.rect = rect().toRect(); + viewItemOption.rect = selectionRect().toRect(); QPainterPath path; path.addRoundedRect(viewItemOption.rect, roundness, roundness); QColor accentColor{widget->palette().color(QPalette::Accent)}; diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 0e07d7ab55..4d857c00d7 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -144,11 +144,6 @@ public: */ bool contains(const QPointF &point) const override; - /** - * @return Rectangle for the area that shows the icon. - */ - virtual QRectF iconRect() const = 0; - /** * @return Rectangle for the area that contains the text-properties. */ @@ -245,6 +240,11 @@ private Q_SLOTS: void slotHoverSequenceTimerTimeout(); private: + /** + * @return Rectangle for the area that shows the icon. + */ + virtual QRectF iconRect() const = 0; + void initializeSelectionToggle(); void setHoverOpacity(qreal opacity); void drawItemStyleOption(QPainter *painter, QWidget *widget, QStyle::State styleState); diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 0303547b23..4b061c9bb1 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -541,23 +541,19 @@ QRectF KStandardItemListWidget::selectionRect() const { const_cast(this)->triggerCacheRefreshing(); - const int padding = styleOption().padding; - QRectF adjustedIconRect = iconRect().adjusted(-padding, -padding, padding, padding); - QRectF result = adjustedIconRect | m_textRect; if (m_highlightEntireRow) { + const int padding = styleOption().padding; + QRectF adjustedIconRect = iconRect().adjusted(-padding, -padding, padding, padding); + QRectF result = adjustedIconRect | m_textRect; if (layoutDirection() == Qt::LeftToRight) { result.setRight(leftPadding() + m_columnWidthSum); } else { result.setLeft(size().width() - m_columnWidthSum - rightPadding()); } + return result; } else { - // Make sure values are always positive - const int availableWidth = qAbs((size().width() - 2 * padding - result.width()) * 0.5); - const int availableHeight = m_layout == CompactLayout ? 0 : qAbs((size().height() - 2 * padding - result.height()) * 0.5); - result = result.adjusted(-availableWidth, -availableHeight, availableWidth, availableHeight); + return rect(); } - - return result; } QRectF KStandardItemListWidget::expansionToggleRect() const -- GitLab From b09399593c25ab44013cf98afa61813fa628af2a Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 23 Apr 2025 11:58:20 +0300 Subject: [PATCH 28/69] Add constexpr for roundness --- src/kitemviews/kitemlistwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 8c2432967a..269c9b9955 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -607,7 +607,7 @@ void KItemListWidget::clearHoverCache() void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QStyle::State styleState) { QStyleOptionViewItem viewItemOption; - const int roundness = 5; + constexpr int roundness = 5; // From Breeze style. initStyleOption(&viewItemOption); viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; -- GitLab From 688624a1521d8a1d70c37af79920283fda3f8e5f Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 23 Apr 2025 12:03:58 +0300 Subject: [PATCH 29/69] Add slight padding to compactlayout selectionRect --- src/kitemviews/kstandarditemlistwidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 4b061c9bb1..8024d8cb54 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -541,8 +541,8 @@ QRectF KStandardItemListWidget::selectionRect() const { const_cast(this)->triggerCacheRefreshing(); + const int padding = styleOption().padding; if (m_highlightEntireRow) { - const int padding = styleOption().padding; QRectF adjustedIconRect = iconRect().adjusted(-padding, -padding, padding, padding); QRectF result = adjustedIconRect | m_textRect; if (layoutDirection() == Qt::LeftToRight) { @@ -552,6 +552,9 @@ QRectF KStandardItemListWidget::selectionRect() const } return result; } else { + if (m_layout == CompactLayout) { + return rect().adjusted(0, padding, 0, -padding); + } return rect(); } } -- GitLab From 320e14cc150e90bbd2a9981ac5e48973755e6d02 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 23 Apr 2025 12:11:04 +0300 Subject: [PATCH 30/69] Add rubberband start behavior back --- src/kitemviews/kitemlistcontroller.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 6ef03dc609..fd3feb1a1b 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1720,7 +1720,18 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier } if (m_pressedIndex.has_value()) { - bool createRubberBand = false; + // The hover highlight area of an item is being pressed. + const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); // anything outside of row.contains() will be the empty region of the row rect + const bool hitTargetIsRowEmptyRegion = !row->contains(row->mapFromItem(m_view, pos)); + // again, when this method returns false, a rubberBand selection is created as the event is not consumed; + // createRubberBand here tells us whether to return true or false. + bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); + + if (rightClick && hitTargetIsRowEmptyRegion) { + // We have a right click outside the icon and text rect but within the hover highlight area. + // We don't want items to get selected through this, so we return now. + return true; + } m_selectionManager->setCurrentItem(m_pressedIndex.value()); -- GitLab From bf66254daea497b588cdaf2578f3990597188f8a Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 25 Apr 2025 11:06:02 +0300 Subject: [PATCH 31/69] Remove hover pixmap --- src/kitemviews/kstandarditemlistwidget.cpp | 18 +++--------------- src/kitemviews/kstandarditemlistwidget.h | 1 - 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 8024d8cb54..da7fd5f4c7 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 @@ -1108,7 +1107,7 @@ void KStandardItemListWidget::updatePixmapCache() } if (m_pixmap.isNull()) { - m_hoverPixmap = QPixmap(); + m_pixmap = QPixmap(); return; } @@ -1166,17 +1165,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; - if (isSelected()) { - 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() diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index 594d3e4928..3dbf442913 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -280,7 +280,6 @@ private: qreal m_columnWidthSum; QRectF m_iconRect; // Cache for KItemListWidget::iconRect() - QPixmap m_hoverPixmap; // Cache for modified m_pixmap when hovering the item QRectF m_textRect; -- GitLab From f41db3725ad36175721afd430de8ea1b63867803 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 25 Apr 2025 11:12:33 +0300 Subject: [PATCH 32/69] Change the alpha values --- src/kitemviews/kitemlistwidget.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 269c9b9955..b52661e6ee 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -623,11 +623,11 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // https://invent.kde.org/plasma/libplasma/-/blob/master/src/desktoptheme/breeze/widgets/viewitem.svg accentColor.setAlphaF(0.0); if (m_selected && m_hovered) { - accentColor.setAlphaF(0.5); + accentColor.setAlphaF(0.25); } else if (m_selected) { - accentColor.setAlphaF(0.4); + accentColor.setAlphaF(0.2); } else if (m_hovered) { - accentColor.setAlphaF(0.3); + accentColor.setAlphaF(0.15); } painter->fillPath(path, accentColor); @@ -635,7 +635,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // Focus decoration if (current) { accentColor = m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker(110) : accentColor.lighter(110); - accentColor.setAlphaF(m_selected || m_hovered ? 1.0 : 0.5); + accentColor.setAlphaF(m_selected || m_hovered ? 0.8 : 0.5); // Set the pen color lighter or darker depending on background color QPen pen{accentColor, 1.5}; pen.setCosmetic(true); -- GitLab From e299bf436628e58677f06513266811ac4f215f59 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 25 Apr 2025 12:53:42 +0300 Subject: [PATCH 33/69] Set hovered effect to widgets when dragging --- src/kitemviews/kitemlistcontroller.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index fd3feb1a1b..66e9ce4884 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -652,6 +652,10 @@ bool KItemListController::mouseMoveEvent(QGraphicsSceneMouseEvent *event, const m_selectionManager->endAnchoredSelection(); m_selectionManager->setCurrentItem(newCurrent.value()); m_selectionManager->beginAnchoredSelection(newCurrent.value()); + // Set hovered effect when dragging. + for (const auto widget : m_view->visibleItemListWidgets()) { + widget->setHovered(widget->isCurrent()); + } } if (m_view->scrollOrientation() == Qt::Vertical) { -- GitLab From 7a96007a21cc3a844a04992bd4edb764df561039 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 25 Apr 2025 13:08:52 +0300 Subject: [PATCH 34/69] Move virtual iconrect back to public --- src/kitemviews/kitemlistwidget.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 4d857c00d7..0e07d7ab55 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -144,6 +144,11 @@ public: */ bool contains(const QPointF &point) const override; + /** + * @return Rectangle for the area that shows the icon. + */ + virtual QRectF iconRect() const = 0; + /** * @return Rectangle for the area that contains the text-properties. */ @@ -240,11 +245,6 @@ private Q_SLOTS: void slotHoverSequenceTimerTimeout(); private: - /** - * @return Rectangle for the area that shows the icon. - */ - virtual QRectF iconRect() const = 0; - void initializeSelectionToggle(); void setHoverOpacity(qreal opacity); void drawItemStyleOption(QPainter *painter, QWidget *widget, QStyle::State styleState); -- GitLab From 829d721b6ed44202ad91b4ee0ead1b578746d21f Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 25 Apr 2025 13:11:20 +0300 Subject: [PATCH 35/69] Remove unecessary assignment --- src/kitemviews/kstandarditemlistwidget.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index da7fd5f4c7..25dece0f62 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -1107,7 +1107,6 @@ void KStandardItemListWidget::updatePixmapCache() } if (m_pixmap.isNull()) { - m_pixmap = QPixmap(); return; } -- GitLab From d8d4a220cb55e0de7364abd1ebfa4666dbbfa2a8 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 28 Apr 2025 15:56:09 +0300 Subject: [PATCH 36/69] Better alpha values --- src/kitemviews/kitemlistwidget.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index b52661e6ee..1b6969130f 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -623,11 +623,11 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // https://invent.kde.org/plasma/libplasma/-/blob/master/src/desktoptheme/breeze/widgets/viewitem.svg accentColor.setAlphaF(0.0); if (m_selected && m_hovered) { - accentColor.setAlphaF(0.25); + accentColor.setAlphaF(0.32); } else if (m_selected) { - accentColor.setAlphaF(0.2); + accentColor.setAlphaF(0.30); } else if (m_hovered) { - accentColor.setAlphaF(0.15); + accentColor.setAlphaF(0.20); } painter->fillPath(path, accentColor); @@ -635,7 +635,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // Focus decoration if (current) { accentColor = m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker(110) : accentColor.lighter(110); - accentColor.setAlphaF(m_selected || m_hovered ? 0.8 : 0.5); + accentColor.setAlphaF(m_selected || m_hovered ? 0.8 : 0.6); // Set the pen color lighter or darker depending on background color QPen pen{accentColor, 1.5}; pen.setCosmetic(true); -- GitLab From c116d53065c1cd71a1f5d924643824145e2e834e Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 29 Apr 2025 11:35:57 +0300 Subject: [PATCH 37/69] Use text color as background color, modify alpha values --- src/kitemviews/kitemlistwidget.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 1b6969130f..0af131c586 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -615,29 +615,31 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS viewItemOption.rect = selectionRect().toRect(); QPainterPath path; path.addRoundedRect(viewItemOption.rect, roundness, roundness); - QColor accentColor{widget->palette().color(QPalette::Accent)}; + QColor backgroundColor{widget->palette().color(QPalette::Accent)}; painter->setRenderHint(QPainter::Antialiasing); bool current = m_current && styleState & QStyle::State_Active; // Background item, alpha values are from // https://invent.kde.org/plasma/libplasma/-/blob/master/src/desktoptheme/breeze/widgets/viewitem.svg - accentColor.setAlphaF(0.0); + backgroundColor.setAlphaF(0.0); if (m_selected && m_hovered) { - accentColor.setAlphaF(0.32); + backgroundColor.setAlphaF(0.40); } else if (m_selected) { - accentColor.setAlphaF(0.30); + backgroundColor.setAlphaF(0.32); } else if (m_hovered) { - accentColor.setAlphaF(0.20); + backgroundColor = widget->palette().color(QPalette::Text); + backgroundColor.setAlphaF(0.06); } - painter->fillPath(path, accentColor); + painter->fillPath(path, backgroundColor); // Focus decoration if (current) { - accentColor = m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? accentColor.darker(110) : accentColor.lighter(110); - accentColor.setAlphaF(m_selected || m_hovered ? 0.8 : 0.6); + QColor focusColor{widget->palette().color(QPalette::Accent)}; + focusColor = m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? focusColor.darker(110) : focusColor.lighter(110); + focusColor.setAlphaF(m_selected || m_hovered ? 0.8 : 0.6); // Set the pen color lighter or darker depending on background color - QPen pen{accentColor, 1.5}; + QPen pen{focusColor, 1.5}; pen.setCosmetic(true); painter->setPen(pen); painter->drawPath(path); -- GitLab From 66ccf1e63224471fa80ea4d2d868c8dc31697498 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 5 May 2025 14:31:47 +0300 Subject: [PATCH 38/69] Make sure backgrounds dont overlap at the outline --- src/kitemviews/kitemlistwidget.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 0af131c586..c65c0b2d78 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -608,13 +608,14 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS { QStyleOptionViewItem viewItemOption; constexpr int roundness = 5; // From Breeze style. + constexpr qreal penWidth = 1.5; initStyleOption(&viewItemOption); viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; viewItemOption.rect = selectionRect().toRect(); QPainterPath path; - path.addRoundedRect(viewItemOption.rect, roundness, roundness); + path.addRoundedRect(selectionRect().adjusted(penWidth, penWidth, -penWidth, -penWidth), roundness, roundness); QColor backgroundColor{widget->palette().color(QPalette::Accent)}; painter->setRenderHint(QPainter::Antialiasing); bool current = m_current && styleState & QStyle::State_Active; @@ -639,7 +640,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS focusColor = m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? focusColor.darker(110) : focusColor.lighter(110); focusColor.setAlphaF(m_selected || m_hovered ? 0.8 : 0.6); // Set the pen color lighter or darker depending on background color - QPen pen{focusColor, 1.5}; + QPen pen{focusColor, penWidth}; pen.setCosmetic(true); painter->setPen(pen); painter->drawPath(path); -- GitLab From 91f8b3123f62db459c970c46190cbf967e1050f9 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 23 May 2025 14:22:14 +0300 Subject: [PATCH 39/69] Add horizontal margin according to icon size --- src/views/dolphinitemlistview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/dolphinitemlistview.cpp b/src/views/dolphinitemlistview.cpp index d31dc11bae..7910080f82 100644 --- a/src/views/dolphinitemlistview.cpp +++ b/src/views/dolphinitemlistview.cpp @@ -194,7 +194,7 @@ void DolphinItemListView::updateGridSize() itemHeight = padding * 3 + iconSize + option.fontMetrics.lineSpacing(); - horizontalMargin = 4; + horizontalMargin = qMax(8.0, ((iconSize + padding) / 4.0)) * qApp->devicePixelRatio(); verticalMargin = 8; maxTextLines = IconsModeSettings::maximumTextLines(); break; -- GitLab From 4884701d6f4f4e86bf490c5f5df80289f8b40873 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 26 May 2025 16:21:21 +0300 Subject: [PATCH 40/69] Use PM_SizeGripSize for horizontal and vertical margins --- src/views/dolphinitemlistview.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/dolphinitemlistview.cpp b/src/views/dolphinitemlistview.cpp index 7910080f82..8529f23a76 100644 --- a/src/views/dolphinitemlistview.cpp +++ b/src/views/dolphinitemlistview.cpp @@ -194,8 +194,9 @@ void DolphinItemListView::updateGridSize() itemHeight = padding * 3 + iconSize + option.fontMetrics.lineSpacing(); - horizontalMargin = qMax(8.0, ((iconSize + padding) / 4.0)) * qApp->devicePixelRatio(); - verticalMargin = 8; + const auto margin = style()->pixelMetric(QStyle::PM_SizeGripSize); + horizontalMargin = margin; + verticalMargin = margin; maxTextLines = IconsModeSettings::maximumTextLines(); break; } -- GitLab From 452a00a4fe2e1552d9b1e48b4d9ab98b67007072 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 2 Jun 2025 12:34:02 +0300 Subject: [PATCH 41/69] Refactor selectionRect to selectionRectCore/extended/visual --- src/kitemviews/kitemlistcontroller.cpp | 10 +++--- src/kitemviews/kitemlistview.cpp | 4 +-- src/kitemviews/kitemlistwidget.cpp | 7 ++-- src/kitemviews/kitemlistwidget.h | 22 ++++++++---- src/kitemviews/kstandarditemlistwidget.cpp | 41 ++++++++++++---------- src/kitemviews/kstandarditemlistwidget.h | 5 +-- 6 files changed, 51 insertions(+), 38 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 66e9ce4884..566f1d6a24 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -994,7 +994,7 @@ bool KItemListController::hoverMoveEvent(QGraphicsSceneHoverEvent *event, const // we also unhover any old expansion toggle hovers, in case the mouse movement from expansion toggle to icon+text is too fast (i.e. newHoveredWidget is never null between the transition) unhoverOldExpansionWidget(); - const bool isOverIconAndText = newHoveredWidget->selectionRect().contains(mappedPos); + const bool isOverIconAndText = newHoveredWidget->selectionRectCore().contains(mappedPos); const bool hasMultipleSelection = m_selectionManager->selectedItems().count() > 1; if (hasMultipleSelection && !isOverIconAndText) { @@ -1369,7 +1369,7 @@ void KItemListController::slotRubberBandChanged() const QRectF widgetRect = m_view->itemRect(index); if (widgetRect.intersects(rubberBandRect)) { // Select the full row intersecting with the rubberband rectangle - const QRectF selectionRect = widget->selectionRect().translated(widgetRect.topLeft()); + const QRectF selectionRect = widget->visualSelectionRect().translated(widgetRect.topLeft()); if (selectionRect.intersects(rubberBandRect)) { selectedItems.insert(index); } @@ -1470,7 +1470,7 @@ KItemListWidget *KItemListController::widgetForPos(const QPointF &pos) const const auto widgets = m_view->visibleItemListWidgets(); for (KItemListWidget *widget : widgets) { const QPointF mappedPos = widget->mapFromItem(m_view, pos); - if (widget->contains(mappedPos) || widget->selectionRect().contains(mappedPos)) { + if (widget->contains(mappedPos) || widget->visualSelectionRect().contains(mappedPos)) { return widget; } } @@ -1664,7 +1664,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (selectedItemsCount > 1 && m_pressedIndex.has_value()) { const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); const auto mappedPos = row->mapFromItem(m_view, pos); - if (pressedItemAlreadySelected || row->selectionRect().contains(mappedPos)) { + if (pressedItemAlreadySelected || row->selectionRectCore().contains(mappedPos)) { // we are indeed inside the text/icon rect, keep m_pressedIndex what it is // and short-circuit for single-click activation (it will then propagate to onRelease and activate the item) // or we just keep going for double-click activation @@ -1758,7 +1758,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier // We rule out the latter, if the item is not clicked directly and was unselected previously. const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); const auto mappedPos = row->mapFromItem(m_view, pos); - if (!row->selectionRect().contains(mappedPos) && !pressedItemAlreadySelected) { + if (!row->selectionRectCore().contains(mappedPos) && !pressedItemAlreadySelected) { createRubberBand = true; } else { m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Toggle); diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 9e0a9e0e5c..4146dd8438 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -425,7 +425,7 @@ std::optional KItemListView::itemAt(const QPointF &pos) const const KItemListWidget *widget = it.value(); const QPointF mappedPos = widget->mapFromItem(this, pos); - if (widget->contains(mappedPos) || widget->selectionRect().contains(mappedPos)) { + if (widget->contains(mappedPos) || widget->visualSelectionRect().contains(mappedPos)) { return it.key(); } } @@ -542,7 +542,7 @@ QRectF KItemListView::itemContextRect(int index) const const KItemListWidget *widget = m_visibleItems.value(index); if (widget) { - contextRect = widget->selectionRect(); + contextRect = widget->visualSelectionRect(); contextRect.translate(itemRect(index).topLeft()); } diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index c65c0b2d78..18bd4c48b3 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -407,7 +407,7 @@ bool KItemListWidget::contains(const QPointF &point) const return false; } - return iconRect().contains(point) || textRect().contains(point) || expansionToggleRect().contains(point) || selectionToggleRect().contains(point); + return selectionRectCore().contains(point) || expansionToggleRect().contains(point) || selectionToggleRect().contains(point); } QRectF KItemListWidget::textFocusRect() const @@ -613,9 +613,10 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; - viewItemOption.rect = selectionRect().toRect(); + // TODO: check if we're extended or not + viewItemOption.rect = visualSelectionRect().toRect(); QPainterPath path; - path.addRoundedRect(selectionRect().adjusted(penWidth, penWidth, -penWidth, -penWidth), roundness, roundness); + path.addRoundedRect(visualSelectionRect().adjusted(penWidth, penWidth, -penWidth, -penWidth), roundness, roundness); QColor backgroundColor{widget->palette().color(QPalette::Accent)}; painter->setRenderHint(QPainter::Antialiasing); bool current = m_current && styleState & QStyle::State_Active; diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 0e07d7ab55..489081b604 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -144,11 +144,6 @@ public: */ bool contains(const QPointF &point) const override; - /** - * @return Rectangle for the area that shows the icon. - */ - virtual QRectF iconRect() const = 0; - /** * @return Rectangle for the area that contains the text-properties. */ @@ -164,9 +159,22 @@ public: virtual QRectF textFocusRect() const; /** - * @return Rectangle around which a selection box should be drawn if the item is selected. + * Used for drawing the visuals, and situations where we want the behavior of the + * selection to match the visuals. + * + * @return The rectangle around selection, depending on if it's full width or not. + */ + virtual QRectF visualSelectionRect() const = 0; + + /** + * @return Rectangle around icon and it's text: The core area of the item. + */ + virtual QRectF selectionRectCore() const = 0; + + /** + * @return Same as core, but extended to the full width of the details view. */ - virtual QRectF selectionRect() const = 0; + virtual QRectF selectionRectExtended() const = 0; /** * @return Rectangle for the selection-toggle that is used to select or deselect an item. diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 25dece0f62..0661a19944 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -483,12 +483,6 @@ void KStandardItemListWidget::paint(QPainter *painter, const QStyleOptionGraphic #endif } -QRectF KStandardItemListWidget::iconRect() const -{ - const_cast(this)->triggerCacheRefreshing(); - return m_iconRect; -} - QRectF KStandardItemListWidget::textRect() const { const_cast(this)->triggerCacheRefreshing(); @@ -536,28 +530,37 @@ QRectF KStandardItemListWidget::textFocusRect() const return m_textRect; } -QRectF KStandardItemListWidget::selectionRect() const +QRectF KStandardItemListWidget::visualSelectionRect() const { const_cast(this)->triggerCacheRefreshing(); - - const int padding = styleOption().padding; if (m_highlightEntireRow) { - QRectF adjustedIconRect = iconRect().adjusted(-padding, -padding, padding, padding); - QRectF result = adjustedIconRect | m_textRect; - if (layoutDirection() == Qt::LeftToRight) { - result.setRight(leftPadding() + m_columnWidthSum); - } else { - result.setLeft(size().width() - m_columnWidthSum - rightPadding()); - } - return result; + return selectionRectExtended(); } else { if (m_layout == CompactLayout) { - return rect().adjusted(0, padding, 0, -padding); + const int padding = styleOption().padding; + return rect().adjusted(-padding, 0, padding, 0); } return rect(); } } +QRectF KStandardItemListWidget::selectionRectCore() const +{ + QRectF result = m_iconRect | m_textRect; + return result; +} + +QRectF KStandardItemListWidget::selectionRectExtended() const +{ + QRectF result = selectionRectCore(); + if (layoutDirection() == Qt::LeftToRight) { + result.setRight(leftPadding() + m_columnWidthSum); + } else { + result.setLeft(size().width() - m_columnWidthSum - rightPadding()); + } + return result; +} + QRectF KStandardItemListWidget::expansionToggleRect() const { const_cast(this)->triggerCacheRefreshing(); @@ -577,7 +580,7 @@ QRectF KStandardItemListWidget::selectionToggleRect() const } const int padding = styleOption().padding; - const QRectF selectionRectMinusPadding = selectionRect().adjusted(padding, padding, -padding, -padding); + const QRectF selectionRectMinusPadding = selectionRectCore().adjusted(padding, padding, -padding, -padding); QPointF pos = selectionRectMinusPadding.topLeft(); if (QApplication::isRightToLeft()) { pos.setX(selectionRectMinusPadding.right() - (pos.x() + toggleSize - selectionRectMinusPadding.left())); diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index 3dbf442913..c8feed1c9f 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -105,10 +105,11 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; - QRectF iconRect() const override; QRectF textRect() const override; QRectF textFocusRect() const override; - QRectF selectionRect() const override; + QRectF visualSelectionRect() const override; + QRectF selectionRectCore() const override; + QRectF selectionRectExtended() const override; QRectF expansionToggleRect() const override; QRectF selectionToggleRect() const override; QPixmap createDragPixmap(const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; -- GitLab From 6a9f1e168b201d6f6d2edf88d1eb040a208d48f5 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 2 Jun 2025 19:04:47 +0300 Subject: [PATCH 42/69] fix emblem position --- src/kitemviews/kstandarditemlistwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 0661a19944..58fc9b0415 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -580,7 +580,7 @@ QRectF KStandardItemListWidget::selectionToggleRect() const } const int padding = styleOption().padding; - const QRectF selectionRectMinusPadding = selectionRectCore().adjusted(padding, padding, -padding, -padding); + const QRectF selectionRectMinusPadding = visualSelectionRect().adjusted(padding, padding, -padding, -padding); QPointF pos = selectionRectMinusPadding.topLeft(); if (QApplication::isRightToLeft()) { pos.setX(selectionRectMinusPadding.right() - (pos.x() + toggleSize - selectionRectMinusPadding.left())); -- GitLab From f1098aa09599e59fceacc3c90e3daf5b4c177860 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 2 Jun 2025 19:05:01 +0300 Subject: [PATCH 43/69] fix widget contains --- src/kitemviews/kitemlistwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 18bd4c48b3..ea6b31861e 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -407,7 +407,7 @@ bool KItemListWidget::contains(const QPointF &point) const return false; } - return selectionRectCore().contains(point) || expansionToggleRect().contains(point) || selectionToggleRect().contains(point); + return visualSelectionRect().contains(point) || expansionToggleRect().contains(point) || selectionToggleRect().contains(point); } QRectF KItemListWidget::textFocusRect() const -- GitLab From 5e9a5e1a0801a4e9e8b3b72f741cb989e8637e18 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 2 Jun 2025 19:05:11 +0300 Subject: [PATCH 44/69] remove unnecessary comparisons --- src/kitemviews/kitemlistcontroller.cpp | 2 +- src/kitemviews/kitemlistview.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 566f1d6a24..e398985e8a 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1470,7 +1470,7 @@ KItemListWidget *KItemListController::widgetForPos(const QPointF &pos) const const auto widgets = m_view->visibleItemListWidgets(); for (KItemListWidget *widget : widgets) { const QPointF mappedPos = widget->mapFromItem(m_view, pos); - if (widget->contains(mappedPos) || widget->visualSelectionRect().contains(mappedPos)) { + if (widget->contains(mappedPos)) { return widget; } } diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 4146dd8438..90f2beebb9 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -425,7 +425,7 @@ std::optional KItemListView::itemAt(const QPointF &pos) const const KItemListWidget *widget = it.value(); const QPointF mappedPos = widget->mapFromItem(this, pos); - if (widget->contains(mappedPos) || widget->visualSelectionRect().contains(mappedPos)) { + if (widget->contains(mappedPos)) { return it.key(); } } -- GitLab From 57d43263cbee51f0f3cb9b0675ffd9fd347791dc Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 2 Jun 2025 19:42:30 +0300 Subject: [PATCH 45/69] Draw different selection highlights depending on settings --- src/kitemviews/kstandarditemlistwidget.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 58fc9b0415..d507d7c0f1 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -533,8 +533,12 @@ QRectF KStandardItemListWidget::textFocusRect() const QRectF KStandardItemListWidget::visualSelectionRect() const { const_cast(this)->triggerCacheRefreshing(); - if (m_highlightEntireRow) { - return selectionRectExtended(); + if (m_layout == DetailsLayout) { + if (m_highlightEntireRow) { + return rect(); + } else { + return selectionRectExtended(); + } } else { if (m_layout == CompactLayout) { const int padding = styleOption().padding; -- GitLab From 337040cbe81adb6e443fc11045e9e2fd5f800a2b Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 2 Jun 2025 19:44:24 +0300 Subject: [PATCH 46/69] Make sure we follow details mode selection settings --- src/kitemviews/kitemlistcontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index e398985e8a..45cba1a0db 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1726,7 +1726,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (m_pressedIndex.has_value()) { // The hover highlight area of an item is being pressed. const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); // anything outside of row.contains() will be the empty region of the row rect - const bool hitTargetIsRowEmptyRegion = !row->contains(row->mapFromItem(m_view, pos)); + const bool hitTargetIsRowEmptyRegion = !row->selectionRectCore().contains(row->mapFromItem(m_view, pos)); // again, when this method returns false, a rubberBand selection is created as the event is not consumed; // createRubberBand here tells us whether to return true or false. bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); -- GitLab From e212678b7c1972cd28c72d6515ad7e52242e3082 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 3 Jun 2025 11:46:56 +0300 Subject: [PATCH 47/69] Fix drawing for details view --- src/kitemviews/kitemlistcontroller.cpp | 2 +- src/kitemviews/kstandarditemlistwidget.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 45cba1a0db..dfe3fb0eaf 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1726,7 +1726,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (m_pressedIndex.has_value()) { // The hover highlight area of an item is being pressed. const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); // anything outside of row.contains() will be the empty region of the row rect - const bool hitTargetIsRowEmptyRegion = !row->selectionRectCore().contains(row->mapFromItem(m_view, pos)); + const bool hitTargetIsRowEmptyRegion = !row->visualSelectionRect().contains(row->mapFromItem(m_view, pos)); // again, when this method returns false, a rubberBand selection is created as the event is not consumed; // createRubberBand here tells us whether to return true or false. bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index d507d7c0f1..a233472fc6 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -533,15 +533,15 @@ QRectF KStandardItemListWidget::textFocusRect() const QRectF KStandardItemListWidget::visualSelectionRect() const { const_cast(this)->triggerCacheRefreshing(); + const int padding = styleOption().padding; if (m_layout == DetailsLayout) { + auto rect = selectionRectCore(); if (m_highlightEntireRow) { - return rect(); - } else { - return selectionRectExtended(); + rect = selectionRectExtended(); } + return rect.adjusted(-padding, 0, padding, 0); } else { if (m_layout == CompactLayout) { - const int padding = styleOption().padding; return rect().adjusted(-padding, 0, padding, 0); } return rect(); -- GitLab From 85e7e8eb933448b89138e0ce0b1d23f838711aa3 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 3 Jun 2025 12:00:17 +0300 Subject: [PATCH 48/69] cleanup --- src/kitemviews/kstandarditemlistwidget.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index a233472fc6..ed267bb25d 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -1295,7 +1295,6 @@ void KStandardItemListWidget::updateIconsLayoutTextCache() const KItemListStyleOption &option = styleOption(); const qreal padding = option.padding; - // adjust the max width according to new outline style const qreal maxWidth = size().width() - 2 * padding; const qreal lineSpacing = m_customizedFontMetrics.lineSpacing(); -- GitLab From a22c63ce2472213ca27fe57c4feafde3985a99d7 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Tue, 3 Jun 2025 17:51:51 +0300 Subject: [PATCH 49/69] remove hover effect when dragging --- src/kitemviews/kitemlistcontroller.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index dfe3fb0eaf..561917e80e 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -652,10 +652,6 @@ bool KItemListController::mouseMoveEvent(QGraphicsSceneMouseEvent *event, const m_selectionManager->endAnchoredSelection(); m_selectionManager->setCurrentItem(newCurrent.value()); m_selectionManager->beginAnchoredSelection(newCurrent.value()); - // Set hovered effect when dragging. - for (const auto widget : m_view->visibleItemListWidgets()) { - widget->setHovered(widget->isCurrent()); - } } if (m_view->scrollOrientation() == Qt::Vertical) { @@ -1363,7 +1359,7 @@ void KItemListController::slotRubberBandChanged() // Select all visible items that intersect with the rubberband const auto widgets = m_view->visibleItemListWidgets(); - for (const KItemListWidget *widget : widgets) { + for (KItemListWidget *widget : widgets) { const int index = widget->index(); const QRectF widgetRect = m_view->itemRect(index); -- GitLab From b4937aa0676d84beb41ee4d6750b0cee711a5682 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 4 Jun 2025 12:31:26 +0300 Subject: [PATCH 50/69] set a click highlight color --- src/kitemviews/kitemlistcontroller.cpp | 11 ++++++----- src/kitemviews/kitemlistwidget.cpp | 14 ++++++++++++-- src/kitemviews/kitemlistwidget.h | 3 +++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 561917e80e..525e8107a4 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1640,6 +1640,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier // simplify the overall logic and possibilities both for users and devs. const bool leftClick = buttons & Qt::LeftButton; const bool rightClick = buttons & Qt::RightButton; + const bool singleClickActivation = m_view->style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick); // The previous selection is cleared if either // 1. The selection mode is SingleSelection, or @@ -1664,7 +1665,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier // we are indeed inside the text/icon rect, keep m_pressedIndex what it is // and short-circuit for single-click activation (it will then propagate to onRelease and activate the item) // or we just keep going for double-click activation - if (m_view->style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick) || m_singleClickActivationEnforced) { + if (singleClickActivation || m_singleClickActivationEnforced) { if (!pressedItemAlreadySelected) { // An unselected item was clicked directly while deselecting multiple other items so we mark it "current". m_selectionManager->setCurrentItem(m_pressedIndex.value()); @@ -1740,8 +1741,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier break; case SingleSelection: - if (!leftClick || shiftOrControlPressed - || (!m_view->style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick) && !m_singleClickActivationEnforced)) { + if (!leftClick || shiftOrControlPressed || (!singleClickActivation && !m_singleClickActivationEnforced)) { m_selectionManager->setSelected(m_pressedIndex.value()); } break; @@ -1764,9 +1764,10 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier } } else if (!shiftPressed || !m_selectionManager->isAnchoredSelectionActive()) { // Select the pressed item and start a new anchored selection - if (!leftClick || shiftOrControlPressed - || (!m_view->style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick) && !m_singleClickActivationEnforced)) { + if (!leftClick || shiftOrControlPressed || (!singleClickActivation && !m_singleClickActivationEnforced)) { m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Select); + } else if (leftClick && (m_singleClickActivationEnforced || singleClickActivation)) { + row->setClickHighlight(true); } m_selectionManager->beginAnchoredSelection(m_pressedIndex.value()); } diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index ea6b31861e..22d10d1481 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -37,6 +37,7 @@ KItemListWidget::KItemListWidget(KItemListWidgetInformant *informant, QGraphicsI , m_expansionAreaHovered(false) , m_alternateBackground(false) , m_enabledSelectionToggle(false) + , m_clickHighlighted(false) , m_data() , m_visibleRoles() , m_columnWidths() @@ -281,6 +282,7 @@ void KItemListWidget::setHovered(bool hovered) m_hoverSequenceTimer.start(interval); } else { + m_clickHighlighted = false; setHoverOpacity(0.0); if (m_selectionToggle) { @@ -604,6 +606,14 @@ void KItemListWidget::clearHoverCache() m_hoverCache = nullptr; } +void KItemListWidget::setClickHighlight(bool enabled) +{ + if (m_clickHighlighted != enabled) { + m_clickHighlighted = enabled; + update(); + } +} + void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QStyle::State styleState) { QStyleOptionViewItem viewItemOption; @@ -624,11 +634,11 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // Background item, alpha values are from // https://invent.kde.org/plasma/libplasma/-/blob/master/src/desktoptheme/breeze/widgets/viewitem.svg backgroundColor.setAlphaF(0.0); - if (m_selected && m_hovered) { + if ((m_selected && m_hovered) || m_clickHighlighted) { backgroundColor.setAlphaF(0.40); } else if (m_selected) { backgroundColor.setAlphaF(0.32); - } else if (m_hovered) { + } else if (m_hovered && !m_clickHighlighted) { backgroundColor = widget->palette().color(QPalette::Text); backgroundColor.setAlphaF(0.06); } diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 489081b604..415bc4b5c7 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -109,6 +109,8 @@ public: void setEnabledSelectionToggle(bool enabled); bool enabledSelectionToggle() const; + void setClickHighlight(bool enabled); + /** * Sets the sibling information for the item and all of its parents. * The sibling information of the upper most parent is represented by @@ -266,6 +268,7 @@ private: bool m_expansionAreaHovered; bool m_alternateBackground; bool m_enabledSelectionToggle; + bool m_clickHighlighted; QHash m_data; QList m_visibleRoles; QHash m_columnWidths; -- GitLab From 9f5e8f169ac98a6d2b23bf850cb6a4470a51b30d Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 5 Jun 2025 12:17:14 +0300 Subject: [PATCH 51/69] Add hitTargetRect --- src/kitemviews/kitemlistcontroller.cpp | 2 +- src/kitemviews/kitemlistwidget.h | 11 +++++++++-- src/kitemviews/kstandarditemlistwidget.cpp | 9 +++++++++ src/kitemviews/kstandarditemlistwidget.h | 1 + 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 525e8107a4..d5c72a875b 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1723,7 +1723,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (m_pressedIndex.has_value()) { // The hover highlight area of an item is being pressed. const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); // anything outside of row.contains() will be the empty region of the row rect - const bool hitTargetIsRowEmptyRegion = !row->visualSelectionRect().contains(row->mapFromItem(m_view, pos)); + const bool hitTargetIsRowEmptyRegion = !row->hitTargetRect().contains(row->mapFromItem(m_view, pos)); // again, when this method returns false, a rubberBand selection is created as the event is not consumed; // createRubberBand here tells us whether to return true or false. bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 415bc4b5c7..ca0dc704b8 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -139,8 +139,8 @@ public: int iconSize() const; /** - * @return True if \a point is inside KItemListWidget::hoverRect(), - * KItemListWidget::textRect(), KItemListWidget::selectionToggleRect() + * @return True if \a point is inside KItemListWidget::visualSelectionRect(), + * KItemListWidget::selectionToggleRect() * or KItemListWidget::expansionToggleRect(). * @reimp */ @@ -178,6 +178,13 @@ public: */ virtual QRectF selectionRectExtended() const = 0; + /** + * @return Rectangle where dragging the item is allowed to start. + * In compact and icon views, it returns KItemListWidget::visualSelectionRect(). + * In details view, it returns KItemListWidget::selectionRectCore(). + */ + virtual QRectF hitTargetRect() const = 0; + /** * @return Rectangle for the selection-toggle that is used to select or deselect an item. * Per default an empty rectangle is returned which means that no selection-toggle diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index ed267bb25d..46374d577b 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -565,6 +565,15 @@ QRectF KStandardItemListWidget::selectionRectExtended() const return result; } +QRectF KStandardItemListWidget::hitTargetRect() const +{ + if (m_layout == DetailsLayout) { + return selectionRectCore(); + } else { + return visualSelectionRect(); + } +} + QRectF KStandardItemListWidget::expansionToggleRect() const { const_cast(this)->triggerCacheRefreshing(); diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index c8feed1c9f..b9deed7454 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -110,6 +110,7 @@ public: QRectF visualSelectionRect() const override; QRectF selectionRectCore() const override; QRectF selectionRectExtended() const override; + QRectF hitTargetRect() const override; QRectF expansionToggleRect() const override; QRectF selectionToggleRect() const override; QPixmap createDragPixmap(const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; -- GitLab From a58b2bcb52433019b1682113ae0feeebf7113b14 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 9 Jun 2025 11:41:46 +0300 Subject: [PATCH 52/69] Set click highlight work like toolbar click highlight --- src/kitemviews/kitemlistcontroller.cpp | 8 +++++++- src/kitemviews/kitemlistwidget.cpp | 20 ++++++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index d5c72a875b..5201134b9f 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -675,6 +675,10 @@ bool KItemListController::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, con return false; } + for (KItemListWidget *widget : m_view->visibleItemListWidgets()) { + widget->setClickHighlight(false); + } + if (m_view->m_tapAndHoldIndicator->isActive()) { m_view->m_tapAndHoldIndicator->setActive(false); } @@ -1029,6 +1033,7 @@ bool KItemListController::hoverLeaveEvent(QGraphicsSceneHoverEvent *event, const const auto widgets = m_view->visibleItemListWidgets(); for (KItemListWidget *widget : widgets) { + widget->setClickHighlight(false); if (widget->isHovered()) { widget->setHovered(false); Q_EMIT itemUnhovered(widget->index()); @@ -1766,7 +1771,8 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier // Select the pressed item and start a new anchored selection if (!leftClick || shiftOrControlPressed || (!singleClickActivation && !m_singleClickActivationEnforced)) { m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Select); - } else if (leftClick && (m_singleClickActivationEnforced || singleClickActivation)) { + } + if (leftClick) { row->setClickHighlight(true); } m_selectionManager->beginAnchoredSelection(m_pressedIndex.value()); diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 22d10d1481..a14d28162a 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -282,7 +282,6 @@ void KItemListWidget::setHovered(bool hovered) m_hoverSequenceTimer.start(interval); } else { - m_clickHighlighted = false; setHoverOpacity(0.0); if (m_selectionToggle) { @@ -634,13 +633,18 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS // Background item, alpha values are from // https://invent.kde.org/plasma/libplasma/-/blob/master/src/desktoptheme/breeze/widgets/viewitem.svg backgroundColor.setAlphaF(0.0); - if ((m_selected && m_hovered) || m_clickHighlighted) { - backgroundColor.setAlphaF(0.40); - } else if (m_selected) { - backgroundColor.setAlphaF(0.32); - } else if (m_hovered && !m_clickHighlighted) { - backgroundColor = widget->palette().color(QPalette::Text); - backgroundColor.setAlphaF(0.06); + + if (m_clickHighlighted) { + backgroundColor.setAlphaF(0.5); + } else { + if (m_selected && m_hovered) { + backgroundColor.setAlphaF(0.40); + } else if (m_selected) { + backgroundColor.setAlphaF(0.32); + } else if (m_hovered) { + backgroundColor = widget->palette().color(QPalette::Text); + backgroundColor.setAlphaF(0.06); + } } painter->fillPath(path, backgroundColor); -- GitLab From cf5f5e8d2735bef7df60926ccdfc1fae1473de97 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 11 Jun 2025 13:16:01 +0300 Subject: [PATCH 53/69] make button click highlight stronger, fix highlight not clearing --- src/kitemviews/kitemlistcontroller.cpp | 7 ++++--- src/kitemviews/kitemlistwidget.cpp | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 5201134b9f..5222b9c957 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1733,6 +1733,10 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier // createRubberBand here tells us whether to return true or false. bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); + if (leftClick) { + row->setClickHighlight(true); + } + if (rightClick && hitTargetIsRowEmptyRegion) { // We have a right click outside the icon and text rect but within the hover highlight area. // We don't want items to get selected through this, so we return now. @@ -1772,9 +1776,6 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (!leftClick || shiftOrControlPressed || (!singleClickActivation && !m_singleClickActivationEnforced)) { m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Select); } - if (leftClick) { - row->setClickHighlight(true); - } m_selectionManager->beginAnchoredSelection(m_pressedIndex.value()); } break; diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index a14d28162a..eb24a19dc8 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -609,6 +609,7 @@ void KItemListWidget::setClickHighlight(bool enabled) { if (m_clickHighlighted != enabled) { m_clickHighlighted = enabled; + clearHoverCache(); update(); } } @@ -635,7 +636,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS backgroundColor.setAlphaF(0.0); if (m_clickHighlighted) { - backgroundColor.setAlphaF(0.5); + backgroundColor.setAlphaF(1.0); } else { if (m_selected && m_hovered) { backgroundColor.setAlphaF(0.40); -- GitLab From 4398a90bfcab35834d0fd84c4e449456509089fb Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Wed, 11 Jun 2025 13:44:04 +0300 Subject: [PATCH 54/69] Make sure text is readable when clickHighlighted --- src/kitemviews/kitemlistwidget.cpp | 5 +++++ src/kitemviews/kitemlistwidget.h | 1 + src/kitemviews/kstandarditemlistwidget.cpp | 6 +++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index eb24a19dc8..0f15aa883b 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -605,6 +605,11 @@ void KItemListWidget::clearHoverCache() m_hoverCache = nullptr; } +bool KItemListWidget::isClickHighlighted() const +{ + return m_clickHighlighted; +} + void KItemListWidget::setClickHighlight(bool enabled) { if (m_clickHighlighted != enabled) { diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index ca0dc704b8..40b630cc4f 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -109,6 +109,7 @@ public: void setEnabledSelectionToggle(bool enabled); bool enabledSelectionToggle() const; + bool isClickHighlighted() const; void setClickHighlight(bool enabled); /** diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 46374d577b..1a2976bfeb 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -712,7 +712,11 @@ QFont KStandardItemListWidget::customizedFont(const QFont &baseFont) const QPalette::ColorRole KStandardItemListWidget::normalTextColorRole() const { - return QPalette::Text; + if (isClickHighlighted()) { + return QPalette::HighlightedText; + } else { + return QPalette::Text; + } } void KStandardItemListWidget::setTextColor(const QColor &color) -- GitLab From 71bcec57388d613955148b9d590c85ab977f978e Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 12 Jun 2025 18:03:53 +0300 Subject: [PATCH 55/69] widgetForDropPos uses hitTargetRect instead of contains --- src/kitemviews/kitemlistcontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 5222b9c957..cb97f484d3 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1490,7 +1490,7 @@ KItemListWidget *KItemListController::widgetForDropPos(const QPointF &pos) const const auto widgets = m_view->visibleItemListWidgets(); for (KItemListWidget *widget : widgets) { const QPointF mappedPos = widget->mapFromItem(m_view, pos); - if (widget->contains(mappedPos)) { + if (widget->hitTargetRect().contains(mappedPos)) { return widget; } } -- GitLab From 23d522fa8a4726f8b668419fa31fbac04e6e6a84 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 12 Jun 2025 18:03:53 +0300 Subject: [PATCH 56/69] change hitTargetRect comment --- src/kitemviews/kitemlistwidget.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 40b630cc4f..6e73bb72d5 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -180,7 +180,7 @@ public: virtual QRectF selectionRectExtended() const = 0; /** - * @return Rectangle where dragging the item is allowed to start. + * @return Returns rectangle where item is considered "hit" during actions, such as drag and drop. * In compact and icon views, it returns KItemListWidget::visualSelectionRect(). * In details view, it returns KItemListWidget::selectionRectCore(). */ -- GitLab From 105d70b4d6d5ae02305619cfd4fdb37b6048ddbd Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 12 Jun 2025 18:18:13 +0300 Subject: [PATCH 57/69] Remove selectionRectExtended --- src/kitemviews/kitemlistwidget.h | 5 ----- src/kitemviews/kstandarditemlistwidget.cpp | 17 +++++------------ src/kitemviews/kstandarditemlistwidget.h | 1 - 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 6e73bb72d5..2287683570 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -174,11 +174,6 @@ public: */ virtual QRectF selectionRectCore() const = 0; - /** - * @return Same as core, but extended to the full width of the details view. - */ - virtual QRectF selectionRectExtended() const = 0; - /** * @return Returns rectangle where item is considered "hit" during actions, such as drag and drop. * In compact and icon views, it returns KItemListWidget::visualSelectionRect(). diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 1a2976bfeb..3530677e83 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -537,7 +537,11 @@ QRectF KStandardItemListWidget::visualSelectionRect() const if (m_layout == DetailsLayout) { auto rect = selectionRectCore(); if (m_highlightEntireRow) { - rect = selectionRectExtended(); + if (layoutDirection() == Qt::LeftToRight) { + rect.setRight(leftPadding() + m_columnWidthSum); + } else { + rect.setLeft(size().width() - m_columnWidthSum - rightPadding()); + } } return rect.adjusted(-padding, 0, padding, 0); } else { @@ -554,17 +558,6 @@ QRectF KStandardItemListWidget::selectionRectCore() const return result; } -QRectF KStandardItemListWidget::selectionRectExtended() const -{ - QRectF result = selectionRectCore(); - if (layoutDirection() == Qt::LeftToRight) { - result.setRight(leftPadding() + m_columnWidthSum); - } else { - result.setLeft(size().width() - m_columnWidthSum - rightPadding()); - } - return result; -} - QRectF KStandardItemListWidget::hitTargetRect() const { if (m_layout == DetailsLayout) { diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index b9deed7454..a85e4ee11c 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -109,7 +109,6 @@ public: QRectF textFocusRect() const override; QRectF visualSelectionRect() const override; QRectF selectionRectCore() const override; - QRectF selectionRectExtended() const override; QRectF hitTargetRect() const override; QRectF expansionToggleRect() const override; QRectF selectionToggleRect() const override; -- GitLab From 18aec3429bc384e3fe8e80a95fb64e513d8d1442 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 12 Jun 2025 18:21:01 +0300 Subject: [PATCH 58/69] Rename visualSelectionRect to selectionRectFull --- src/kitemviews/kitemlistcontroller.cpp | 2 +- src/kitemviews/kitemlistview.cpp | 2 +- src/kitemviews/kitemlistwidget.cpp | 6 +++--- src/kitemviews/kitemlistwidget.h | 6 +++--- src/kitemviews/kstandarditemlistwidget.cpp | 6 +++--- src/kitemviews/kstandarditemlistwidget.h | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index cb97f484d3..66b5cb9696 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1370,7 +1370,7 @@ void KItemListController::slotRubberBandChanged() const QRectF widgetRect = m_view->itemRect(index); if (widgetRect.intersects(rubberBandRect)) { // Select the full row intersecting with the rubberband rectangle - const QRectF selectionRect = widget->visualSelectionRect().translated(widgetRect.topLeft()); + const QRectF selectionRect = widget->selectionRectFull().translated(widgetRect.topLeft()); if (selectionRect.intersects(rubberBandRect)) { selectedItems.insert(index); } diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 90f2beebb9..5394e7341e 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -542,7 +542,7 @@ QRectF KItemListView::itemContextRect(int index) const const KItemListWidget *widget = m_visibleItems.value(index); if (widget) { - contextRect = widget->visualSelectionRect(); + contextRect = widget->selectionRectFull(); contextRect.translate(itemRect(index).topLeft()); } diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 0f15aa883b..2abf9fe067 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -408,7 +408,7 @@ bool KItemListWidget::contains(const QPointF &point) const return false; } - return visualSelectionRect().contains(point) || expansionToggleRect().contains(point) || selectionToggleRect().contains(point); + return selectionRectFull().contains(point) || expansionToggleRect().contains(point) || selectionToggleRect().contains(point); } QRectF KItemListWidget::textFocusRect() const @@ -629,9 +629,9 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; // TODO: check if we're extended or not - viewItemOption.rect = visualSelectionRect().toRect(); + viewItemOption.rect = selectionRectFull().toRect(); QPainterPath path; - path.addRoundedRect(visualSelectionRect().adjusted(penWidth, penWidth, -penWidth, -penWidth), roundness, roundness); + path.addRoundedRect(selectionRectFull().adjusted(penWidth, penWidth, -penWidth, -penWidth), roundness, roundness); QColor backgroundColor{widget->palette().color(QPalette::Accent)}; painter->setRenderHint(QPainter::Antialiasing); bool current = m_current && styleState & QStyle::State_Active; diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 2287683570..f277e18a73 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -140,7 +140,7 @@ public: int iconSize() const; /** - * @return True if \a point is inside KItemListWidget::visualSelectionRect(), + * @return True if \a point is inside KItemListWidget::selectionRectFull(), * KItemListWidget::selectionToggleRect() * or KItemListWidget::expansionToggleRect(). * @reimp @@ -167,7 +167,7 @@ public: * * @return The rectangle around selection, depending on if it's full width or not. */ - virtual QRectF visualSelectionRect() const = 0; + virtual QRectF selectionRectFull() const = 0; /** * @return Rectangle around icon and it's text: The core area of the item. @@ -176,7 +176,7 @@ public: /** * @return Returns rectangle where item is considered "hit" during actions, such as drag and drop. - * In compact and icon views, it returns KItemListWidget::visualSelectionRect(). + * In compact and icon views, it returns KItemListWidget::selectionRectFull(). * In details view, it returns KItemListWidget::selectionRectCore(). */ virtual QRectF hitTargetRect() const = 0; diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 3530677e83..ba3465c041 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -530,7 +530,7 @@ QRectF KStandardItemListWidget::textFocusRect() const return m_textRect; } -QRectF KStandardItemListWidget::visualSelectionRect() const +QRectF KStandardItemListWidget::selectionRectFull() const { const_cast(this)->triggerCacheRefreshing(); const int padding = styleOption().padding; @@ -563,7 +563,7 @@ QRectF KStandardItemListWidget::hitTargetRect() const if (m_layout == DetailsLayout) { return selectionRectCore(); } else { - return visualSelectionRect(); + return selectionRectFull(); } } @@ -586,7 +586,7 @@ QRectF KStandardItemListWidget::selectionToggleRect() const } const int padding = styleOption().padding; - const QRectF selectionRectMinusPadding = visualSelectionRect().adjusted(padding, padding, -padding, -padding); + const QRectF selectionRectMinusPadding = selectionRectFull().adjusted(padding, padding, -padding, -padding); QPointF pos = selectionRectMinusPadding.topLeft(); if (QApplication::isRightToLeft()) { pos.setX(selectionRectMinusPadding.right() - (pos.x() + toggleSize - selectionRectMinusPadding.left())); diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index a85e4ee11c..f2b7a49438 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -107,7 +107,7 @@ public: QRectF textRect() const override; QRectF textFocusRect() const override; - QRectF visualSelectionRect() const override; + QRectF selectionRectFull() const override; QRectF selectionRectCore() const override; QRectF hitTargetRect() const override; QRectF expansionToggleRect() const override; -- GitLab From c1aba1674385f07858c51fc9d16376f4fab10066 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 12 Jun 2025 18:24:44 +0300 Subject: [PATCH 59/69] rename clickHighlight to isPressed, add comment, move items --- src/kitemviews/kitemlistcontroller.cpp | 6 +++--- src/kitemviews/kitemlistwidget.cpp | 4 ++-- src/kitemviews/kitemlistwidget.h | 7 ++++--- src/kitemviews/kstandarditemlistwidget.cpp | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 66b5cb9696..1729a65cba 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -676,7 +676,7 @@ bool KItemListController::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, con } for (KItemListWidget *widget : m_view->visibleItemListWidgets()) { - widget->setClickHighlight(false); + widget->setPressed(false); } if (m_view->m_tapAndHoldIndicator->isActive()) { @@ -1033,7 +1033,7 @@ bool KItemListController::hoverLeaveEvent(QGraphicsSceneHoverEvent *event, const const auto widgets = m_view->visibleItemListWidgets(); for (KItemListWidget *widget : widgets) { - widget->setClickHighlight(false); + widget->setPressed(false); if (widget->isHovered()) { widget->setHovered(false); Q_EMIT itemUnhovered(widget->index()); @@ -1734,7 +1734,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); if (leftClick) { - row->setClickHighlight(true); + row->setPressed(true); } if (rightClick && hitTargetIsRowEmptyRegion) { diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 2abf9fe067..a47f98ae18 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -605,12 +605,12 @@ void KItemListWidget::clearHoverCache() m_hoverCache = nullptr; } -bool KItemListWidget::isClickHighlighted() const +bool KItemListWidget::isPressed() const { return m_clickHighlighted; } -void KItemListWidget::setClickHighlight(bool enabled) +void KItemListWidget::setPressed(bool enabled) { if (m_clickHighlighted != enabled) { m_clickHighlighted = enabled; diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index f277e18a73..7e6b8f9c93 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -98,6 +98,10 @@ public: void setHovered(bool hovered); bool isHovered() const; + /** Sets a purely visual pressed highlight effect. */ + void setPressed(bool enabled); + bool isPressed() const; + void setExpansionAreaHovered(bool hover); bool expansionAreaHovered() const; @@ -109,9 +113,6 @@ public: void setEnabledSelectionToggle(bool enabled); bool enabledSelectionToggle() const; - bool isClickHighlighted() const; - void setClickHighlight(bool enabled); - /** * Sets the sibling information for the item and all of its parents. * The sibling information of the upper most parent is represented by diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index ba3465c041..3511666704 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -705,7 +705,7 @@ QFont KStandardItemListWidget::customizedFont(const QFont &baseFont) const QPalette::ColorRole KStandardItemListWidget::normalTextColorRole() const { - if (isClickHighlighted()) { + if (isPressed()) { return QPalette::HighlightedText; } else { return QPalette::Text; -- GitLab From 4af2e8ce7dfe422bfc79073e57aa0774b0bf62c0 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Thu, 12 Jun 2025 18:25:54 +0300 Subject: [PATCH 60/69] remove todo --- src/kitemviews/kitemlistwidget.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index a47f98ae18..3eb246e940 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -628,7 +628,6 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS viewItemOption.state = styleState; viewItemOption.viewItemPosition = QStyleOptionViewItem::OnlyOne; viewItemOption.showDecorationSelected = true; - // TODO: check if we're extended or not viewItemOption.rect = selectionRectFull().toRect(); QPainterPath path; path.addRoundedRect(selectionRectFull().adjusted(penWidth, penWidth, -penWidth, -penWidth), roundness, roundness); -- GitLab From 6e4705e98dc1f00cbcd6a51d3797a39a8e7bd1c4 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 13 Jun 2025 11:34:13 +0300 Subject: [PATCH 61/69] Remove hitTargetRect --- src/kitemviews/kitemlistcontroller.cpp | 7 +++++-- src/kitemviews/kitemlistwidget.h | 7 ------- src/kitemviews/kstandarditemlistwidget.cpp | 9 --------- src/kitemviews/kstandarditemlistwidget.h | 1 - 4 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 1729a65cba..1a11d4e882 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1490,7 +1490,7 @@ KItemListWidget *KItemListController::widgetForDropPos(const QPointF &pos) const const auto widgets = m_view->visibleItemListWidgets(); for (KItemListWidget *widget : widgets) { const QPointF mappedPos = widget->mapFromItem(m_view, pos); - if (widget->hitTargetRect().contains(mappedPos)) { + if (widget->selectionRectCore().contains(mappedPos)) { return widget; } } @@ -1728,7 +1728,10 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (m_pressedIndex.has_value()) { // The hover highlight area of an item is being pressed. const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); // anything outside of row.contains() will be the empty region of the row rect - const bool hitTargetIsRowEmptyRegion = !row->hitTargetRect().contains(row->mapFromItem(m_view, pos)); + + // When full row is highlighted, we want to be able to start dragging from anywhere except the core of the item. + const auto hitRect = m_view->highlightEntireRow() ? row->selectionRectCore() : row->selectionRectFull(); + const bool hitTargetIsRowEmptyRegion = !hitRect.contains(row->mapFromItem(m_view, pos)); // again, when this method returns false, a rubberBand selection is created as the event is not consumed; // createRubberBand here tells us whether to return true or false. bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 7e6b8f9c93..d75a4db549 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -175,13 +175,6 @@ public: */ virtual QRectF selectionRectCore() const = 0; - /** - * @return Returns rectangle where item is considered "hit" during actions, such as drag and drop. - * In compact and icon views, it returns KItemListWidget::selectionRectFull(). - * In details view, it returns KItemListWidget::selectionRectCore(). - */ - virtual QRectF hitTargetRect() const = 0; - /** * @return Rectangle for the selection-toggle that is used to select or deselect an item. * Per default an empty rectangle is returned which means that no selection-toggle diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 3511666704..0a2cfb5968 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -558,15 +558,6 @@ QRectF KStandardItemListWidget::selectionRectCore() const return result; } -QRectF KStandardItemListWidget::hitTargetRect() const -{ - if (m_layout == DetailsLayout) { - return selectionRectCore(); - } else { - return selectionRectFull(); - } -} - QRectF KStandardItemListWidget::expansionToggleRect() const { const_cast(this)->triggerCacheRefreshing(); diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index f2b7a49438..cabe3a8c96 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -109,7 +109,6 @@ public: QRectF textFocusRect() const override; QRectF selectionRectFull() const override; QRectF selectionRectCore() const override; - QRectF hitTargetRect() const override; QRectF expansionToggleRect() const override; QRectF selectionToggleRect() const override; QPixmap createDragPixmap(const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; -- GitLab From 7e05aa4ccc0121e415ed29dce09cbd116cd186f5 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Fri, 13 Jun 2025 19:17:19 +0300 Subject: [PATCH 62/69] Modify selectionRectCore to return fullRect unless dragging in details view --- src/kitemviews/kitemlistcontroller.cpp | 4 +--- src/kitemviews/kstandarditemlistwidget.cpp | 10 +++++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 1a11d4e882..2afcf212e6 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1729,9 +1729,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier // The hover highlight area of an item is being pressed. const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); // anything outside of row.contains() will be the empty region of the row rect - // When full row is highlighted, we want to be able to start dragging from anywhere except the core of the item. - const auto hitRect = m_view->highlightEntireRow() ? row->selectionRectCore() : row->selectionRectFull(); - const bool hitTargetIsRowEmptyRegion = !hitRect.contains(row->mapFromItem(m_view, pos)); + const bool hitTargetIsRowEmptyRegion = !row->selectionRectCore().contains(row->mapFromItem(m_view, pos)); // again, when this method returns false, a rubberBand selection is created as the event is not consumed; // createRubberBand here tells us whether to return true or false. bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 0a2cfb5968..d078b06573 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -535,7 +535,7 @@ QRectF KStandardItemListWidget::selectionRectFull() const const_cast(this)->triggerCacheRefreshing(); const int padding = styleOption().padding; if (m_layout == DetailsLayout) { - auto rect = selectionRectCore(); + auto rect = m_iconRect | m_textRect; if (m_highlightEntireRow) { if (layoutDirection() == Qt::LeftToRight) { rect.setRight(leftPadding() + m_columnWidthSum); @@ -554,8 +554,12 @@ QRectF KStandardItemListWidget::selectionRectFull() const QRectF KStandardItemListWidget::selectionRectCore() const { - QRectF result = m_iconRect | m_textRect; - return result; + // Allow dragging from selection area in details view. + if (m_layout == DetailsLayout && highlightEntireRow() && !isSelected()) { + QRectF result = m_iconRect | m_textRect; + return result; + } + return selectionRectFull(); } QRectF KStandardItemListWidget::expansionToggleRect() const -- GitLab From bf8220e6bac6d4f0148c465af012ff98f16ff73e Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 16 Jun 2025 11:07:05 +0300 Subject: [PATCH 63/69] Remove unneeded check --- src/kitemviews/kitemlistcontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 2afcf212e6..10edf64a66 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1764,7 +1764,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier // We rule out the latter, if the item is not clicked directly and was unselected previously. const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); const auto mappedPos = row->mapFromItem(m_view, pos); - if (!row->selectionRectCore().contains(mappedPos) && !pressedItemAlreadySelected) { + if (!row->selectionRectCore().contains(mappedPos)) { createRubberBand = true; } else { m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Toggle); -- GitLab From bc5a187f34f1566a7b5f7dacaac851519dfe17c1 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 16 Jun 2025 11:07:48 +0300 Subject: [PATCH 64/69] add const back --- src/kitemviews/kitemlistcontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 10edf64a66..96f34f1a11 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1364,7 +1364,7 @@ void KItemListController::slotRubberBandChanged() // Select all visible items that intersect with the rubberband const auto widgets = m_view->visibleItemListWidgets(); - for (KItemListWidget *widget : widgets) { + for (const KItemListWidget *widget : widgets) { const int index = widget->index(); const QRectF widgetRect = m_view->itemRect(index); -- GitLab From 73977c43f0a6c6d82f5fc8992132138402be8f32 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 16 Jun 2025 11:09:09 +0300 Subject: [PATCH 65/69] remove selectionToggleRect check --- src/kitemviews/kitemlistwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 3eb246e940..c06e46339f 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -408,7 +408,7 @@ bool KItemListWidget::contains(const QPointF &point) const return false; } - return selectionRectFull().contains(point) || expansionToggleRect().contains(point) || selectionToggleRect().contains(point); + return selectionRectFull().contains(point) || expansionToggleRect().contains(point); } QRectF KItemListWidget::textFocusRect() const -- GitLab From 0f477b912347b5661add69dc5a8cf9ee44ecdbfb Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 16 Jun 2025 11:11:24 +0300 Subject: [PATCH 66/69] remove presseditemalreadyselected check --- src/kitemviews/kitemlistcontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 96f34f1a11..5f668ce3ab 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1666,7 +1666,7 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier if (selectedItemsCount > 1 && m_pressedIndex.has_value()) { const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); const auto mappedPos = row->mapFromItem(m_view, pos); - if (pressedItemAlreadySelected || row->selectionRectCore().contains(mappedPos)) { + if (row->selectionRectCore().contains(mappedPos)) { // we are indeed inside the text/icon rect, keep m_pressedIndex what it is // and short-circuit for single-click activation (it will then propagate to onRelease and activate the item) // or we just keep going for double-click activation -- GitLab From 60a92ae27e28c162fd3f4a926b4b00b818134151 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 16 Jun 2025 11:16:09 +0300 Subject: [PATCH 67/69] add setPressed with more than one selection --- src/kitemviews/kitemlistcontroller.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 5f668ce3ab..fdde48abcd 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1681,6 +1681,9 @@ bool KItemListController::onPress(const QPointF &pos, const Qt::KeyboardModifier m_selectionManager->setSelected(m_pressedIndex.value(), 1, KItemListSelectionManager::Toggle); } } + if (leftClick) { + row->setPressed(true); + } return true; // event handled, don't create rubber band } } else { -- GitLab From b3e1a4918e7165c3a19f5a9188e45ec6371fd9fa Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 16 Jun 2025 11:19:48 +0300 Subject: [PATCH 68/69] set itemContextRect to selectionRectCore --- src/kitemviews/kitemlistview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 5394e7341e..3ed4df3e7b 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -542,7 +542,7 @@ QRectF KItemListView::itemContextRect(int index) const const KItemListWidget *widget = m_visibleItems.value(index); if (widget) { - contextRect = widget->selectionRectFull(); + contextRect = widget->selectionRectCore(); contextRect.translate(itemRect(index).topLeft()); } -- GitLab From 65b8c32380f9a7f8a8bf0296adfea9c976682b57 Mon Sep 17 00:00:00 2001 From: Akseli Lahtinen Date: Mon, 16 Jun 2025 11:20:34 +0300 Subject: [PATCH 69/69] fix doc --- src/kitemviews/kitemlistwidget.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index d75a4db549..b87a3b34e6 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -166,12 +166,12 @@ public: * Used for drawing the visuals, and situations where we want the behavior of the * selection to match the visuals. * - * @return The rectangle around selection, depending on if it's full width or not. + * @return The rectangle around selection. */ virtual QRectF selectionRectFull() const = 0; /** - * @return Rectangle around icon and it's text: The core area of the item. + * @return The core area of the item. All of it reacts exactly the same way to mouse clicks. */ virtual QRectF selectionRectCore() const = 0; -- GitLab