Refactored panel context button bar animation and now it is implemented in a lot...
[situare] / src / ui / panelcontextbuttonbar.cpp
index 03dfd1e..e6f544a 100644 (file)
 
 #include <QDebug>
 #include <QPainter>
+#include <QPropertyAnimation>
+#include <QSignalTransition>
+#include <QStateMachine>
 
 #include "panelcontextbuttonbar.h"
 
-const int CONTEXT_BUTTON_BAR_WIDTH = 78;
+const int PANEL_CONTEXT_BUTTON_BAR_WIDTH = 78;
 
 PanelContextButtonBar::PanelContextButtonBar(QWidget *parent)
     : QWidget(parent),
+      m_visible(false),
       m_contextButtons(0)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    setFixedWidth(PANEL_CONTEXT_BUTTON_BAR_WIDTH);
+
     m_barTile.load(":/res/images/panel_context_button_bar_tile.png");
     m_barTop.load(":/res/images/panel_context_button_bar_top.png");
 
-    setFixedWidth(CONTEXT_BUTTON_BAR_WIDTH);
+    // --- BAR ANIMATION ---
+    QStateMachine *stateMachine = new QStateMachine(this);
+
+    m_stateHidden = new QState(stateMachine);
+    m_stateVisible = new QState(stateMachine);
+
+    QPropertyAnimation *animation = new QPropertyAnimation(this, "pos", this);
+
+    stateMachine->setInitialState(m_stateHidden);
+
+    QSignalTransition *showSignalTransition = m_stateHidden->addTransition(this,
+                                                                           SIGNAL(toggleState()),
+                                                                           m_stateVisible);
+    showSignalTransition->addAnimation(animation);
+
+    QSignalTransition *hideSignalTransition = m_stateVisible->addTransition(this,
+                                                                            SIGNAL(toggleState()),
+                                                                            m_stateHidden);
+    hideSignalTransition->addAnimation(animation);
+
+    connect(animation, SIGNAL(finished()),
+            this, SLOT(contextButtonBarStateChanged()));
+
+    QPoint hiddenPosition(this->pos().x(), this->pos().y());
+    m_stateHidden->assignProperty(this, "pos", hiddenPosition);
+
+    QPoint visiblePosition(this->pos().x(), this->pos().y() - height());
+    m_stateVisible->assignProperty(this, "pos", visiblePosition);
+
+    stateMachine->start();
+}
+
+void PanelContextButtonBar::contextButtonBarStateChanged()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_visible)
+        emit barVisible();
+    else
+        emit barHidden();
+}
+
+void PanelContextButtonBar::hideContextButtonBar()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_visible) {
+        m_visible = false;
+        emit toggleState();
+    }
+}
+
+bool PanelContextButtonBar::isBarVisible() const
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    return m_visible;
 }
 
 void PanelContextButtonBar::paintEvent(QPaintEvent *event)
@@ -45,7 +107,6 @@ void PanelContextButtonBar::paintEvent(QPaintEvent *event)
     Q_UNUSED(event);
 
     const int CONTEXT_BUTTON_BAR_RECT_X = 0;
-
     const int CONTEXT_BUTTON_BAR_TOP_HEIGHT = 32;
     const int CONTEXT_BUTTON_BAR_TOP_X = 0;
     const int CONTEXT_BUTTON_BAR_TOP_Y = 0;
@@ -53,13 +114,39 @@ void PanelContextButtonBar::paintEvent(QPaintEvent *event)
     QPainter painter(this);
 
     m_barRect.setRect(CONTEXT_BUTTON_BAR_RECT_X, CONTEXT_BUTTON_BAR_TOP_HEIGHT,
-                      CONTEXT_BUTTON_BAR_WIDTH, height() - CONTEXT_BUTTON_BAR_TOP_HEIGHT);
+                      PANEL_CONTEXT_BUTTON_BAR_WIDTH, height() - CONTEXT_BUTTON_BAR_TOP_HEIGHT);
 
     painter.drawPixmap(CONTEXT_BUTTON_BAR_TOP_X, CONTEXT_BUTTON_BAR_TOP_Y, m_barTop);
     painter.drawTiledPixmap(m_barRect, m_barTile);
 
 }
 
+void PanelContextButtonBar::move(int x, int y)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_visible)
+        QWidget::move(x, y - height());
+    else
+        QWidget::move(x, y);
+
+    QPoint hiddenPosition(x, y);
+    m_stateHidden->assignProperty(this, "pos", hiddenPosition);
+
+    QPoint visiblePosition(x, y - height());
+    m_stateVisible->assignProperty(this, "pos", visiblePosition);
+}
+
+void PanelContextButtonBar::resizeEvent(QResizeEvent *event)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QWidget::resizeEvent(event);
+
+    QPoint visiblePosition(pos().x(), pos().y() - height());
+    m_stateVisible->assignProperty(this, "pos", visiblePosition);
+}
+
 void PanelContextButtonBar::setContextButtons(QWidget *contextButtons)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -74,6 +161,14 @@ void PanelContextButtonBar::setContextButtons(QWidget *contextButtons)
     m_contextButtons->setVisible(true);
 
     setFixedHeight(m_contextButtons->height());
+}
+
+void PanelContextButtonBar::showContextButtonBar()
+{
+    qDebug() << __PRETTY_FUNCTION__;
 
-    emit positionChangeRequested();
+    if (!m_visible) {
+        m_visible = true;
+        emit toggleState();
+    }
 }