Merge branch 'new_panels' of https://vcs.maemo.org/git/situare into new_panels
[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 "panelcontent.h"
31 #include "paneltabbar.h"
32
33 #include "tabbedpanel.h"
34
35 TabbedPanel::TabbedPanel(QWidget *parent)
36     : QWidget(parent),
37       m_isOpen(false)
38 {
39     qDebug() << __PRETTY_FUNCTION__;
40
41     resize(PANEL_BAR_TABBED_WIDTH + PANEL_WIDTH, PANEL_HEIGHT);
42     move(PANEL_CLOSED_X, PANEL_TOP_PADDING);
43
44     // --- TABS ---
45     m_panelWidgetStack = new QStackedWidget(this);
46
47     m_panelTabBar = new PanelTabBar(this);
48
49     connect(m_panelTabBar, SIGNAL(currentChanged(int)),
50             this, SLOT(setCurrentIndex(int)));
51
52     connect(m_panelTabBar, SIGNAL(tabCloseRequested(int)),
53              this, SLOT(closePanel()));
54
55     connect(this, SIGNAL(panelClosed()),
56             m_panelTabBar, SLOT(deselectTabs()));
57
58     // --- BAR ---
59     m_panelBar = new PanelBar(this);
60     m_panelBar->move(PANEL_TAB_WIDTH, 0);
61
62     // --- PANEL CONTENT ---
63     m_panelContent = new PanelContent(this);
64     m_panelContent->setContentWidget(m_panelWidgetStack);
65     m_panelContent->move(PANEL_TAB_WIDTH + PANEL_BAR_WIDTH, 0);
66
67     // --- PANEL ANIMATION ---
68     m_panelStateMachine = new QStateMachine(this);
69
70     m_panelStateClosed = new QState(m_panelStateMachine);
71     m_panelStateOpened = new QState(m_panelStateMachine);
72
73     m_panelAnimation = new QPropertyAnimation(this, "pos", this);
74
75     m_panelStateMachine->setInitialState(m_panelStateClosed);
76
77     m_panelTransitionOpen = m_panelStateClosed->addTransition(this, SIGNAL(toggleState()),
78                                                               m_panelStateOpened);
79     m_panelTransitionOpen->addAnimation(m_panelAnimation);
80
81     m_panelTransitionClose = m_panelStateOpened->addTransition(this, SIGNAL(toggleState()),
82                                                                m_panelStateClosed);
83     m_panelTransitionClose->addAnimation(m_panelAnimation);
84
85     connect(m_panelAnimation, SIGNAL(finished()),
86             this, SLOT(stateChanged()));
87
88     m_panelStateClosed->assignProperty(this, "pos",
89                                        QPoint(PANEL_CLOSED_X, PANEL_TOP_PADDING));
90     m_panelStateOpened->assignProperty(this, "pos",
91                                        QPoint(PANEL_OPENED_X, PANEL_TOP_PADDING));
92
93     m_panelStateMachine->start();
94 }
95
96 int TabbedPanel::addTab(QWidget *widget, const QIcon& icon)
97 {
98     qDebug() << __PRETTY_FUNCTION__;
99
100
101     const int APPEND_INDEX = -1;
102
103     return insertTab(APPEND_INDEX, widget, icon);
104 }
105
106 void TabbedPanel::closePanel()
107 {
108     qDebug() << __PRETTY_FUNCTION__;
109
110     if(m_isOpen)
111         emit toggleState();
112 }
113
114 int TabbedPanel::insertTab(int index, QWidget *widget, const QIcon& icon)
115 {
116     qDebug() << __PRETTY_FUNCTION__;
117
118     index = m_panelWidgetStack->insertWidget(index, widget);
119     m_panelTabBar->insertTab(index, icon);
120
121     return index;
122 }
123
124 void TabbedPanel::removeTab(int index)
125 {
126     qDebug() << __PRETTY_FUNCTION__;
127
128     if(QWidget *widget = m_panelWidgetStack->widget(index)) {
129         m_panelWidgetStack->removeWidget(widget);
130         m_panelTabBar->removeTab(index);
131     }
132 }
133
134 void TabbedPanel::resizePanel(const QSize &size)
135 {
136     qDebug() << __PRETTY_FUNCTION__;
137
138     resize(PANEL_BAR_TABBED_WIDTH + PANEL_WIDTH,
139            size.height() - PANEL_TOP_PADDING - PANEL_BOTTOM_PADDING);
140
141     if (!m_isOpen)
142         move(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH, PANEL_TOP_PADDING);
143     else
144         move(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH - PANEL_WIDTH, PANEL_TOP_PADDING);
145
146     m_panelBar->resizeBar(size);
147
148     m_panelContent->resizePanelContent(size);
149
150     QPoint closedPosition(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH, PANEL_TOP_PADDING);
151     m_panelStateClosed->assignProperty(this, "pos", closedPosition);
152
153     QPoint openedPosition(size.width() - PANEL_TAB_WIDTH - PANEL_BAR_WIDTH - PANEL_WIDTH,
154                           PANEL_TOP_PADDING);
155     m_panelStateOpened->assignProperty(this, "pos", openedPosition);
156
157 }
158
159 void TabbedPanel::showPanel(QWidget *widget)
160 {
161     qDebug() << __PRETTY_FUNCTION__;
162
163     m_panelTabBar->selectTab(m_panelWidgetStack->indexOf(widget));
164 }
165
166 void TabbedPanel::setCurrentIndex(int index)
167 {
168     qDebug() << __PRETTY_FUNCTION__;
169
170     if ((index < m_panelWidgetStack->count()) && (index >= 0)) {
171         m_panelWidgetStack->setCurrentIndex(index);
172
173         if(!m_isOpen)
174             emit toggleState();
175
176         emit currentChanged(index);
177     }
178 }
179
180 void TabbedPanel::stateChanged()
181 {
182     qDebug() << __PRETTY_FUNCTION__;
183
184     if(!m_isOpen) {
185         m_isOpen = true;
186         emit panelOpened();
187     } else {
188         m_isOpen = false;
189         emit panelClosed();
190     }
191 }