2 Situare - A location system for Facebook
3 Copyright (C) 2010 Ixonos Plc. Authors:
5 Kaj Wallin - kaj.wallin@ixonos.com
6 Pekka Nissinen - pekka.nissinen@ixonos.com
8 Situare is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 version 2 as published by the Free Software Foundation.
12 Situare is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Situare; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
24 #include <QPropertyAnimation>
25 #include <QSignalTransition>
26 #include <QStackedWidget>
27 #include <QStateMachine>
30 #include "panelbase.h"
31 #include "panelcontentstack.h"
32 #include "panelcontextbuttonbar.h"
33 #include "paneltabbar.h"
35 #include "tabbedpanel.h"
37 const int PANEL_CONTEXT_BUTTON_BAR_LEFT_X = 0;
39 TabbedPanel::TabbedPanel(QWidget *parent)
43 qDebug() << __PRETTY_FUNCTION__;
45 const int PANEL_LEFT_X = 0;
46 const int PANEL_TOP_Y = 0;
47 const int PANEL_TAB_BAR_TOP_SPACING = 8;
49 resize(PANEL_BAR_TABBED_WIDTH + PANEL_WIDTH, PANEL_HEIGHT);
50 move(PANEL_CLOSED_X, PANEL_TOP_PADDING);
53 m_panelTabBar = new PanelTabBar(this);
54 m_panelTabBar->move(PANEL_LEFT_X, PANEL_TAB_BAR_TOP_SPACING);
56 connect(m_panelTabBar, SIGNAL(currentChanged(int)),
57 this, SLOT(setCurrentIndex(int)));
59 connect(m_panelTabBar, SIGNAL(tabCloseRequested(int)),
60 this, SLOT(closePanel()));
62 connect(this, SIGNAL(panelClosed()),
63 m_panelTabBar, SLOT(deselectTabs()));
66 m_panelBar = new PanelBar(this);
67 m_panelBar->move(PANEL_TAB_WIDTH, PANEL_TOP_Y);
69 // --- CONTEXT BUTTON BAR ---
70 m_panelContextButtonBar = new PanelContextButtonBar(this);
71 m_panelContextButtonBar->setVisible(false);
72 m_panelContextButtonBar->move(PANEL_CONTEXT_BUTTON_BAR_LEFT_X,
73 PANEL_HEIGHT - m_panelContextButtonBar->height());
75 connect(m_panelContextButtonBar, SIGNAL(positionChangeRequested()),
76 this, SLOT(repositionContextButtonBar()));
78 connect(this, SIGNAL(panelOpened()),
79 this, SLOT(showContextButtonBar()));
81 connect(this, SIGNAL(panelClosed()),
82 this, SLOT(hideContextButtonBar()));
84 // --- PANEL CONTENT ---
85 m_panelContentStack = new PanelContentStack(this);
86 m_panelContentStack->move(PANEL_TAB_WIDTH + PANEL_BAR_WIDTH, PANEL_TOP_Y);
88 // --- PANEL ANIMATION ---
89 m_panelStateMachine = new QStateMachine(this);
91 m_panelStateClosed = new QState(m_panelStateMachine);
92 m_panelStateOpened = new QState(m_panelStateMachine);
94 m_panelAnimation = new QPropertyAnimation(this, "pos", this);
96 m_panelStateMachine->setInitialState(m_panelStateClosed);
98 m_panelTransitionOpen = m_panelStateClosed->addTransition(this, SIGNAL(toggleState()),
100 m_panelTransitionOpen->addAnimation(m_panelAnimation);
102 m_panelTransitionClose = m_panelStateOpened->addTransition(this, SIGNAL(toggleState()),
104 m_panelTransitionClose->addAnimation(m_panelAnimation);
106 connect(m_panelAnimation, SIGNAL(finished()),
107 this, SLOT(stateChanged()));
109 m_panelStateClosed->assignProperty(this, "pos",
110 QPoint(PANEL_CLOSED_X, PANEL_TOP_PADDING));
111 m_panelStateOpened->assignProperty(this, "pos",
112 QPoint(PANEL_OPENED_X, PANEL_TOP_PADDING));
114 m_panelStateMachine->start();
117 int TabbedPanel::addTab(QWidget *widget, const QIcon& icon)
119 qDebug() << __PRETTY_FUNCTION__;
121 const int APPEND_INDEX = -1;
123 return insertTab(APPEND_INDEX, widget, icon);
126 void TabbedPanel::closePanel()
128 qDebug() << __PRETTY_FUNCTION__;
134 int TabbedPanel::insertTab(int index, QWidget *widget, const QIcon& icon)
136 qDebug() << __PRETTY_FUNCTION__;
138 index = m_panelContentStack->insertWidget(index, widget);
139 m_panelTabBar->insertTab(index, icon);
144 void TabbedPanel::removeTab(int index)
146 qDebug() << __PRETTY_FUNCTION__;
148 if (QWidget *widget = m_panelContentStack->widget(index)) {
149 m_panelContentStack->removeWidget(widget);
150 m_panelTabBar->removeTab(index);
154 void TabbedPanel::repositionContextButtonBar()
156 qDebug() << __PRETTY_FUNCTION__;
158 m_panelContextButtonBar->move(PANEL_CONTEXT_BUTTON_BAR_LEFT_X,
159 height() - m_panelContextButtonBar->height());
162 void TabbedPanel::resizePanel(const QSize &size)
164 qDebug() << __PRETTY_FUNCTION__;
166 resize(PANEL_BAR_TABBED_WIDTH + PANEL_WIDTH,
167 size.height() - PANEL_TOP_PADDING - PANEL_BOTTOM_PADDING);
170 move(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH, PANEL_TOP_PADDING);
172 move(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH - PANEL_WIDTH, PANEL_TOP_PADDING);
174 m_panelBar->resizeBar(size);
176 m_panelContextButtonBar->move(PANEL_CONTEXT_BUTTON_BAR_LEFT_X,
177 size.height() - m_panelContextButtonBar->height());
179 m_panelContentStack->resizeContentStack(size);
181 QPoint closedPosition(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH, PANEL_TOP_PADDING);
182 m_panelStateClosed->assignProperty(this, "pos", closedPosition);
184 QPoint openedPosition(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH - PANEL_WIDTH,
186 m_panelStateOpened->assignProperty(this, "pos", openedPosition);
189 void TabbedPanel::setCurrentIndex(int index)
191 qDebug() << __PRETTY_FUNCTION__;
193 if ((index < m_panelContentStack->count()) && (index >= 0)) {
194 m_panelContentStack->setCurrentIndex(index);
199 m_panelContextButtonBar->setContextButtons(
200 static_cast<PanelBase *>(m_panelContentStack->widget(index))->contextButtons());
202 emit currentChanged(index);
206 void TabbedPanel::showPanel(QWidget *widget)
208 qDebug() << __PRETTY_FUNCTION__;
210 m_panelTabBar->selectTab(m_panelContentStack->indexOf(widget));
213 void TabbedPanel::stateChanged()
215 qDebug() << __PRETTY_FUNCTION__;
219 m_panelContextButtonBar->setVisible(true);
223 m_panelContextButtonBar->setVisible(false);