diff options
| author | Frank Reininghaus <[email protected]> | 2011-08-14 17:20:33 +0200 |
|---|---|---|
| committer | Frank Reininghaus <[email protected]> | 2011-08-14 17:21:18 +0200 |
| commit | 2476f632de00829425f458462c3b16ea661dfe2f (patch) | |
| tree | 216926d10f61207e7a263635183ffb05340b6c65 | |
| parent | a7060e6fec46c859000fe963ddf1f8381246741d (diff) | |
Keep the current item visible in the view
| -rw-r--r-- | src/kitemviews/kitemlistcontainer.cpp | 5 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 26 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.h | 1 |
3 files changed, 32 insertions, 0 deletions
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<int>& current, const QSet<int>& 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); |
