Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.cpp	(revision 46808)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.cpp	(revision 46809)
@@ -39,4 +39,16 @@
                            fReverse, iAnimationDuration);
 }
+
+/* static */
+UIAnimationLoop* UIAnimationLoop::installAnimationLoop(QWidget *pTarget, const char *pszPropertyName,
+                                                       const char *pszValuePropertyNameStart, const char *pszValuePropertyNameFinal,
+                                                       int iAnimationDuration /*= 300*/)
+{
+    /* Return newly created animation-loop: */
+    return new UIAnimationLoop(pTarget, pszPropertyName,
+                               pszValuePropertyNameStart, pszValuePropertyNameFinal,
+                               iAnimationDuration);
+}
+
 
 UIAnimation::UIAnimation(QWidget *pParent, const char *pszPropertyName,
@@ -97,2 +109,46 @@
 }
 
+
+UIAnimationLoop::UIAnimationLoop(QWidget *pParent, const char *pszPropertyName,
+                                 const char *pszValuePropertyNameStart, const char *pszValuePropertyNameFinal,
+                                 int iAnimationDuration)
+    : QObject(pParent)
+    , m_pszPropertyName(pszPropertyName)
+    , m_pszValuePropertyNameStart(pszValuePropertyNameStart), m_pszValuePropertyNameFinal(pszValuePropertyNameFinal)
+    , m_iAnimationDuration(iAnimationDuration)
+    , m_pAnimation(0)
+{
+    /* Prepare: */
+    prepare();
+}
+
+void UIAnimationLoop::prepare()
+{
+    /* Prepare loop: */
+    m_pAnimation = new QPropertyAnimation(parent(), m_pszPropertyName, this);
+    m_pAnimation->setDuration(m_iAnimationDuration);
+    m_pAnimation->setLoopCount(-1);
+
+    /* Fetch animation-borders: */
+    update();
+}
+
+void UIAnimationLoop::update()
+{
+    /* Update animation: */
+    m_pAnimation->setStartValue(parent()->property(m_pszValuePropertyNameStart));
+    m_pAnimation->setEndValue(parent()->property(m_pszValuePropertyNameFinal));
+}
+
+void UIAnimationLoop::start()
+{
+    /* Start animation: */
+    m_pAnimation->start();
+}
+
+void UIAnimationLoop::stop()
+{
+    /* Stop animation: */
+    m_pAnimation->stop();
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.h	(revision 46808)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.h	(revision 46809)
@@ -71,3 +71,42 @@
 };
 
+/* UIAnimationLoop factory: */
+class UIAnimationLoop : public QObject
+{
+    Q_OBJECT;
+
+public:
+
+    /* API: Factory stuff: */
+    static UIAnimationLoop* installAnimationLoop(QWidget *pTarget, const char *pszPropertyName,
+                                                 const char *pszValuePropertyNameStart, const char *pszValuePropertyNameFinal,
+                                                 int iAnimationDuration = 300);
+
+    /* API: Update stuff: */
+    void update();
+
+    /* API: Loop stuff: */
+    void start();
+    void stop();
+
+protected:
+
+    /* Constructor: */
+    UIAnimationLoop(QWidget *pParent, const char *pszPropertyName,
+                    const char *pszValuePropertyNameStart, const char *pszValuePropertyNameFinal,
+                    int iAnimationDuration);
+
+private:
+
+    /* Helper: Prepare stuff: */
+    void prepare();
+
+    /* Variables: */
+    const char *m_pszPropertyName;
+    const char *m_pszValuePropertyNameStart;
+    const char *m_pszValuePropertyNameFinal;
+    int m_iAnimationDuration;
+    QPropertyAnimation *m_pAnimation;
+};
+
 #endif /* __UIAnimationFramework_h__ */
