Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.cpp	(revision 76986)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.cpp	(revision 76987)
@@ -19,8 +19,9 @@
 #include <QApplication>
 #include <QGraphicsScene>
+#include <QGraphicsSceneMouseEvent>
 #include <QGraphicsView>
 #include <QPainter>
 #include <QStyle>
-#include <QGraphicsSceneMouseEvent>
+#include <QTimerEvent>
 
 /* GUI includes: */
@@ -32,4 +33,7 @@
     , m_icon(icon)
     , m_fParentSelected(false)
+    , m_enmClickPolicy(ClickPolicy_OnRelease)
+    , m_iDelayId(0)
+    , m_iRepeatId(0)
     , m_dIconScaleIndex(0)
 {
@@ -55,4 +59,14 @@
 {
     return m_dIconScaleIndex;
+}
+
+void UIGraphicsButton::setClickPolicy(ClickPolicy enmPolicy)
+{
+    m_enmClickPolicy = enmPolicy;
+}
+
+UIGraphicsButton::ClickPolicy UIGraphicsButton::clickPolicy() const
+{
+    return m_enmClickPolicy;
 }
 
@@ -124,6 +138,18 @@
 void UIGraphicsButton::mousePressEvent(QGraphicsSceneMouseEvent *pEvent)
 {
+    /* Call to base-class: */
+    QIGraphicsWidget::mousePressEvent(pEvent);
+
     /* Accepting this event allows to get release-event: */
     pEvent->accept();
+
+    /* For click-on-press policy: */
+    if (m_enmClickPolicy == ClickPolicy_OnPress)
+    {
+        /* Notify listeners about button click: */
+        emit sigButtonClicked();
+        /* Start delay timer: */
+        m_iDelayId = startTimer(500);
+    }
 }
 
@@ -132,6 +158,45 @@
     /* Call to base-class: */
     QIGraphicsWidget::mouseReleaseEvent(pEvent);
-    /* Notify listeners about button click: */
-    emit sigButtonClicked();
+
+    /* Depending on click policy: */
+    switch (m_enmClickPolicy)
+    {
+        /* For click-on-release policy: */
+        case ClickPolicy_OnRelease:
+        {
+            /* Notify listeners about button click: */
+            emit sigButtonClicked();
+            break;
+        }
+        /* For click-on-press policy: */
+        case ClickPolicy_OnPress:
+        {
+            /* We should stop all timers: */
+            killTimer(m_iDelayId);
+            killTimer(m_iRepeatId);
+            m_iDelayId = 0;
+            m_iRepeatId = 0;
+            break;
+        }
+    }
+}
+
+void UIGraphicsButton::timerEvent(QTimerEvent *pEvent)
+{
+    /* For click-on-press policy: */
+    if (m_enmClickPolicy == ClickPolicy_OnPress)
+    {
+        /* We should auto-repeat button click: */
+        emit sigButtonClicked();
+
+        /* For delay timer: */
+        if (pEvent->timerId() == m_iDelayId)
+        {
+            /* We should stop it and start repeat timer: */
+            killTimer(m_iDelayId);
+            m_iDelayId = 0;
+            m_iRepeatId = startTimer(90);
+        }
+    }
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.h	(revision 76986)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.h	(revision 76987)
@@ -45,4 +45,7 @@
 public:
 
+    /** Click policy. */
+    enum ClickPolicy { ClickPolicy_OnRelease, ClickPolicy_OnPress };
+
     /* Constructor: */
     UIGraphicsButton(QIGraphicsWidget *pParent, const QIcon &icon);
@@ -55,4 +58,9 @@
     /** Returns icon scale index. */
     double iconScaleIndex() const;
+
+    /** Defines click @a enmPolicy. */
+    void setClickPolicy(ClickPolicy enmPolicy);
+    /** Returns click policy. */
+    ClickPolicy clickPolicy() const;
 
 protected:
@@ -79,4 +87,7 @@
     virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *pEvent);
 
+    /** Handles timer @a pEvent. */
+    virtual void timerEvent(QTimerEvent *pEvent) /* override */;
+
     /* Helpers: Update stuff: */
     virtual void refresh();
@@ -88,4 +99,12 @@
     bool m_fParentSelected;
 
+    /** Holds the click policy. */
+    ClickPolicy  m_enmClickPolicy;
+
+    /** Holds the delay timer ID. */
+    int  m_iDelayId;
+    /** Holds the repeat timer ID. */
+    int  m_iRepeatId;
+
     /** Holds the icon scale index. */
     double  m_dIconScaleIndex;
