Forgot the remove unused signal/slot connections *sigh*
[situare] / src / ui / tabbedpanel.cpp
1 /*
2     Situare - A location system for Facebook
3     Copyright (C) 2010  Ixonos Plc. Authors:
4
5         Kaj Wallin - kaj.wallin@ixonos.com
6         Pekka Nissinen - pekka.nissinen@ixonos.com
7
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.
11
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.
16
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,
20     USA.
21 */
22
23 #include <QDebug>
24 #include <QPropertyAnimation>
25 #include <QSignalTransition>
26 #include <QStackedWidget>
27 #include <QStateMachine>
28
29 #include "panelbar.h"
30 #include "panelbase.h"
31 #include "panelcontentstack.h"
32 #include "panelcontextbuttonbar.h"
33 #include "paneltabbar.h"
34
35 #include "tabbedpanel.h"
36
37 const int PANEL_CONTEXT_BUTTON_BAR_LEFT_X = 1;
38
39 TabbedPanel::TabbedPanel(QWidget *parent)
40     : QWidget(parent),
41       m_isOpen(false)
42 {
43     qDebug() << __PRETTY_FUNCTION__;
44
45     const int PANEL_LEFT_X = 0;
46     const int PANEL_TOP_Y = 0;
47     const int PANEL_TAB_BAR_TOP_SPACING = 8;
48
49     resize(PANEL_BAR_TABBED_WIDTH + PANEL_WIDTH, PANEL_HEIGHT);
50     move(PANEL_CLOSED_X, PANEL_TOP_PADDING);
51
52     // --- TABS ---
53     m_panelTabBar = new PanelTabBar(this);
54     m_panelTabBar->move(PANEL_LEFT_X, PANEL_TAB_BAR_TOP_SPACING);
55
56     connect(m_panelTabBar, SIGNAL(currentChanged(int)),
57             this, SLOT(setCurrentIndex(int)));
58
59     connect(m_panelTabBar, SIGNAL(tabCloseRequested(int)),
60              this, SLOT(closePanel()));
61
62     connect(this, SIGNAL(panelClosed()),
63             m_panelTabBar, SLOT(deselectTabs()));
64
65     // --- BAR ---
66     m_panelBar = new PanelBar(this);
67     m_panelBar->move(PANEL_TAB_WIDTH, PANEL_TOP_Y);
68
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());
74
75     connect(m_panelContextButtonBar, SIGNAL(positionChangeRequested()),
76             this, SLOT(repositionContextButtonBar()));
77
78     // --- PANEL CONTENT ---
79     m_panelContentStack = new PanelContentStack(this);
80     m_panelContentStack->move(PANEL_TAB_WIDTH + PANEL_BAR_WIDTH, PANEL_TOP_Y);
81
82     // --- PANEL ANIMATION ---
83     m_panelStateMachine = new QStateMachine(this);
84
85     m_panelStateClosed = new QState(m_panelStateMachine);
86     m_panelStateOpened = new QState(m_panelStateMachine);
87
88     m_panelAnimation = new QPropertyAnimation(this, "pos", this);
89
90     m_panelStateMachine->setInitialState(m_panelStateClosed);
91
92     m_panelTransitionOpen = m_panelStateClosed->addTransition(this, SIGNAL(toggleState()),
93                                                               m_panelStateOpened);
94     m_panelTransitionOpen->addAnimation(m_panelAnimation);
95
96     m_panelTransitionClose = m_panelStateOpened->addTransition(this, SIGNAL(toggleState()),
97                                                                m_panelStateClosed);
98     m_panelTransitionClose->addAnimation(m_panelAnimation);
99
100     connect(m_panelAnimation, SIGNAL(finished()),
101             this, SLOT(stateChanged()));
102
103     m_panelStateClosed->assignProperty(this, "pos",
104                                        QPoint(PANEL_CLOSED_X, PANEL_TOP_PADDING));
105     m_panelStateOpened->assignProperty(this, "pos",
106                                        QPoint(PANEL_OPENED_X, PANEL_TOP_PADDING));
107
108     m_panelStateMachine->start();
109 }
110
111 int TabbedPanel::addTab(QWidget *widget, const QIcon& icon)
112 {
113     qDebug() << __PRETTY_FUNCTION__;
114
115     const int APPEND_INDEX = -1;
116
117     return insertTab(APPEND_INDEX, widget, icon);
118 }
119
120 void TabbedPanel::closePanel()
121 {
122     qDebug() << __PRETTY_FUNCTION__;
123
124     if (m_isOpen)
125         emit toggleState();
126 }
127
128 int TabbedPanel::insertTab(int index, QWidget *widget, const QIcon& icon)
129 {
130     qDebug() << __PRETTY_FUNCTION__;
131
132     index = m_panelContentStack->insertWidget(index, widget);
133     m_panelTabBar->insertTab(index, icon);
134
135     return index;
136 }
137
138 void TabbedPanel::removeTab(int index)
139 {
140     qDebug() << __PRETTY_FUNCTION__;
141
142     if (QWidget *widget = m_panelContentStack->widget(index)) {
143         m_panelContentStack->removeWidget(widget);
144         m_panelTabBar->removeTab(index);
145     }
146 }
147
148 void TabbedPanel::repositionContextButtonBar()
149 {
150     qDebug() << __PRETTY_FUNCTION__;
151
152     m_panelContextButtonBar->move(PANEL_CONTEXT_BUTTON_BAR_LEFT_X,
153                                   height() - m_panelContextButtonBar->height());
154 }
155
156 void TabbedPanel::resizePanel(const QSize &size)
157 {
158     qDebug() << __PRETTY_FUNCTION__;
159
160     resize(PANEL_BAR_TABBED_WIDTH + PANEL_WIDTH,
161            size.height() - PANEL_TOP_PADDING - PANEL_BOTTOM_PADDING);
162
163     if (!m_isOpen)
164         move(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH, PANEL_TOP_PADDING);
165     else
166         move(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH - PANEL_WIDTH, PANEL_TOP_PADDING);
167
168     m_panelBar->resizeBar(size);
169
170     m_panelContextButtonBar->move(PANEL_CONTEXT_BUTTON_BAR_LEFT_X,
171                                   size.height() - m_panelContextButtonBar->height());
172
173     m_panelContentStack->resizeContentStack(size);
174
175     QPoint closedPosition(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH, PANEL_TOP_PADDING);
176     m_panelStateClosed->assignProperty(this, "pos", closedPosition);
177
178     QPoint openedPosition(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH - PANEL_WIDTH,
179                           PANEL_TOP_PADDING);
180     m_panelStateOpened->assignProperty(this, "pos", openedPosition);
181 }
182
183 void TabbedPanel::setCurrentIndex(int index)
184 {
185     qDebug() << __PRETTY_FUNCTION__;
186
187     if ((index < m_panelContentStack->count()) && (index >= 0)) {
188         m_panelContentStack->setCurrentIndex(index);
189
190         if (!m_isOpen)
191             emit toggleState();
192
193         m_panelContextButtonBar->setContextButtons(
194                 static_cast<PanelBase *>(m_panelContentStack->widget(index))->contextButtons());
195
196         emit currentChanged(index);
197     }
198 }
199
200 void TabbedPanel::showPanel(QWidget *widget)
201 {
202     qDebug() << __PRETTY_FUNCTION__;
203
204     m_panelTabBar->selectTab(m_panelContentStack->indexOf(widget));
205 }
206
207 void TabbedPanel::stateChanged()
208 {
209     qDebug() << __PRETTY_FUNCTION__;
210
211     if (!m_isOpen) {
212         m_isOpen = true;
213         m_panelContextButtonBar->setVisible(true);
214         emit panelOpened();
215     } else {
216         m_isOpen = false;
217         m_panelContextButtonBar->setVisible(false);
218         emit panelClosed();
219     }
220 }