Index: trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.cpp	(revision 42855)
+++ trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.cpp	(revision 42856)
@@ -94,10 +94,10 @@
 void UIGDetailsElement::close()
 {
-    m_pButton->setToggled(false, false);
+    m_pButton->setToggled(false);
 }
 
 void UIGDetailsElement::open()
 {
-    m_pButton->setToggled(true, false);
+    m_pButton->setToggled(true);
 }
 
@@ -134,4 +134,14 @@
 }
 
+void UIGDetailsElement::markAnimationFinished()
+{
+    m_fAnimationRunning = false;
+}
+
+void UIGDetailsElement::sltToggleButtonClicked()
+{
+    emit sigToggleElement(m_type, closed());
+}
+
 void UIGDetailsElement::sltElementToggleStart()
 {
@@ -144,19 +154,13 @@
     /* Toggle element state: */
     m_fClosed = !m_fClosed;
-    /* Relayout model: */
-    model()->updateLayout();
-    update();
 }
 
 void UIGDetailsElement::sltElementToggleFinish(bool fToggled)
 {
-    /* Mark animation stopped: */
-    m_fAnimationRunning = false;
-
     /* Update toggle-state: */
     m_fClosed = !fToggled;
-    /* Relayout model: */
-    model()->updateLayout();
-    update();
+
+    /* Notify about finishing: */
+    emit sigToggleElementFinished();
 }
 
@@ -443,4 +447,6 @@
     /* Setup toggle-button: */
     m_pButton = new UIGraphicsRotatorButton(this, "additionalHeight", !m_fClosed, true /* reflected */);
+    m_pButton->setAutoHandleButtonClick(false);
+    connect(m_pButton, SIGNAL(sigButtonClicked()), this, SLOT(sltToggleButtonClicked()));
     connect(m_pButton, SIGNAL(sigRotationStart()), this, SLOT(sltElementToggleStart()));
     connect(m_pButton, SIGNAL(sigRotationFinish(bool)), this, SLOT(sltElementToggleFinish(bool)));
Index: trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h	(revision 42855)
+++ trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h	(revision 42856)
@@ -57,6 +57,7 @@
     void sigHoverLeave();
 
-    /* Notifier: Toggle stuff: */
+    /* Notifiers: Toggle stuff: */
     void sigToggleElement(DetailsElementType type, bool fToggled);
+    void sigToggleElementFinished();
 
     /* Notifier: Link-click stuff: */
@@ -90,7 +91,11 @@
     virtual void updateAppearance() = 0;
 
+    /* API: Animation stuff: */
+    void markAnimationFinished();
+
 protected slots:
 
-    /* Handlers: Collapse/expand stuff: */
+    /* Handlers: Toggle stuff: */
+    void sltToggleButtonClicked();
     void sltElementToggleStart();
     void sltElementToggleFinish(bool fToggled);
Index: trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.cpp	(revision 42855)
+++ trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.cpp	(revision 42856)
@@ -40,4 +40,5 @@
     , m_pScene(0)
     , m_pRoot(0)
+    , m_pAnimationCallback(0)
 {
     /* Prepare scene: */
@@ -46,4 +47,7 @@
     /* Prepare root: */
     prepareRoot();
+
+    /* Register meta-type: */
+    qRegisterMetaType<DetailsElementType>();
 }
 
@@ -97,4 +101,11 @@
 void UIGDetailsModel::sltToggleElements(DetailsElementType type, bool fToggled)
 {
+    /* Make sure not started yet: */
+    if (m_pAnimationCallback)
+        return;
+    /* Prepare/configure animation callback: */
+    m_pAnimationCallback = new UIGDetailsElementAnimationCallback(this, type, fToggled);
+    connect(m_pAnimationCallback, SIGNAL(sigAllAnimationFinished(DetailsElementType, bool)),
+            this, SLOT(sltToggleAnimationFinished(DetailsElementType, bool)), Qt::QueuedConnection);
     /* For each the set of the group: */
     foreach (UIGDetailsItem *pSetItem, m_pRoot->items())
@@ -109,10 +120,38 @@
             {
                 if (fToggled && pElement->closed())
+                {
+                    m_pAnimationCallback->addNotifier(pElement);
                     pElement->open();
+                }
                 else if (!fToggled && pElement->opened())
+                {
+                    m_pAnimationCallback->addNotifier(pElement);
                     pElement->close();
+                }
             }
         }
     }
+    /* Update layout: */
+    updateLayout();
+}
+
+void UIGDetailsModel::sltToggleAnimationFinished(DetailsElementType type, bool fToggled)
+{
+    /* Cleanup animation callback: */
+    delete m_pAnimationCallback;
+    m_pAnimationCallback = 0;
+
+    /* Mark animation finished: */
+    foreach (UIGDetailsItem *pSetItem, m_pRoot->items())
+    {
+        foreach (UIGDetailsItem *pElementItem, pSetItem->items())
+        {
+            UIGDetailsElement *pElement = pElementItem->toElement();
+            if (pElement->elementType() == type)
+                pElement->markAnimationFinished();
+        }
+    }
+    /* Update layout: */
+    updateLayout();
 
     /* Update details settings: */
@@ -246,2 +285,30 @@
 }
 
