*/
#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();
}