X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d34036152b86d86d1dabe2d719d5abe1e6f205a5..3ea9e54081c68d909318971e89f0a37c445fefd6:/src/dolphinviewautoscroller.cpp diff --git a/src/dolphinviewautoscroller.cpp b/src/dolphinviewautoscroller.cpp index 4e7af7f59..45896a5eb 100644 --- a/src/dolphinviewautoscroller.cpp +++ b/src/dolphinviewautoscroller.cpp @@ -20,7 +20,7 @@ #include "dolphinviewautoscroller.h" #include -#include +#include #include #include #include @@ -31,13 +31,17 @@ DolphinViewAutoScroller::DolphinViewAutoScroller(QAbstractItemView* parent) : QObject(parent), m_rubberBandSelection(false), + m_keyPressed(false), + m_initializedTimestamp(false), m_horizontalScrollInc(0), m_verticalScrollInc(0), m_itemView(parent), - m_timer(0) + m_timer(0), + m_timestamp() { m_itemView->setAutoScroll(false); m_itemView->viewport()->installEventFilter(this); + m_itemView->installEventFilter(this); m_timer = new QTimer(this); m_timer->setSingleShot(false); @@ -54,6 +58,18 @@ bool DolphinViewAutoScroller::isActive() const return m_timer->isActive(); } +void DolphinViewAutoScroller::handleCurrentIndexChange(const QModelIndex& current, + const QModelIndex& previous) +{ + // When the autoscroller is inactive and a key has been pressed, it must be + // assured that the current item stays visible. The check whether the previous + // item is valid is important because of #197951. The keypress check is done + // because of #199833. + if (current.isValid() && (previous.isValid() || m_keyPressed) && !isActive()) { + m_itemView->scrollTo(current); + } +} + bool DolphinViewAutoScroller::eventFilter(QObject* watched, QEvent* event) { if (watched == m_itemView->viewport()) { @@ -87,6 +103,19 @@ bool DolphinViewAutoScroller::eventFilter(QObject* watched, QEvent* event) stopAutoScroll(); break; + default: + break; + } + } else if (watched == m_itemView) { + switch (event->type()) { + case QEvent::KeyPress: + m_keyPressed = true; + break; + + case QEvent::KeyRelease: + m_keyPressed = false; + break; + default: break; } @@ -97,6 +126,10 @@ bool DolphinViewAutoScroller::eventFilter(QObject* watched, QEvent* event) void DolphinViewAutoScroller::scrollViewport() { + if (m_timestamp.elapsed() < QApplication::startDragTime()) { + return; + } + QScrollBar* verticalScrollBar = m_itemView->verticalScrollBar(); if (verticalScrollBar != 0) { const int value = verticalScrollBar->value(); @@ -116,7 +149,7 @@ void DolphinViewAutoScroller::scrollViewport() // update the rubberband. QWidget* viewport = m_itemView->viewport(); const QPoint pos = viewport->mapFromGlobal(QCursor::pos()); - QMouseEvent event(QEvent::MouseMove, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent event(QEvent::MouseMove, pos, Qt::LeftButton, Qt::LeftButton, QApplication::keyboardModifiers()); QCoreApplication::sendEvent(viewport, &event); } } @@ -129,6 +162,7 @@ void DolphinViewAutoScroller::triggerAutoScroll() m_itemView->horizontalScrollBar()->isVisible(); if (!verticalScrolling && !horizontalScrolling) { // no scrollbars are shown at all, so no autoscrolling is necessary + stopAutoScroll(); return; } @@ -143,9 +177,13 @@ void DolphinViewAutoScroller::triggerAutoScroll() if (m_timer->isActive()) { if ((m_horizontalScrollInc == 0) && (m_verticalScrollInc == 0)) { - m_timer->stop(); + stopAutoScroll(); } } else if ((m_horizontalScrollInc != 0) || (m_verticalScrollInc != 0)) { + if (!m_initializedTimestamp) { + m_initializedTimestamp = true; + m_timestamp.start(); + } m_timer->start(); } } @@ -155,6 +193,7 @@ void DolphinViewAutoScroller::stopAutoScroll() m_timer->stop(); m_horizontalScrollInc = 0; m_verticalScrollInc = 0; + m_initializedTimestamp = false; } int DolphinViewAutoScroller::calculateScrollIncrement(int cursorPos, int rangeSize) const @@ -167,12 +206,12 @@ int DolphinViewAutoScroller::calculateScrollIncrement(int cursorPos, int rangeSi const int autoScrollBorder = 64; if (cursorPos < autoScrollBorder) { - inc = -minSpeed + fabs(cursorPos - autoScrollBorder) * (cursorPos - autoScrollBorder) / speedLimiter; + inc = -minSpeed + qAbs(cursorPos - autoScrollBorder) * (cursorPos - autoScrollBorder) / speedLimiter; if (inc < -maxSpeed) { inc = -maxSpeed; } } else if (cursorPos > rangeSize - autoScrollBorder) { - inc = minSpeed + fabs(cursorPos - rangeSize + autoScrollBorder) * (cursorPos - rangeSize + autoScrollBorder) / speedLimiter; + inc = minSpeed + qAbs(cursorPos - rangeSize + autoScrollBorder) * (cursorPos - rangeSize + autoScrollBorder) / speedLimiter; if (inc > maxSpeed) { inc = maxSpeed; }