Merge branch 'master' of https://vcs.maemo.org/git/situare
[situare] / src / ui / listitemcontextbuttonbar.cpp
diff --git a/src/ui/listitemcontextbuttonbar.cpp b/src/ui/listitemcontextbuttonbar.cpp
new file mode 100644 (file)
index 0000000..d7b6551
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+    Situare - A location system for Facebook
+    Copyright (C) 2010  Ixonos Plc. Authors:
+
+        Sami Rämö - sami.ramo@ixonos.com
+
+    Situare is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Situare is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Situare; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+    USA.
+*/
+
+#include <QDebug>
+#include <QLayout>
+#include <QPainter>
+#include <QPropertyAnimation>
+#include <QStateMachine>
+
+#include "panelcommon.h"
+
+#include "listitemcontextbuttonbar.h"
+
+ListItemContextButtonBar::ListItemContextButtonBar(QWidget *parent) :
+    QWidget(parent),
+    m_waitForOpen(false),
+    m_contextButtons(0),
+    m_newContextButtons(0),
+    m_state(StateHidden)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    // --- BAR LOOK ---
+    const int BAR_HEIGHT = 78;
+    setFixedHeight(BAR_HEIGHT);
+
+    m_backgroundLeft = new QPixmap(":/res/images/list_item_context_button_bar_left.png");
+    m_backgroundMiddle = new QPixmap(":/res/images/list_item_context_button_bar_tile.png");
+    m_backgroundRight = new QPixmap(":/res/images/list_item_context_button_bar_right.png");
+
+    // --- ANIMATION ---
+    const int ANIMATION_DURATION_MS = 150;
+
+    m_animation = new QPropertyAnimation(this, "pos", this);
+    m_animation->setDuration(ANIMATION_DURATION_MS);
+
+    connect(m_animation, SIGNAL(finished()),
+            this, SLOT(onAnimationFinished()));
+}
+
+ListItemContextButtonBar::~ListItemContextButtonBar()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_backgroundLeft)
+        delete m_backgroundLeft;
+
+    if (m_backgroundMiddle)
+        delete m_backgroundMiddle;
+
+    if (m_backgroundRight)
+        delete m_backgroundRight;
+}
+
+void ListItemContextButtonBar::changeButtons()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    Q_ASSERT(m_animation->state() == QAbstractAnimation::Stopped);
+
+    if (!isVisible())
+        show();
+
+    // Hide previous buttons (if any)
+    if (m_contextButtons)
+        m_contextButtons->setParent(0);
+
+    m_contextButtons = m_newContextButtons;
+    m_newContextButtons = 0;
+    m_contextButtons->setParent(this);
+    m_contextButtons->show();
+    setFixedWidth(m_contextButtons->width());
+
+    // 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;
+    m_animation->setEndValue(QPoint(pos().x(), Y));
+}
+
+void ListItemContextButtonBar::hideContextButtonBar()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_state = StateClosing;
+    m_animation->setDirection(QAbstractAnimation::Backward);
+    m_animation->start();
+}
+
+void ListItemContextButtonBar::onAnimationFinished()
+{
+    qDebug() << __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)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (itemIsSelected) {
+        if (m_newContextButtons)
+            m_waitForOpen = true;
+        else if (m_state != StateVisible)
+            showContextButtonBar();
+    } else {
+        if (m_newContextButtons)
+            m_waitForOpen = false;
+        else if (m_state != StateHidden)
+            hideContextButtonBar();
+    }
+}
+
+void ListItemContextButtonBar::paintEvent(QPaintEvent *event)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    Q_UNUSED(event);
+
+    QPainter painter(this);
+
+    const int TOP = 0;
+    const int LEFT = 0;
+    painter.drawPixmap(TOP, LEFT, *m_backgroundLeft);
+    painter.drawTiledPixmap(m_backgroundLeft->width(), TOP,
+                            width() - m_backgroundLeft->width() - m_backgroundRight->width(),
+                            height(),
+                            *m_backgroundMiddle);
+    painter.drawPixmap(width() - m_backgroundRight->width(), TOP, *m_backgroundRight);
+}
+
+void ListItemContextButtonBar::setContextButtons(QWidget *contextButtons)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_newContextButtons = contextButtons;
+    m_waitForOpen = false;
+
+    if (m_state != StateHidden)
+        hideContextButtonBar();
+    else
+        changeButtons();
+}
+
+void ListItemContextButtonBar::showContextButtonBar()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_contextButtons->layout()->count() > 0) {
+        m_state = StateOpening;
+        m_animation->setDirection(QAbstractAnimation::Forward);
+        m_animation->start();
+    }
+}