┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2011-08-14 17:20:33 +0200
committerFrank Reininghaus <[email protected]>2011-08-14 17:21:18 +0200
commit2476f632de00829425f458462c3b16ea661dfe2f (patch)
tree216926d10f61207e7a263635183ffb05340b6c65
parenta7060e6fec46c859000fe963ddf1f8381246741d (diff)
Keep the current item visible in the view
-rw-r--r--src/kitemviews/kitemlistcontainer.cpp5
-rw-r--r--src/kitemviews/kitemlistview.cpp26
-rw-r--r--src/kitemviews/kitemlistview.h1
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);