From: Frank Reininghaus Date: Sun, 14 Aug 2011 15:20:33 +0000 (+0200) Subject: Keep the current item visible in the view X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/2476f632de00829425f458462c3b16ea661dfe2f Keep the current item visible in the view --- diff --git a/src/kitemviews/kitemlistcontainer.cpp b/src/kitemviews/kitemlistcontainer.cpp index 28e526a6f..b8d05dc34 100644 --- a/src/kitemviews/kitemlistcontainer.cpp +++ b/src/kitemviews/kitemlistcontainer.cpp @@ -267,6 +267,11 @@ void KItemListContainer::updateScrollBars() scrollBar->setMaximum(maximum); scrollBar->setValue(value); + disconnect(view, SIGNAL(scrollTo(int)), + otherScrollBar, SLOT(setValue(int))); + connect(view, SIGNAL(scrollTo(int)), + scrollBar, SLOT(setValue(int))); + // Make sure that the other scroll bar is hidden otherScrollBar->setMaximum(0); otherScrollBar->setValue(0); diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 3c3439552..81b46b1d2 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -611,6 +611,32 @@ void KItemListView::slotCurrentChanged(int current, int previous) Q_ASSERT(!currentWidget->isCurrent()); currentWidget->setCurrent(true); } + + const QRectF viewGeometry = geometry(); + const QRectF currentBoundingRect = itemBoundingRect(current); + + if (!viewGeometry.contains(currentBoundingRect)) { + // Make sure that the new current item is fully visible in the view. + qreal newOffset = offset(); + if (currentBoundingRect.top() < viewGeometry.top()) { + Q_ASSERT(scrollOrientation() == Qt::Vertical); + newOffset += currentBoundingRect.top() - viewGeometry.top(); + } + else if ((currentBoundingRect.bottom() > viewGeometry.bottom())) { + Q_ASSERT(scrollOrientation() == Qt::Vertical); + newOffset += currentBoundingRect.bottom() - viewGeometry.bottom(); + } + else if (currentBoundingRect.left() < viewGeometry.left()) { + Q_ASSERT(scrollOrientation() == Qt::Horizontal); + newOffset += currentBoundingRect.left() - viewGeometry.left(); + } + else if ((currentBoundingRect.right() > viewGeometry.right())) { + Q_ASSERT(scrollOrientation() == Qt::Horizontal); + newOffset += currentBoundingRect.right() - viewGeometry.right(); + } + + emit scrollTo(newOffset); + } } void KItemListView::slotSelectionChanged(const QSet& current, const QSet& previous) diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 47426b5fa..974a9baaf 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -145,6 +145,7 @@ public: signals: void offsetChanged(int current, int previous); void maximumOffsetChanged(int current, int previous); + void scrollTo(int newOffset); protected: virtual void initializeItemListWidget(KItemListWidget* item);