From 46b57ff723a514ae6e13f5b336f03581d8cffdcf Mon Sep 17 00:00:00 2001
From: Lasse Holmstedt <lasse.holmstedt@nokia.com>
Date: Mon, 12 Jul 2010 14:32:54 +0200
Subject: [PATCH] added animation slowdown dropdown menu to toolbar

---
 .../qmljsinspector/qmlinspectortoolbar.cpp    | 89 ++++++++++++++++++-
 .../qmljsinspector/qmlinspectortoolbar.h      | 15 ++++
 .../qmljsinspector/qmljsdesigndebugclient.cpp |  1 -
 .../editor/rubberbandselectionmanipulator.cpp |  1 +
 .../qml/qmlviewer/qdeclarativedesignview.cpp  |  8 +-
 5 files changed, 107 insertions(+), 7 deletions(-)

diff --git a/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp b/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
index fbe8299b0cf..73c371a5cce 100644
--- a/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
+++ b/src/plugins/qmljsinspector/qmlinspectortoolbar.cpp
@@ -11,6 +11,8 @@
 #include <QHBoxLayout>
 #include <QAction>
 #include <QToolButton>
+#include <QMenu>
+#include <QActionGroup>
 
 namespace QmlJSInspector {
 namespace Internal {
@@ -34,8 +36,15 @@ QmlInspectorToolbar::QmlInspectorToolbar(QObject *parent) :
     m_colorPickerAction(0),
     m_toQmlAction(0),
     m_fromQmlAction(0),
+    m_defaultAnimSpeedAction(0),
+    m_halfAnimSpeedAction(0),
+    m_fourthAnimSpeedAction(0),
+    m_eighthAnimSpeedAction(0),
+    m_tenthAnimSpeedAction(0),
     m_emitSignals(true),
     m_isRunning(false),
+    m_animationSpeed(1.0f),
+    m_previousAnimationSpeed(0.0f),
     m_activeTool(NoTool)
 {
 
@@ -59,6 +68,7 @@ void QmlInspectorToolbar::enable()
 {
     setEnabled(true);
     m_emitSignals = false;
+    changeAnimationSpeed(1.0f);
     activateDesignModeOnClick();
     m_emitSignals = true;
 }
@@ -104,6 +114,20 @@ void QmlInspectorToolbar::changeAnimationSpeed(qreal slowdownFactor)
     if (slowdownFactor == 0) {
         activatePauseOnClick();
     } else {
+        m_animationSpeed = slowdownFactor;
+
+        if (slowdownFactor == 1.0f) {
+            m_defaultAnimSpeedAction->setChecked(true);
+        } else if (slowdownFactor == 2.0f) {
+            m_halfAnimSpeedAction->setChecked(true);
+        } else if (slowdownFactor == 4.0f) {
+            m_fourthAnimSpeedAction->setChecked(true);
+        } else if (slowdownFactor == 8.0f) {
+            m_eighthAnimSpeedAction->setChecked(true);
+        } else if (slowdownFactor == 10.0f) {
+            m_tenthAnimSpeedAction->setChecked(true);
+        }
+
         activatePlayOnClick();
     }
     m_emitSignals = true;
@@ -162,11 +186,39 @@ void QmlInspectorToolbar::createActions(const Core::Context &context)
     configBarLayout->setMargin(0);
     configBarLayout->setSpacing(5);
 
+    QMenu *playSpeedMenu = new QMenu(configBar);
+    QActionGroup *playSpeedMenuActions = new QActionGroup(this);
+    playSpeedMenuActions->setExclusive(true);
+
+    m_defaultAnimSpeedAction = playSpeedMenu->addAction(tr("1x"), this, SLOT(changeToDefaultAnimSpeed()));
+    m_defaultAnimSpeedAction->setCheckable(true);
+    m_defaultAnimSpeedAction->setChecked(true);
+    playSpeedMenuActions->addAction(m_defaultAnimSpeedAction);
+
+    m_halfAnimSpeedAction = playSpeedMenu->addAction(tr("0.5x"), this, SLOT(changeToHalfAnimSpeed()));
+    m_halfAnimSpeedAction->setCheckable(true);
+    playSpeedMenuActions->addAction(m_halfAnimSpeedAction);
+
+    m_fourthAnimSpeedAction = playSpeedMenu->addAction(tr("0.25x"), this, SLOT(changeToFourthAnimSpeed()));
+    m_fourthAnimSpeedAction->setCheckable(true);
+    playSpeedMenuActions->addAction(m_fourthAnimSpeedAction);
+
+    m_eighthAnimSpeedAction = playSpeedMenu->addAction(tr("0.125x"), this, SLOT(changeToEighthAnimSpeed()));
+    m_eighthAnimSpeedAction->setCheckable(true);
+    playSpeedMenuActions->addAction(m_eighthAnimSpeedAction);
+
+    m_tenthAnimSpeedAction = playSpeedMenu->addAction(tr("0.1x"), this, SLOT(changeToTenthAnimSpeed()));
+    m_tenthAnimSpeedAction->setCheckable(true);
+    playSpeedMenuActions->addAction(m_tenthAnimSpeedAction);
+
     configBarLayout->addWidget(createToolButton(am->command(ProjectExplorer::Constants::DEBUG)->action()));
     configBarLayout->addWidget(createToolButton(am->command(ProjectExplorer::Constants::STOP)->action()));
     configBarLayout->addWidget(createToolButton(am->command(QmlJSInspector::Constants::DESIGNMODE_ACTION)->action()));
     configBarLayout->addWidget(createToolButton(am->command(QmlJSInspector::Constants::RELOAD_ACTION)->action()));
-    configBarLayout->addWidget(createToolButton(am->command(QmlJSInspector::Constants::PLAY_ACTION)->action()));
+
+    QToolButton *playButton = createToolButton(am->command(QmlJSInspector::Constants::PLAY_ACTION)->action());
+    playButton->setMenu(playSpeedMenu);
+    configBarLayout->addWidget(playButton);
     configBarLayout->addWidget(createToolButton(am->command(QmlJSInspector::Constants::PAUSE_ACTION)->action()));
 
     configBarLayout->addWidget(createToolButton(am->command(QmlJSInspector::Constants::SELECT_ACTION)->action()));
@@ -200,6 +252,36 @@ void QmlInspectorToolbar::createActions(const Core::Context &context)
     connect(m_fromQmlAction, SIGNAL(triggered()), SLOT(activateFromQml()));
 }
 
+void QmlInspectorToolbar::changeToDefaultAnimSpeed()
+{
+    m_animationSpeed = 1.0f;
+    activatePlayOnClick();
+}
+
+void QmlInspectorToolbar::changeToHalfAnimSpeed()
+{
+    m_animationSpeed = 2.0f;
+    activatePlayOnClick();
+}
+
+void QmlInspectorToolbar::changeToFourthAnimSpeed()
+{
+    m_animationSpeed = 4.0f;
+    activatePlayOnClick();
+}
+
+void QmlInspectorToolbar::changeToEighthAnimSpeed()
+{
+    m_animationSpeed = 8.0f;
+    activatePlayOnClick();
+}
+
+void QmlInspectorToolbar::changeToTenthAnimSpeed()
+{
+    m_animationSpeed = 10.0f;
+    activatePlayOnClick();
+}
+
 void QmlInspectorToolbar::activateDesignModeOnClick()
 {
     bool checked = m_designmodeAction->isChecked();
@@ -221,11 +303,12 @@ void QmlInspectorToolbar::activateDesignModeOnClick()
 void QmlInspectorToolbar::activatePlayOnClick()
 {
     m_pauseAction->setChecked(false);
-    if (!m_isRunning) {
+    if (!m_isRunning || m_animationSpeed != m_previousAnimationSpeed) {
         m_playAction->setChecked(true);
         m_isRunning = true;
+        m_previousAnimationSpeed = m_animationSpeed;
         if (m_emitSignals)
-            emit animationSpeedChanged(1.0f);
+            emit animationSpeedChanged(m_animationSpeed);
     }
 }
 
diff --git a/src/plugins/qmljsinspector/qmlinspectortoolbar.h b/src/plugins/qmljsinspector/qmlinspectortoolbar.h
index b1452b27b23..4af82064c64 100644
--- a/src/plugins/qmljsinspector/qmlinspectortoolbar.h
+++ b/src/plugins/qmljsinspector/qmlinspectortoolbar.h
@@ -63,6 +63,12 @@ private slots:
     void activateMarqueeSelectToolOnClick();
     void activateZoomOnClick();
 
+    void changeToDefaultAnimSpeed();
+    void changeToHalfAnimSpeed();
+    void changeToFourthAnimSpeed();
+    void changeToEighthAnimSpeed();
+    void changeToTenthAnimSpeed();
+
     void activateFromQml();
     void activateToQml();
 
@@ -78,8 +84,17 @@ private:
     QAction *m_toQmlAction;
     QAction *m_fromQmlAction;
 
+    QAction *m_defaultAnimSpeedAction;
+    QAction *m_halfAnimSpeedAction;
+    QAction *m_fourthAnimSpeedAction;
+    QAction *m_eighthAnimSpeedAction;
+    QAction *m_tenthAnimSpeedAction;
+
     bool m_emitSignals;
     bool m_isRunning;
+    qreal m_animationSpeed;
+    qreal m_previousAnimationSpeed;
+
     DesignTool m_activeTool;
 
 };
diff --git a/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp b/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
index c517ad41501..7fb14f0359d 100644
--- a/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
+++ b/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
@@ -154,7 +154,6 @@ void QmlJSDesignDebugClient::setAnimationSpeed(qreal slowdownFactor)
 
     ds << QByteArray("SET_ANIMATION_SPEED")
        << slowdownFactor;
-
     sendMessage(message);
 }
 
diff --git a/src/tools/qml/qmlviewer/editor/rubberbandselectionmanipulator.cpp b/src/tools/qml/qmlviewer/editor/rubberbandselectionmanipulator.cpp
index 3783a09c404..26f969f2839 100644
--- a/src/tools/qml/qmlviewer/editor/rubberbandselectionmanipulator.cpp
+++ b/src/tools/qml/qmlviewer/editor/rubberbandselectionmanipulator.cpp
@@ -91,6 +91,7 @@ void RubberBandSelectionManipulator::select(SelectionType selectionType)
     foreach (QGraphicsItem* item, itemList) {
         if (item
             && item->parentItem()
+            && !newSelectionList.contains(item)
             //&& m_beginFormEditorItem->childItems().contains(item) // TODO activate this test
             )
         {
diff --git a/src/tools/qml/qmlviewer/qdeclarativedesignview.cpp b/src/tools/qml/qmlviewer/qdeclarativedesignview.cpp
index 9bed781fe11..7e164ea0eba 100644
--- a/src/tools/qml/qmlviewer/qdeclarativedesignview.cpp
+++ b/src/tools/qml/qmlviewer/qdeclarativedesignview.cpp
@@ -228,6 +228,8 @@ void QDeclarativeDesignView::setDesignModeBehavior(bool value)
     if (m_subcomponentEditorTool) {
         m_subcomponentEditorTool->clear();
         clearHighlightBoundingRect();
+        setSelectedItems(QList<QGraphicsItem*>());
+
         if (rootObject())
             m_subcomponentEditorTool->pushContext(rootObject());
     }
@@ -335,7 +337,6 @@ void QDeclarativeDesignView::changeToSelectTool()
 
 void QDeclarativeDesignView::changeToMarqueeSelectTool()
 {
-    qDebug() << "changed to marquee select tool";
     changeToSelectTool();
     m_currentToolMode = Constants::MarqueeSelectionToolMode;
     m_selectionTool->setRubberbandSelectionMode(true);
@@ -347,7 +348,6 @@ void QDeclarativeDesignView::changeToMarqueeSelectTool()
 void QDeclarativeDesignView::changeToZoomTool()
 {
     m_currentToolMode = Constants::ZoomMode;
-    qDebug() << "changed to zoom tool";
     m_currentTool->clear();
     m_currentTool = m_zoomTool;
     m_currentTool->clear();
@@ -386,10 +386,12 @@ void QDeclarativeDesignView::continueExecution(qreal slowdownFactor)
     Q_ASSERT(slowdownFactor > 0);
 
     m_slowdownFactor = slowdownFactor;
+    static const qreal animSpeedSnapDelta = 0.01f;
+    bool useStandardSpeed = (qAbs(1.0f - m_slowdownFactor) < animSpeedSnapDelta);
 
     QUnifiedTimer *timer = QUnifiedTimer::instance();
     timer->setSlowdownFactor(m_slowdownFactor);
-    timer->setSlowModeEnabled(false);
+    timer->setSlowModeEnabled(!useStandardSpeed);
     m_executionPaused = false;
 
     emit executionStarted(m_slowdownFactor);
-- 
GitLab