┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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();