Changed bar width to width of four buttons, review
[situare] / src / ui / listitemcontextbuttonbar.cpp
index 96c0b75..7103244 100644 (file)
@@ -20,6 +20,8 @@
 */
 
 #include <QDebug>
+#include <QLayout>
+#include <QPainter>
 #include <QPropertyAnimation>
 #include <QStateMachine>
 
@@ -36,6 +38,31 @@ ListItemContextButtonBar::ListItemContextButtonBar(QWidget *parent) :
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    // --- BAR LOOK ---
+    const int BAR_HEIGHT = 78;
+    setFixedHeight(BAR_HEIGHT);
+
+    const int BUTTON_WIDTH = 74;
+    const int BUTTON_COUNT = 4;
+    const int HORIZONTAL_MARGIN = 10;
+    setFixedWidth(BUTTON_COUNT * BUTTON_WIDTH + 2 * HORIZONTAL_MARGIN);
+
+    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");
+
+    // --- LAYOUT ---
+    m_barLayout = new QHBoxLayout();
+    setLayout(m_barLayout);
+    m_barLayout->setContentsMargins(0, 0, 0, 0);
+
+    // --- SET POSITION ---
+    // 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 - width() / 2;
+    move(PANEL_TAB_BAR_WIDTH + PANEL_BAR_WIDTH + FROM_PANEL_CONTENTS_LEFT, -size().height());
+
+    // --- ANIMATION ---
     const int ANIMATION_DURATION_MS = 150;
 
     m_animation = new QPropertyAnimation(this, "pos", this);
@@ -43,38 +70,51 @@ ListItemContextButtonBar::ListItemContextButtonBar(QWidget *parent) :
 
     connect(m_animation, SIGNAL(finished()),
             this, SLOT(onAnimationFinished()));
+
+    // target values for animations
+    m_animation->setStartValue(pos());
+    const int Y = 0;
+    m_animation->setEndValue(QPoint(pos().x(), Y));
+}
+
+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()
 {
-    qWarning() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     Q_ASSERT(m_animation->state() == QAbstractAnimation::Stopped);
 
-    // Hide previous buttons (if any)
-    if (m_contextButtons)
+    if (!isVisible())
+        show();
+
+    // Remove old buttons (if any)
+    if (m_contextButtons) {
+        m_barLayout->removeWidget(m_contextButtons);
         m_contextButtons->setParent(0);
+    }
 
     m_contextButtons = m_newContextButtons;
     m_newContextButtons = 0;
-    m_contextButtons->setParent(this);
-    m_contextButtons->show();
-    setFixedSize(m_contextButtons->size());
 
-    // 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));
+    m_barLayout->addWidget(m_contextButtons, 0, Qt::AlignHCenter);
 }
 
 void ListItemContextButtonBar::hideContextButtonBar()
 {
-    qWarning() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     m_state = StateClosing;
     m_animation->setDirection(QAbstractAnimation::Backward);
@@ -83,7 +123,7 @@ void ListItemContextButtonBar::hideContextButtonBar()
 
 void ListItemContextButtonBar::onAnimationFinished()
 {
-    qWarning() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     if (m_animation->direction() == QAbstractAnimation::Backward) {
         m_state = StateHidden;
@@ -101,21 +141,42 @@ void ListItemContextButtonBar::onAnimationFinished()
 
 void ListItemContextButtonBar::onListItemSelectionChanged(bool itemIsSelected)
 {
-    qWarning() << __PRETTY_FUNCTION__;
+    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__;
 
-    /// @todo m_waitForOpen is not cleared if item selection is removed while waiting
+    Q_UNUSED(event);
 
-    if (m_newContextButtons)
-        m_waitForOpen = true;
-    else if (itemIsSelected && (m_state != StateVisible))
-        showContextButtonBar();
-    else if (!itemIsSelected && (m_state != StateHidden))
-        hideContextButtonBar();
+    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)
 {
-    qWarning() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
     m_newContextButtons = contextButtons;
     m_waitForOpen = false;
@@ -128,9 +189,11 @@ void ListItemContextButtonBar::setContextButtons(QWidget *contextButtons)
 
 void ListItemContextButtonBar::showContextButtonBar()
 {
-    qWarning() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
 
-    m_state = StateOpening;
-    m_animation->setDirection(QAbstractAnimation::Forward);
-    m_animation->start();
+    if (m_contextButtons->layout()->count() > 0) {
+        m_state = StateOpening;
+        m_animation->setDirection(QAbstractAnimation::Forward);
+        m_animation->start();
+    }
 }