┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEugene Popov <[email protected]>2024-03-20 23:35:48 +0200
committerMéven Car <[email protected]>2024-03-23 09:30:29 +0000
commitb3ac8d783bd2df15014b848657fbe601e7575f38 (patch)
treedb2e603d8c9823292daf260dee9f15f8cae587f0 /src
parent325380ffd1e16249b84e2684e12af64a0a6e2a71 (diff)
KItemListView: Improve scrollToItem()
Prevent an item with a long name from scrolling to the right edge when navigating in Compact View mode.
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/kitemlistview.cpp118
1 files changed, 69 insertions, 49 deletions
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 89376ab20..f906b7a13 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -553,61 +553,81 @@ void KItemListView::scrollToItem(int index, ViewItemPosition viewItemPosition)
// Fix for Bug 311099 - View the underscore when using Ctrl + PageDown
currentRect.adjust(-m_styleOption.horizontalMargin, -m_styleOption.verticalMargin, m_styleOption.horizontalMargin, m_styleOption.verticalMargin);
- qreal newOffset = scrollOffset();
- if (scrollOrientation() == Qt::Vertical && (currentRect.top() < viewGeometry.top() || currentRect.bottom() > viewGeometry.bottom())) {
- switch (viewItemPosition) {
- case Beginning:
- newOffset += currentRect.top() - viewGeometry.top();
- break;
- case Middle:
- newOffset += 0.5 * (currentRect.top() + currentRect.bottom() - (viewGeometry.top() + viewGeometry.bottom()));
- break;
- case End:
- newOffset += currentRect.bottom() - viewGeometry.bottom();
- break;
- case Nearest:
- if (currentRect.top() < viewGeometry.top()) {
- newOffset += currentRect.top() - viewGeometry.top();
- } else {
- newOffset += currentRect.bottom() - viewGeometry.bottom();
+ qreal offset = 0;
+ switch (scrollOrientation()) {
+ case Qt::Vertical:
+ if (currentRect.top() < viewGeometry.top() || currentRect.bottom() > viewGeometry.bottom()) {
+ switch (viewItemPosition) {
+ case Beginning:
+ offset = currentRect.top() - viewGeometry.top();
+ break;
+ case Middle:
+ offset = 0.5 * (currentRect.top() + currentRect.bottom() - (viewGeometry.top() + viewGeometry.bottom()));
+ break;
+ case End:
+ offset = currentRect.bottom() - viewGeometry.bottom();
+ break;
+ case Nearest:
+ if (currentRect.top() < viewGeometry.top()) {
+ offset = currentRect.top() - viewGeometry.top();
+ }
+ if (currentRect.bottom() > viewGeometry.bottom() + offset) {
+ offset += currentRect.bottom() - viewGeometry.bottom() - offset;
+ }
+ break;
+ default:
+ Q_UNREACHABLE();
}
- break;
- default:
- Q_UNREACHABLE();
}
- } else if (scrollOrientation() == Qt::Horizontal && (currentRect.left() < viewGeometry.left() || currentRect.right() > viewGeometry.right())) {
- switch (viewItemPosition) {
- case Beginning:
- if (layoutDirection() == Qt::RightToLeft) {
- newOffset += currentRect.right() - viewGeometry.right();
- } else {
- newOffset += currentRect.left() - viewGeometry.left();
- }
- break;
- case Middle:
- newOffset += 0.5 * (currentRect.left() + currentRect.right() - (viewGeometry.left() + viewGeometry.right()));
- break;
- case End:
- if (layoutDirection() == Qt::RightToLeft) {
- newOffset += currentRect.left() - viewGeometry.left();
- } else {
- newOffset += currentRect.right() - viewGeometry.right();
- }
- break;
- case Nearest:
- if (currentRect.left() < viewGeometry.left()) {
- newOffset += currentRect.left() - viewGeometry.left();
- } else {
- newOffset += currentRect.right() - viewGeometry.right();
+ break;
+ case Qt::Horizontal:
+ if (currentRect.left() < viewGeometry.left() || currentRect.right() > viewGeometry.right()) {
+ switch (viewItemPosition) {
+ case Beginning:
+ if (layoutDirection() == Qt::RightToLeft) {
+ offset = currentRect.right() - viewGeometry.right();
+ } else {
+ offset = currentRect.left() - viewGeometry.left();
+ }
+ break;
+ case Middle:
+ offset = 0.5 * (currentRect.left() + currentRect.right() - (viewGeometry.left() + viewGeometry.right()));
+ break;
+ case End:
+ if (layoutDirection() == Qt::RightToLeft) {
+ offset = currentRect.left() - viewGeometry.left();
+ } else {
+ offset = currentRect.right() - viewGeometry.right();
+ }
+ break;
+ case Nearest:
+ if (layoutDirection() == Qt::RightToLeft) {
+ if (currentRect.left() < viewGeometry.left()) {
+ offset = currentRect.left() - viewGeometry.left();
+ }
+ if (currentRect.right() > viewGeometry.right() + offset) {
+ offset += currentRect.right() - viewGeometry.right() - offset;
+ }
+ } else {
+ if (currentRect.right() > viewGeometry.right()) {
+ offset = currentRect.right() - viewGeometry.right();
+ }
+ if (currentRect.left() < viewGeometry.left() + offset) {
+ offset += currentRect.left() - viewGeometry.left() - offset;
+ }
+ }
+ break;
+ default:
+ Q_UNREACHABLE();
}
- break;
- default:
- Q_UNREACHABLE();
}
+ break;
+ default:
+ Q_UNREACHABLE();
}
- if (newOffset != scrollOffset()) {
- Q_EMIT scrollTo(newOffset);
+ if (!qFuzzyIsNull(offset)) {
+ Q_EMIT scrollTo(scrollOffset() + offset);
return;
}