DolphinViewAutoScroller::DolphinViewAutoScroller(QAbstractItemView* parent) :
QObject(parent),
m_rubberBandSelection(false),
- m_scrollInc(0),
+ m_horizontalScrollInc(0),
+ m_verticalScrollInc(0),
m_itemView(parent),
m_timer()
{
m_itemView->setAutoScroll(false);
m_itemView->viewport()->installEventFilter(this);
- m_itemView->installEventFilter(this);
-
+
m_timer = new QTimer(this);
m_timer->setSingleShot(false);
m_timer->setInterval(1000 / 25); // 25 frames per second
{
}
+bool DolphinViewAutoScroller::isActive() const
+{
+ return m_timer->isActive();
+}
+
bool DolphinViewAutoScroller::eventFilter(QObject* watched, QEvent* event)
{
if (watched == m_itemView->viewport()) {
m_rubberBandSelection = true;
}
break;
-
+
case QEvent::MouseMove:
if (m_rubberBandSelection) {
triggerAutoScroll();
}
break;
-
+
case QEvent::MouseButtonRelease:
m_rubberBandSelection = false;
stopAutoScroll();
break;
-
+
case QEvent::DragEnter:
case QEvent::DragMove:
m_rubberBandSelection = false;
triggerAutoScroll();
break;
-
+
case QEvent::Drop:
case QEvent::DragLeave:
m_rubberBandSelection = false;
stopAutoScroll();
break;
-
- default:
- break;
- }
- } else if ((watched == m_itemView) && (event->type() == QEvent::KeyPress)) {
- switch (static_cast<QKeyEvent*>(event)->key()) {
- case Qt::Key_Up:
- case Qt::Key_Down:
- case Qt::Key_Left:
- case Qt::Key_Right:
- case Qt::Key_PageUp:
- case Qt::Key_PageDown:
- case Qt::Key_Home:
- case Qt::Key_End:
- QMetaObject::invokeMethod(this, "scrollToCurrentIndex", Qt::QueuedConnection);
- break;
+
default:
break;
}
- }
-
+ }
return QObject::eventFilter(watched, event);
}
QScrollBar* verticalScrollBar = m_itemView->verticalScrollBar();
if (verticalScrollBar != 0) {
const int value = verticalScrollBar->value();
- verticalScrollBar->setValue(value + m_scrollInc);
-
+ verticalScrollBar->setValue(value + m_verticalScrollInc);
+
}
QScrollBar* horizontalScrollBar = m_itemView->horizontalScrollBar();
if (horizontalScrollBar != 0) {
const int value = horizontalScrollBar->value();
- horizontalScrollBar->setValue(value + m_scrollInc);
-
+ horizontalScrollBar->setValue(value + m_horizontalScrollInc);
+
}
-
+
if (m_rubberBandSelection) {
// The scrolling does not lead to an update of the rubberband
// selection. Fake a mouse move event to let the QAbstractItemView
}
}
-void DolphinViewAutoScroller::scrollToCurrentIndex()
-{
- const QModelIndex index = m_itemView->currentIndex();
- m_itemView->scrollTo(index);
-}
-
void DolphinViewAutoScroller::triggerAutoScroll()
{
const bool verticalScrolling = (m_itemView->verticalScrollBar() != 0) &&
- m_itemView->verticalScrollBar()->isVisible();
+ m_itemView->verticalScrollBar()->isVisible();
const bool horizontalScrolling = (m_itemView->horizontalScrollBar() != 0) &&
m_itemView->horizontalScrollBar()->isVisible();
if (!verticalScrolling && !horizontalScrolling) {
// no scrollbars are shown at all, so no autoscrolling is necessary
return;
}
-
+
QWidget* viewport = m_itemView->viewport();
const QPoint pos = viewport->mapFromGlobal(QCursor::pos());
if (verticalScrolling) {
- calculateScrollIncrement(pos.y(), viewport->height());
+ m_verticalScrollInc = calculateScrollIncrement(pos.y(), viewport->height());
}
if (horizontalScrolling) {
- calculateScrollIncrement(pos.x(), viewport->width());
+ m_horizontalScrollInc = calculateScrollIncrement(pos.x(), viewport->width());
}
-
+
if (m_timer->isActive()) {
- if (m_scrollInc == 0) {
+ if ((m_horizontalScrollInc == 0) && (m_verticalScrollInc == 0)) {
m_timer->stop();
}
- } else if (m_scrollInc != 0) {
+ } else if ((m_horizontalScrollInc != 0) || (m_verticalScrollInc != 0)) {
m_timer->start();
}
}
void DolphinViewAutoScroller::stopAutoScroll()
{
m_timer->stop();
- m_scrollInc = 0;
+ m_horizontalScrollInc = 0;
+ m_verticalScrollInc = 0;
}
-void DolphinViewAutoScroller::calculateScrollIncrement(int cursorPos, int rangeSize)
+int DolphinViewAutoScroller::calculateScrollIncrement(int cursorPos, int rangeSize) const
{
+ int inc = 0;
+
const int minSpeed = 2;
const int maxSpeed = 32;
const int speedLimiter = 8;
const int autoScrollBorder = 32;
-
+
if (cursorPos < autoScrollBorder) {
- m_scrollInc = -minSpeed + (cursorPos - autoScrollBorder) / speedLimiter;
- if (m_scrollInc < -maxSpeed) {
- m_scrollInc = -maxSpeed;
+ inc = -minSpeed + (cursorPos - autoScrollBorder) / speedLimiter;
+ if (inc < -maxSpeed) {
+ inc = -maxSpeed;
}
} else if (cursorPos > rangeSize - autoScrollBorder) {
- m_scrollInc = minSpeed + (cursorPos - rangeSize + autoScrollBorder) / speedLimiter;
- if (m_scrollInc > maxSpeed) {
- m_scrollInc = maxSpeed;
+ inc = minSpeed + (cursorPos - rangeSize + autoScrollBorder) / speedLimiter;
+ if (inc > maxSpeed) {
+ inc = maxSpeed;
}
- } else {
- m_scrollInc = 0;
}
+
+ return inc;
}
#include "dolphinviewautoscroller.moc"