]> cloud.milkyroute.net Git - dolphin.git/commitdiff
also implement autoscrolling for horizontally aligned views (e. g. icons view in...
authorPeter Penz <peter.penz19@gmail.com>
Sun, 7 Dec 2008 14:08:34 +0000 (14:08 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sun, 7 Dec 2008 14:08:34 +0000 (14:08 +0000)
svn path=/trunk/KDE/kdebase/apps/; revision=893894

src/dolphinviewautoscroller.cpp
src/dolphinviewautoscroller.h

index 45abc1e9294bfc9727df164d973637531bed1400..bbcf16ac3ef5bdca2c8506760ecb0391e1506df5 100644 (file)
@@ -87,51 +87,48 @@ bool DolphinViewAutoScroller::eventFilter(QObject* watched, QEvent* event)
 
 void DolphinViewAutoScroller::scrollViewport()
 {
-    // TODO: implement horizontal scrolling
     QScrollBar* verticalScrollBar = m_itemView->verticalScrollBar();
     if (verticalScrollBar != 0) {
         const int value = verticalScrollBar->value();
         verticalScrollBar->setValue(value + m_scrollInc);
         
-        if (m_rubberBandSelection) {
-            // The scrolling does not lead to an update of the rubberband
-            // selection. Fake a mouse move event to let the QAbstractItemView
-            // 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);
-            QCoreApplication::sendEvent(viewport, &event);
-        }
+    }
+    QScrollBar* horizontalScrollBar = m_itemView->horizontalScrollBar();
+    if (horizontalScrollBar != 0) {
+        const int value = horizontalScrollBar->value();
+        horizontalScrollBar->setValue(value + m_scrollInc);
+        
+    }
+    
+    if (m_rubberBandSelection) {
+        // The scrolling does not lead to an update of the rubberband
+        // selection. Fake a mouse move event to let the QAbstractItemView
+        // 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);
+        QCoreApplication::sendEvent(viewport, &event);
     }
 }
 
 void DolphinViewAutoScroller::triggerAutoScroll()
 {
-    // TODO: implement horizontal scrolling
-    
-    const int startSpeed = 2;
-    const int speedLimiter = 8;
-    const int scrollIncMax = 32;
-    
-    const int autoScrollBorder = 32;
+    const bool verticalScrolling = (m_itemView->verticalScrollBar() != 0) &&
+                                    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 (pos.y() < autoScrollBorder) {
-        // scroll up
-        m_scrollInc = -startSpeed + (pos.y() - autoScrollBorder) / speedLimiter;
-        if (m_scrollInc < -scrollIncMax) {
-            m_scrollInc = -scrollIncMax;
-        }
-    } else if (pos.y() > viewport->height() - autoScrollBorder) {
-        // scroll down
-        m_scrollInc = startSpeed + (pos.y() - viewport->height() + autoScrollBorder) / speedLimiter;
-        if (m_scrollInc > scrollIncMax) {
-            m_scrollInc = scrollIncMax;
-        }
-    } else {
-        // no scrolling
-        m_scrollInc = 0;
+    if (verticalScrolling) {
+        calculateScrollIncrement(pos.y(), viewport->height());
+    }
+    if (horizontalScrolling) {
+        calculateScrollIncrement(pos.x(), viewport->width());
     }
     
     if (m_timer->isActive()) {
@@ -149,4 +146,26 @@ void DolphinViewAutoScroller::stopAutoScroll()
     m_scrollInc = 0;
 }
 
+void DolphinViewAutoScroller::calculateScrollIncrement(int cursorPos, int rangeSize)
+{
+    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;
+        }
+    } else if (cursorPos > rangeSize - autoScrollBorder) {
+        m_scrollInc = minSpeed + (cursorPos - rangeSize + autoScrollBorder) / speedLimiter;
+        if (m_scrollInc > maxSpeed) {
+            m_scrollInc = maxSpeed;
+        }
+    } else {
+        m_scrollInc = 0;
+    }
+}
+
 #include "dolphinviewautoscroller.moc"
index c02112b7b3f22e926b89319231d830e20ab7c779..c04e22e287b372bd3868c533c381f80aa75e2e4d 100644 (file)
@@ -49,6 +49,12 @@ private:
     void triggerAutoScroll();
     void stopAutoScroll();
     
+    /**
+     * Calculates the scroll increment m_scrollInc dependent from
+     * the cursor position \a cursorPos and the range 0 - \a rangeSize - 1.
+     */
+    void calculateScrollIncrement(int cursorPos, int rangeSize);
+    
 private:
     bool m_rubberBandSelection;
     int m_scrollInc;