diff options
| author | Peter Penz <[email protected]> | 2011-08-27 20:12:03 +0200 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2011-08-27 20:13:22 +0200 |
| commit | d99d5fbea76a79346761c0d8ce98a0719e5790d2 (patch) | |
| tree | 50b944a3adf3e4533003d91df16f3b19bb636412 /src/kitemviews/kitemlistview.cpp | |
| parent | 4905667ada4ddd0aee3d2bb077e401a4262804b9 (diff) | |
Improve the autoscrolling for the rubberband selection
This modifications will also allow to do an autoscrolling in an
easy way for drag and drop operations (not fully implemented yet).
Diffstat (limited to 'src/kitemviews/kitemlistview.cpp')
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 82 |
1 files changed, 59 insertions, 23 deletions
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 3435e3f65..a35752a47 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -43,7 +43,6 @@ KItemListView::KItemListView(QGraphicsWidget* parent) : QGraphicsWidget(parent), - m_autoScrollMarginEnabled(false), m_grouped(false), m_activeTransactions(0), m_itemSize(), @@ -62,8 +61,10 @@ KItemListView::KItemListView(QGraphicsWidget* parent) : m_layoutTimer(0), m_oldOffset(0), m_oldMaximumOffset(0), + m_skipAutoScrollForRubberBand(false), m_rubberBand(0), - m_mousePos() + m_mousePos(), + m_autoScrollTimer(0) { setAcceptHoverEvents(true); @@ -193,6 +194,26 @@ QHash<QByteArray, int> KItemListView::visibleRoles() const return m_visibleRoles; } +void KItemListView::setAutoScroll(bool enabled) +{ + if (enabled && !m_autoScrollTimer) { + m_autoScrollTimer = new QTimer(this); + m_autoScrollTimer->setInterval(1000 / 60); // 60 frames per second + m_autoScrollTimer->setSingleShot(false); + connect(m_autoScrollTimer, SIGNAL(timeout()), this, SLOT(triggerAutoScrolling())); + m_autoScrollTimer->start(); + } else if (!enabled && m_autoScrollTimer) { + delete m_autoScrollTimer; + m_autoScrollTimer = 0; + } + +} + +bool KItemListView::autoScroll() const +{ + return m_autoScrollTimer != 0; +} + KItemListController* KItemListView::controller() const { return m_controller; @@ -463,6 +484,10 @@ void KItemListView::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { m_mousePos = transform().map(event->pos()); QGraphicsWidget::mouseMoveEvent(event); + + if (m_autoScrollTimer && !m_autoScrollTimer->isActive()) { + m_autoScrollTimer->start(); + } } void KItemListView::dragEnterEvent(QGraphicsSceneDragDropEvent* event) @@ -755,29 +780,21 @@ void KItemListView::slotLayoutTimerFinished() doLayout(Animation, 0, 0); } -void KItemListView::slotRubberBandStartPosChanged() +void KItemListView::slotRubberBandPosChanged() { update(); } -void KItemListView::slotRubberBandEndPosChanged() -{ - // The autoscrolling is triggered asynchronously otherwise it - // might be possible to have an endless recursion: The autoscrolling - // might adjust the position which might result in updating the - // rubberband end-position. - QTimer::singleShot(0, this, SLOT(triggerAutoScrolling())); - update(); -} - void KItemListView::slotRubberBandActivationChanged(bool active) { if (active) { - connect(m_rubberBand, SIGNAL(startPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandStartPosChanged())); - connect(m_rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandEndPosChanged())); + connect(m_rubberBand, SIGNAL(startPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandPosChanged())); + connect(m_rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandPosChanged())); + m_skipAutoScrollForRubberBand = true; } else { - disconnect(m_rubberBand, SIGNAL(startPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandStartPosChanged())); - disconnect(m_rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandEndPosChanged())); + disconnect(m_rubberBand, SIGNAL(startPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandPosChanged())); + disconnect(m_rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandPosChanged())); + m_skipAutoScrollForRubberBand = false; } update(); @@ -785,6 +802,10 @@ void KItemListView::slotRubberBandActivationChanged(bool active) void KItemListView::triggerAutoScrolling() { + if (!m_autoScrollTimer) { + return; + } + int pos = 0; int visibleSize = 0; if (scrollOrientation() == Qt::Vertical) { @@ -797,13 +818,17 @@ void KItemListView::triggerAutoScrolling() const int inc = calculateAutoScrollingIncrement(pos, visibleSize); if (inc == 0) { - // The mouse position is not above an autoscroll margin + // The mouse position is not above an autoscroll margin (the autoscroll timer + // will be restarted in mouseMoveEvent()) + m_autoScrollTimer->stop(); return; } - if (m_rubberBand->isActive()) { + if (m_rubberBand->isActive() && m_skipAutoScrollForRubberBand) { // If a rubberband selection is ongoing the autoscrolling may only get triggered - // if the direction of the rubberband is similar to the autoscroll direction. + // if the direction of the rubberband is similar to the autoscroll direction. This + // prevents that starting to create a rubberband within the autoscroll margins starts + // an autoscrolling. const qreal minDiff = 4; // Ignore any autoscrolling if the rubberband is very small const qreal diff = (scrollOrientation() == Qt::Vertical) @@ -812,11 +837,22 @@ void KItemListView::triggerAutoScrolling() if (qAbs(diff) < minDiff || (inc < 0 && diff > 0) || (inc > 0 && diff < 0)) { // The rubberband direction is different from the scroll direction (e.g. the rubberband has // been moved up although the autoscroll direction might be down) + m_autoScrollTimer->stop(); return; } } - emit scrollTo(offset() + inc); + // As soon as the autoscrolling has been triggered at least once despite having an active rubberband, + // the autoscrolling may not get skipped anymore until a new rubberband is created + m_skipAutoScrollForRubberBand = false; + + setOffset(offset() + inc); + + if (!m_autoScrollTimer->isActive()) { + // Trigger the autoscroll timer which will periodically call + // triggerAutoScrolling() + m_autoScrollTimer->start(); + } } void KItemListView::setController(KItemListController* controller) @@ -1230,8 +1266,8 @@ int KItemListView::calculateAutoScrollingIncrement(int pos, int size) int inc = 0; const int minSpeed = 4; - const int maxSpeed = 768; - const int speedLimiter = 48; + const int maxSpeed = 128; + const int speedLimiter = 96; const int autoScrollBorder = 64; if (pos < autoScrollBorder) { |
