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
This commit is contained in:
Amol Godbole 2023-10-13 21:08:35 -05:00 committed by Méven Car
parent d1035e7f09
commit a59d9f85fa
4 changed files with 57 additions and 17 deletions

View file

@ -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);
}
}

View file

@ -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 {
if (currentRect.left() < viewGeometry.left()) {
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();
} else if (currentRect.right() > viewGeometry.right()) {
}
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;
default:
Q_UNREACHABLE();
}
}
if (newOffset != scrollOffset()) {
Q_EMIT scrollTo(newOffset);
return;
}
if (newOffset != scrollOffset()) {
Q_EMIT scrollTo(newOffset);
return;
}
Q_EMIT scrollingStopped();

View file

@ -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

View file

@ -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();