Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.cpp	(revision 79413)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.cpp	(revision 79414)
@@ -27,4 +27,5 @@
 #include <QStyle>
 #include <QStyleOptionGraphicsItem>
+#include <QTimer>
 #include <QTimerEvent>
 
@@ -33,4 +34,30 @@
 #include "UIGraphicsScrollBar.h"
 #include "UIIconPool.h"
+
+
+/** Small functor for QTimer::singleShot worker to perform delayed scrolling. */
+class ScrollFunctor
+{
+public:
+
+    /** Performs delayed scrolling of specified @a pScrollBar to certain @a pos. */
+    ScrollFunctor(UIGraphicsScrollBar *pScrollBar, const QPointF &pos)
+        : m_pScrollBar(pScrollBar)
+        , m_pos(pos)
+    {}
+
+    /** Contains functor's body. */
+    void operator()()
+    {
+        m_pScrollBar->scrollTo(m_pos, 100);
+    }
+
+private:
+
+    /** Holds the scroll-bar reference to scroll. */
+    UIGraphicsScrollBar *m_pScrollBar;
+    /** Holds the position to scroll to. */
+    QPointF              m_pos;
+};
 
 
@@ -218,4 +245,5 @@
     , m_iHoverOffTimerId(0)
     , m_iHoveringValue(0)
+    , m_fScrollInProgress(false)
 #ifdef VBOX_WS_MAC
     , m_fRevealed(false)
@@ -243,4 +271,5 @@
     , m_iHoverOffTimerId(0)
     , m_iHoveringValue(0)
+    , m_fScrollInProgress(false)
 #ifdef VBOX_WS_MAC
     , m_fRevealed(false)
@@ -269,4 +298,9 @@
 {
     return 2 * QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
+}
+
+int UIGraphicsScrollBar::pageStep() const
+{
+    return 3 * step();
 }
 
@@ -323,4 +357,56 @@
 }
 
+void UIGraphicsScrollBar::scrollTo(const QPointF &desiredPos, int iDelay /* = 500 */)
+{
+    /* Prepare current, desired and intermediate positions: */
+    const QPointF currentPos = actualTokenPosition();
+    const int iCurrentY = currentPos.y();
+    const int iCurrentX = currentPos.x();
+    const int iDesiredY = desiredPos.y();
+    const int iDesiredX = desiredPos.x();
+    QPointF intermediatePos;
+
+    /* Calculate intermediate position depending on orientation: */
+    switch (m_enmOrientation)
+    {
+        case Qt::Horizontal:
+        {
+            if (iCurrentX < iDesiredX)
+            {
+                intermediatePos.setY(desiredPos.y());
+                intermediatePos.setX(iCurrentX + pageStep() < iDesiredX ? iCurrentX + pageStep() : iDesiredX);
+            }
+            else if (iCurrentX > iDesiredX)
+            {
+                intermediatePos.setY(desiredPos.y());
+                intermediatePos.setX(iCurrentX - pageStep() > iDesiredX ? iCurrentX - pageStep() : iDesiredX);
+            }
+            break;
+        }
+        case Qt::Vertical:
+        {
+            if (iCurrentY < iDesiredY)
+            {
+                intermediatePos.setX(desiredPos.x());
+                intermediatePos.setY(iCurrentY + pageStep() < iDesiredY ? iCurrentY + pageStep() : iDesiredY);
+            }
+            else if (iCurrentY > iDesiredY)
+            {
+                intermediatePos.setX(desiredPos.x());
+                intermediatePos.setY(iCurrentY - pageStep() > iDesiredY ? iCurrentY - pageStep() : iDesiredY);
+            }
+            break;
+        }
+    }
+
+    /* Move token to intermediate position: */
+    if (!intermediatePos.isNull())
+        sltTokenMoved(intermediatePos);
+
+    /* Continue, if we haven't reached required position: */
+    if ((intermediatePos != desiredPos) && m_fScrollInProgress)
+        QTimer::singleShot(iDelay, ScrollFunctor(this, desiredPos));
+}
+
 void UIGraphicsScrollBar::resizeEvent(QGraphicsSceneResizeEvent *pEvent)
 {
@@ -349,6 +435,20 @@
     pEvent->accept();
 
-    /* Redirect to token move handler: */
-    sltTokenMoved(pEvent->pos());
+    /* Start scrolling sequence: */
+    m_fScrollInProgress = true;
+    scrollTo(pEvent->pos());
+}
+
+void UIGraphicsScrollBar::mouseReleaseEvent(QGraphicsSceneMouseEvent *pEvent)
+{
+    /* Call to base-class: */
+    QIGraphicsWidget::mousePressEvent(pEvent);
+
+    /* Mark event accepted so that it couldn't
+     * influence underlying widgets: */
+    pEvent->accept();
+
+    /* Stop scrolling if any: */
+    m_fScrollInProgress = false;
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.h	(revision 79413)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.h	(revision 79414)
@@ -69,4 +69,6 @@
     /** Returns scrolling step. */
     int step() const;
+    /** Returns page scrolling step. */
+    int pageStep() const;
 
     /** Defines @a iMinimum scroll-bar value. */
@@ -85,4 +87,7 @@
     int value() const;
 
+    /** Performs scrolling to certain @a desiredPos with certain @a iDelay. */
+    void scrollTo(const QPointF &desiredPos, int iDelay = 500);
+
 protected:
 
@@ -95,4 +100,6 @@
     /** Handles mouse-press @a pEvent. */
     virtual void mousePressEvent(QGraphicsSceneMouseEvent *pEvent) /* override */;
+    /** Handles mouse-release @a pEvent. */
+    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *pEvent) /* override */;
 
     /** Handles hover enter @a pEvent. */
@@ -207,4 +214,7 @@
     int   m_iHoveringValue;
 
+    /** Holds whether we are scrolling. */
+    bool  m_fScrollInProgress;
+
 #ifdef VBOX_WS_MAC
     /** Holds whether token is revealed. */
