Some minor cosmetic changes and removed an unnecessary constant from panelcommon.h
[situare] / src / ui / tabbedpanel.cpp
index 9bdd962..44a3fd0 100644 (file)
 
 #include <QDebug>
 #include <QPropertyAnimation>
+#include <QRegion>
 #include <QSignalTransition>
 #include <QStackedWidget>
 #include <QStateMachine>
 
 #include "panelbar.h"
+#include "panelbase.h"
 #include "panelcontentstack.h"
 #include "panelcontextbuttonbar.h"
 #include "paneltabbar.h"
 
 #include "tabbedpanel.h"
 
+const int PANEL_CONTEXT_BUTTON_BAR_LEFT_X = 1;
+const int PANEL_TAB_BAR_TOP_SPACING = 8;
+
 TabbedPanel::TabbedPanel(QWidget *parent)
     : QWidget(parent),
-      m_isOpen(false)
+      m_open(false),
+      m_closeRequestPending(false)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     const int PANEL_LEFT_X = 0;
     const int PANEL_TOP_Y = 0;
-    const int TAB_BAR_TOP_SPACING = 8;
 
     resize(PANEL_BAR_TABBED_WIDTH + PANEL_WIDTH, PANEL_HEIGHT);
     move(PANEL_CLOSED_X, PANEL_TOP_PADDING);
 
     // --- TABS ---
     m_panelTabBar = new PanelTabBar(this);
-    m_panelTabBar->move(PANEL_LEFT_X, TAB_BAR_TOP_SPACING);
+    m_panelTabBar->move(PANEL_LEFT_X, PANEL_TAB_BAR_TOP_SPACING);
 
     connect(m_panelTabBar, SIGNAL(currentChanged(int)),
             this, SLOT(setCurrentIndex(int)));
 
+    connect(m_panelTabBar, SIGNAL(sizeChangeRequested()),
+            this, SLOT(calculateMask()));
+
     connect(m_panelTabBar, SIGNAL(tabCloseRequested(int)),
              this, SLOT(closePanel()));
 
@@ -65,39 +73,48 @@ TabbedPanel::TabbedPanel(QWidget *parent)
 
     // --- CONTEXT BUTTON BAR ---
     m_panelContextButtonBar = new PanelContextButtonBar(this);
-    m_panelContextButtonBar->move(1, 300);
+    m_panelContextButtonBar->move(PANEL_CONTEXT_BUTTON_BAR_LEFT_X, PANEL_HEIGHT);
+
+    connect(m_panelContextButtonBar, SIGNAL(barHidden()),
+            this, SLOT(closePanel()));
+
+    connect(m_panelContextButtonBar, SIGNAL(positionChangeRequested()),
+            this, SLOT(repositionContextButtonBar()));
 
     // --- PANEL CONTENT ---
     m_panelContentStack = new PanelContentStack(this);
     m_panelContentStack->move(PANEL_TAB_WIDTH + PANEL_BAR_WIDTH, PANEL_TOP_Y);
 
     // --- PANEL ANIMATION ---
-    m_panelStateMachine = new QStateMachine(this);
+    QStateMachine *panelStateMachine = new QStateMachine(this);
 
-    m_panelStateClosed = new QState(m_panelStateMachine);
-    m_panelStateOpened = new QState(m_panelStateMachine);
+    m_stateClosed = new QState(panelStateMachine);
+    m_stateOpened = new QState(panelStateMachine);
 
-    m_panelAnimation = new QPropertyAnimation(this, "pos", this);
+    QPropertyAnimation *panelAnimation = new QPropertyAnimation(this, "pos", this);
 
-    m_panelStateMachine->setInitialState(m_panelStateClosed);
+    panelStateMachine->setInitialState(m_stateClosed);
 
-    m_panelTransitionOpen = m_panelStateClosed->addTransition(this, SIGNAL(toggleState()),
-                                                              m_panelStateOpened);
-    m_panelTransitionOpen->addAnimation(m_panelAnimation);
+    QSignalTransition *panelTransitionOpen = m_stateClosed->addTransition(this,
+                                                                          SIGNAL(toggleState()),
+                                                                          m_stateOpened);
+    panelTransitionOpen->addAnimation(panelAnimation);
 
-    m_panelTransitionClose = m_panelStateOpened->addTransition(this, SIGNAL(toggleState()),
-                                                               m_panelStateClosed);
-    m_panelTransitionClose->addAnimation(m_panelAnimation);
+    QSignalTransition *panelTransitionClose = m_stateOpened->addTransition(this,
+                                                                           SIGNAL(toggleState()),
+                                                                           m_stateClosed);
+    panelTransitionClose->addAnimation(panelAnimation);
 
-    connect(m_panelAnimation, SIGNAL(finished()),
+    connect(panelAnimation, SIGNAL(finished()),
             this, SLOT(stateChanged()));
 
-    m_panelStateClosed->assignProperty(this, "pos",
-                                       QPoint(PANEL_CLOSED_X, PANEL_TOP_PADDING));
-    m_panelStateOpened->assignProperty(this, "pos",
-                                       QPoint(PANEL_OPENED_X, PANEL_TOP_PADDING));
+    QPoint closedPosition(PANEL_CLOSED_X, PANEL_TOP_PADDING);
+    m_stateClosed->assignProperty(this, "pos", closedPosition);
+
+    QPoint openedPosition(PANEL_OPENED_X, PANEL_TOP_PADDING);
+    m_stateOpened->assignProperty(this, "pos", openedPosition);
 
-    m_panelStateMachine->start();
+    panelStateMachine->start();
 }
 
 int TabbedPanel::addTab(QWidget *widget, const QIcon& icon)
