┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAmol Godbole <[email protected]>2023-10-13 21:08:35 -0500
committerMéven Car <[email protected]>2023-10-17 15:47:34 +0000
commita59d9f85fa770a00d10e66025e102c736e18fa70 (patch)
tree9f19443512de2c0adc1fa75082ba27495188ca3f /src
parentd1035e7f090a5c810e72e37a03df81b2a4389747 (diff)
KItemListView: add view position in scrollToItem()
An item, on being scrolled to, is always located at the nearest edge of the view. This is not always convenient. Allow specifying where the item should be positioned with respect to the view in scrollToItem(). BUG: 423884
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp2
-rw-r--r--src/kitemviews/kitemlistview.cpp60
-rw-r--r--src/kitemviews/kitemlistview.h8
-rw-r--r--src/views/dolphinview.cpp2
4 files changed, 56 insertions, 16 deletions
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index be7a63e09..0016bb22a 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -539,7 +539,7 @@ void KItemListController::slotChangeCurrentItem(const QString &text, bool search
m_selectionManager->beginAnchoredSelection(index);
}
- m_view->scrollToItem(index);
+ m_view->scrollToItem(index, KItemListView::ViewItemPosition::Beginning);
}
}
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 457c02ec5..be22b91cc 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -537,7 +537,7 @@ bool KItemListView::isElided(int index) const
return m_sizeHintResolver->isElided(index);
}
-void KItemListView::scrollToItem(int index)
+void KItemListView::scrollToItem(int index, ViewItemPosition viewItemPosition)
{
QRectF viewGeometry = geometry();
if (m_headerWidget->isVisible()) {
@@ -546,29 +546,65 @@ void KItemListView::scrollToItem(int index)
}
QRectF currentRect = itemRect(index);
- // Fix for Bug 311099 - View the underscore when using Ctrl + PagDown
+ // 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);
- if (!viewGeometry.contains(currentRect)) {
- qreal newOffset = scrollOffset();
- if (scrollOrientation() == Qt::Vertical) {
+ 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 if (currentRect.bottom() > viewGeometry.bottom()) {
+ } else {
newOffset += currentRect.bottom() - viewGeometry.bottom();
}
- } else {
+ 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 if (currentRect.right() > viewGeometry.right()) {
+ } else {
newOffset += currentRect.right() - viewGeometry.right();
}
+ break;
+ default:
+ Q_UNREACHABLE();
}
+ }
- if (newOffset != scrollOffset()) {
- Q_EMIT scrollTo(newOffset);
- return;
- }
+ if (newOffset != scrollOffset()) {
+ Q_EMIT scrollTo(newOffset);
+ return;
}
Q_EMIT scrollingStopped();
diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h
index 7bcaec704..8812eb8cc 100644
--- a/src/kitemviews/kitemlistview.h
+++ b/src/kitemviews/kitemlistview.h
@@ -59,6 +59,9 @@ class DOLPHIN_EXPORT KItemListView : public QGraphicsWidget
Q_PROPERTY(qreal itemOffset READ itemOffset WRITE setItemOffset NOTIFY itemOffsetChanged)
public:
+ /** The position in the view to which an item should be scrolled to. */
+ enum ViewItemPosition { Beginning, Middle, End, Nearest };
+
explicit KItemListView(QGraphicsWidget *parent = nullptr);
~KItemListView() override;
@@ -251,9 +254,10 @@ public:
/**
* Scrolls to the item with the index \a index so that the item
- * will be fully visible.
+ * will be fully visible. The item is positioned within the view
+ * as specified by \a viewItemPosition.
*/
- void scrollToItem(int index);
+ void scrollToItem(int index, ViewItemPosition viewItemPosition = ViewItemPosition::Nearest);
/**
* If several properties of KItemListView are changed synchronously, it is
diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp
index ace763b15..0a1d70bf1 100644
--- a/src/views/dolphinview.cpp
+++ b/src/views/dolphinview.cpp
@@ -1761,7 +1761,7 @@ void DolphinView::updateViewState()
// scroll to current item and reset the state
if (m_scrollToCurrentItem) {
- m_view->scrollToItem(currentIndex);
+ m_view->scrollToItem(currentIndex, KItemListView::ViewItemPosition::Middle);
m_scrollToCurrentItem = false;
}
m_currentItemUrl = QUrl();