diff --git a/roles/kde/patches/dolphin/patches.txt b/roles/kde/patches/dolphin/patches.txt deleted file mode 100644 index a7f0a2a..0000000 --- a/roles/kde/patches/dolphin/patches.txt +++ /dev/null @@ -1,3 +0,0 @@ -Gear 25.08.0: - -Pr 946 https://invent.kde.org/system/dolphin/-/merge_requests/946 diff --git a/roles/kde/patches/dolphin/pr946.patch b/roles/kde/patches/dolphin/pr946.patch deleted file mode 100644 index f01f4bd..0000000 --- a/roles/kde/patches/dolphin/pr946.patch +++ /dev/null @@ -1,3978 +0,0 @@ -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 -