@@ -109,12 +126,46 @@ int TabbedPanel::addTab(QWidget *widget, const QIcon& icon)
     return insertTab(APPEND_INDEX, widget, icon);
 }
 
+void TabbedPanel::calculateMask()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QRect panelTabBarRect = m_panelTabBar->rect();
+    QRect panelContextButtonBarRect = m_panelContextButtonBar->rect();
+    int panelContextButtonBarY = height() - panelContextButtonBarRect.height();
+
+    if (!m_open)
+        panelContextButtonBarY = height();
+
+    QRegion panelTabBarRegion(0, PANEL_TAB_BAR_TOP_SPACING,
+                         panelTabBarRect.width(), panelTabBarRect.height());
+    QRegion panelContextButtonBarRegion(0, panelContextButtonBarY,
+                                      panelContextButtonBarRect.width(),
+                                      panelContextButtonBarRect.height());
+    QRegion panelContentRegion(panelTabBarRect.right() + 1, 0,
+                               PANEL_WIDTH, height());
+    QRegion panelRegion = panelTabBarRegion + panelContentRegion + panelContextButtonBarRegion;
+
+    setMask(panelRegion);
+}
+
 void TabbedPanel::closePanel()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    if (m_isOpen)
+    if (m_open) {
+        m_open = false;
+
+        if (m_panelContextButtonBar->isBarVisible()) {
+            m_closeRequestPending = true;
+            m_panelContextButtonBar->hideContextButtonBar();
+        } else {
+            emit toggleState();
+        }
+    } else if (m_closeRequestPending) {
+        m_closeRequestPending = false;
         emit toggleState();
+    }
 }
 
 int TabbedPanel::insertTab(int index, QWidget *widget, const QIcon& icon)
@@ -127,6 +178,20 @@ int TabbedPanel::insertTab(int index, QWidget *widget, const QIcon& icon)
     return index;
 }
 
+void TabbedPanel::openPanel(QWidget *widget)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (widget) {
+        m_panelTabBar->selectTab(m_panelContentStack->indexOf(widget));
+    } else if (!m_open) {
+        if (!m_closeRequestPending) {
+            m_open = true;
+            emit toggleState();
+        }
+    }
+}
+
 void TabbedPanel::removeTab(int index)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -137,6 +202,15 @@ void TabbedPanel::removeTab(int index)
     }
 }
 
+void TabbedPanel::repositionContextButtonBar()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_panelContextButtonBar->move(PANEL_CONTEXT_BUTTON_BAR_LEFT_X, height());
+    
+    calculateMask();
+}
+
 void TabbedPanel::resizePanel(const QSize &size)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -144,28 +218,25 @@ void TabbedPanel::resizePanel(const QSize &size)
     resize(PANEL_BAR_TABBED_WIDTH + PANEL_WIDTH,
            size.height() - PANEL_TOP_PADDING - PANEL_BOTTOM_PADDING);
 
-    if (!m_isOpen)
+    if (!m_open)
         move(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH, PANEL_TOP_PADDING);
     else
         move(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH - PANEL_WIDTH, PANEL_TOP_PADDING);
 
     m_panelBar->resizeBar(size);
 
+    m_panelContextButtonBar->move(PANEL_CONTEXT_BUTTON_BAR_LEFT_X, size.height());
+
     m_panelContentStack->resizeContentStack(size);
 
     QPoint closedPosition(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH, PANEL_TOP_PADDING);
-    m_panelStateClosed->assignProperty(this, "pos", closedPosition);
+    m_stateClosed->assignProperty(this, "pos", closedPosition);
 
     QPoint openedPosition(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH - PANEL_WIDTH,
                           PANEL_TOP_PADDING);
-    m_panelStateOpened->assignProperty(this, "pos", openedPosition);
-}
+    m_stateOpened->assignProperty(this, "pos", openedPosition);
 
-void TabbedPanel::showPanel(QWidget *widget)
-{
-    qDebug() << __PRETTY_FUNCTION__;
-
-    m_panelTabBar->selectTab(m_panelContentStack->indexOf(widget));
+    calculateMask();
 }
 
 void TabbedPanel::setCurrentIndex(int index)
@@ -175,8 +246,11 @@ void TabbedPanel::setCurrentIndex(int index)
     if ((index < m_panelContentStack->count()) && (index >= 0)) {
         m_panelContentStack->setCurrentIndex(index);
 
-        if (!m_isOpen)
-            emit toggleState();
+        if (!m_open)
+            openPanel();
+
+        m_panelContextButtonBar->setContextButtons(
+                static_cast<PanelBase *>(m_panelContentStack->widget(index))->contextButtons());
 
         emit currentChanged(index);
     }
@@ -186,11 +260,12 @@ void TabbedPanel::stateChanged()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    if (!m_isOpen) {
-        m_isOpen = true;
+    calculateMask();
+
+    if (m_open) {
+        m_panelContextButtonBar->showContextButtonBar();
         emit panelOpened();
     } else {
-        m_isOpen = false;
         emit panelClosed();
     }
 }