Added animation
[situare] / src / ui / listitemcontextbuttonbar.cpp
index 722f123..96c0b75 100644 (file)
@@ -20,6 +20,8 @@
 */
 
 #include <QDebug>
+#include <QPropertyAnimation>
+#include <QStateMachine>
 
 #include "panelcommon.h"
 
 
 ListItemContextButtonBar::ListItemContextButtonBar(QWidget *parent) :
     QWidget(parent),
-    m_contextButtons(0)
+    m_waitForOpen(false),
+    m_contextButtons(0),
+    m_newContextButtons(0),
+    m_state(StateHidden)
 {
     qDebug() << __PRETTY_FUNCTION__;
-}
 
-void ListItemContextButtonBar::hideContextButtonBar()
-{
-    qDebug() << __PRETTY_FUNCTION__;
+    const int ANIMATION_DURATION_MS = 150;
 
-}
-
-void ListItemContextButtonBar::onListItemSelectionChanged(bool itemIsSelected)
-{
-    qDebug() << __PRETTY_FUNCTION__;
+    m_animation = new QPropertyAnimation(this, "pos", this);
+    m_animation->setDuration(ANIMATION_DURATION_MS);
 
-    m_contextButtons->setVisible(itemIsSelected);
+    connect(m_animation, SIGNAL(finished()),
+            this, SLOT(onAnimationFinished()));
 }
 
-void ListItemContextButtonBar::setContextButtons(QWidget *contextButtons)
+void ListItemContextButtonBar::changeButtons()
 {
-    qDebug() << __PRETTY_FUNCTION__;
+    qWarning() << __PRETTY_FUNCTION__;
+
+    Q_ASSERT(m_animation->state() == QAbstractAnimation::Stopped);
 
     // Hide previous buttons (if any)
     if (m_contextButtons)
         m_contextButtons->setParent(0);
 
-    m_contextButtons = contextButtons;
-
+    m_contextButtons = m_newContextButtons;
+    m_newContextButtons = 0;
     m_contextButtons->setParent(this);
-
-    // widget must be temporarily visible so we can get the size, doesn't work with invisible widget
-    m_contextButtons->setVisible(true);
+    m_contextButtons->show();
     setFixedSize(m_contextButtons->size());
-    m_contextButtons->setVisible(false);
 
-    // center this widget horizontally to middle of the panel contents area
+    // center this widget horizontally to middle of the panel contents area and set outside of
+    // the view
     const int FROM_PANEL_CONTENTS_LEFT = PANEL_WIDTH / 2 - m_contextButtons->width() / 2;
+    move(PANEL_TAB_BAR_WIDTH + PANEL_BAR_WIDTH + FROM_PANEL_CONTENTS_LEFT, -size().height());
+
+    // update new target values for animations
+    m_animation->setStartValue(pos());
     const int Y = 0;
-    move(PANEL_TAB_BAR_WIDTH + PANEL_BAR_WIDTH + FROM_PANEL_CONTENTS_LEFT, Y);
+    m_animation->setEndValue(QPoint(pos().x(), Y));
+}
+
+void ListItemContextButtonBar::hideContextButtonBar()
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+    m_state = StateClosing;
+    m_animation->setDirection(QAbstractAnimation::Backward);
+    m_animation->start();
+}
+
+void ListItemContextButtonBar::onAnimationFinished()
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+    if (m_animation->direction() == QAbstractAnimation::Backward) {
+        m_state = StateHidden;
+        if (m_newContextButtons) {
+            changeButtons();
+            if (m_waitForOpen) {
+                m_waitForOpen = false;
+                showContextButtonBar();
+            }
+        }
+    } else {
+        m_state = StateVisible;
+    }
+}
+
+void ListItemContextButtonBar::onListItemSelectionChanged(bool itemIsSelected)
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+    /// @todo m_waitForOpen is not cleared if item selection is removed while waiting
+
+    if (m_newContextButtons)
+        m_waitForOpen = true;
+    else if (itemIsSelected && (m_state != StateVisible))
+        showContextButtonBar();
+    else if (!itemIsSelected && (m_state != StateHidden))
+        hideContextButtonBar();
+}
+
+void ListItemContextButtonBar::setContextButtons(QWidget *contextButtons)
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+    m_newContextButtons = contextButtons;
+    m_waitForOpen = false;
+
+    if (m_state != StateHidden)
+        hideContextButtonBar();
+    else
+        changeButtons();
 }
 
 void ListItemContextButtonBar::showContextButtonBar()
 {
-    qDebug() << __PRETTY_FUNCTION__;
+    qWarning() << __PRETTY_FUNCTION__;
 
+    m_state = StateOpening;
+    m_animation->setDirection(QAbstractAnimation::Forward);
+    m_animation->start();
 }