+UIGDetailsElementAnimationCallback::UIGDetailsElementAnimationCallback(QObject *pParent, DetailsElementType type, bool fToggled)
+    : QObject(pParent)
+    , m_type(type)
+    , m_fToggled(fToggled)
+{
+}
+
+void UIGDetailsElementAnimationCallback::addNotifier(UIGDetailsItem *pItem)
+{
+    /* Connect notifier: */
+    connect(pItem, SIGNAL(sigToggleElementFinished()), this, SLOT(sltAnimationFinished()));
+    /* Remember notifier: */
+    m_notifiers << pItem;
+}
+
+void UIGDetailsElementAnimationCallback::sltAnimationFinished()
+{
+    /* Determine notifier: */
+    UIGDetailsItem *pItem = qobject_cast<UIGDetailsItem*>(sender());
+    /* Disconnect notifier: */
+    disconnect(pItem, SIGNAL(sigToggleElementFinished()), this, SLOT(sltAnimationFinished()));
+    /* Remove notifier: */
+    m_notifiers.removeAll(pItem);
+    /* Check if we finished: */
+    if (m_notifiers.isEmpty())
+        emit sigAllAnimationFinished(m_type, m_fToggled);
+}
+
Index: trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.h	(revision 42855)
+++ trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.h	(revision 42856)
@@ -39,4 +39,6 @@
 class UIGDetailsGroup;
 class UIVMItem;
+class UIGDetailsElementAnimationCallback;
+class UIGDetailsItem;
 
 /* Graphics selector model: */
@@ -78,4 +80,5 @@
     /* Handler: Toggle stuff: */
     void sltToggleElements(DetailsElementType type, bool fToggled);
+    void sltToggleAnimationFinished(DetailsElementType type, bool fToggled);
 
     /* Handler: Context-menu stuff: */
@@ -118,4 +121,36 @@
     QGraphicsScene *m_pScene;
     UIGDetailsGroup *m_pRoot;
+    UIGDetailsElementAnimationCallback *m_pAnimationCallback;
+};
+
+/* Details-element animation callback: */
+class UIGDetailsElementAnimationCallback : public QObject
+{
+    Q_OBJECT;
+
+signals:
+
+    /* Notifier: Complete stuff: */
+    void sigAllAnimationFinished(DetailsElementType type, bool fToggled);
+
+public:
+
+    /* Constructor: */
+    UIGDetailsElementAnimationCallback(QObject *pParent, DetailsElementType type, bool fToggled);
+
+    /* API: Notifiers stuff: */
+    void addNotifier(UIGDetailsItem *pItem);
+
+private slots:
+
+    /* Handler: Progress stuff: */
+    void sltAnimationFinished();
+
+private:
+
+    /* Variables: */
+    QList<UIGDetailsItem*> m_notifiers;
+    DetailsElementType m_type;
+    bool m_fToggled;
 };
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.cpp	(revision 42855)
+++ trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.cpp	(revision 42856)
@@ -42,4 +42,7 @@
     , m_pBackwardSubordinateAnimation(0)
 {
+    /* Configure: */
+    setAutoHandleButtonClick(true);
+
     /* Create state machine: */
     m_pAnimationMachine = new QStateMachine(this);
@@ -107,4 +110,15 @@
 }
 
+void UIGraphicsRotatorButton::setAutoHandleButtonClick(bool fEnabled)
+{
+    /* Disconnect button-click signal: */
+    disconnect(this, SIGNAL(sigButtonClicked()), this, SLOT(sltButtonClicked()));
+    if (fEnabled)
+    {
+        /* Connect button-click signal: */
+        connect(this, SIGNAL(sigButtonClicked()), this, SLOT(sltButtonClicked()));
+    }
+}
+
 void UIGraphicsRotatorButton::setToggled(bool fToggled, bool fAnimated /* = true */)
 {
@@ -159,4 +173,15 @@
     return m_pForwardSubordinateAnimation->state() == QAbstractAnimation::Running ||
            m_pBackwardSubordinateAnimation->state() == QAbstractAnimation::Running;
+}
+
+void UIGraphicsRotatorButton::sltButtonClicked()
+{
+    /* Toggle state: */
+    switch (state())
+    {
+        case UIGraphicsRotatorButtonState_Default: setToggled(true); break;
+        case UIGraphicsRotatorButtonState_Rotated: setToggled(false); break;
+        default: break;
+    }
 }
 
@@ -172,20 +197,4 @@
 }
 
-void UIGraphicsRotatorButton::mousePressEvent(QGraphicsSceneMouseEvent*)
-{
-    /* Toggle state: */
-    switch (state())
-    {
-        case UIGraphicsRotatorButtonState_Default: setToggled(true); break;
-        case UIGraphicsRotatorButtonState_Rotated: setToggled(false); break;
-        default: break;
-    }
-}
-
-void UIGraphicsRotatorButton::mouseReleaseEvent(QGraphicsSceneMouseEvent*)
-{
-    /* Do nothing (do NOT propagate to parent!)... */
-}
-
 void UIGraphicsRotatorButton::updateRotationState()
 {
Index: trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.h	(revision 42855)
+++ trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.h	(revision 42856)
@@ -62,4 +62,7 @@
                             int iAnimationDuration = 300);
 
+    /* API: Button-click stuff: */
+    void setAutoHandleButtonClick(bool fEnabled);
+
     /* API: Toggle stuff: */
     void setToggled(bool fToggled, bool fAnimated = true);
@@ -69,12 +72,13 @@
     bool isAnimationRunning() const;
 
+protected slots:
+
+    /* Handler: Button-click stuff: */
+    void sltButtonClicked();
+
 protected:
 
     /* Helpers: Update stuff: */
     void refresh();
-
-    /* Mouse-buttons handler: */
-    void mousePressEvent(QGraphicsSceneMouseEvent *pEvent);
-    void mouseReleaseEvent(QGraphicsSceneMouseEvent *pEvent);
 
 private:
