1 #ifndef Header_TitlePanel
2 #define Header_TitlePanel
3
4 #include "mostQtHeaders.h"
5 //#include "animatedsplitter.h"
6
7 class TitledPanelPage;
Q_DECLARE_METATYPE(TitledPanelPage *)8 Q_DECLARE_METATYPE(TitledPanelPage *)
9
10 class TitledPanelPage : public QObject
11 {
12 Q_OBJECT
13
14 friend class TitledPanel;
15
16 public:
17 TitledPanelPage(QWidget *widget, const QString &id, const QString &title, const QIcon &icon = QIcon());
18 ~TitledPanelPage();
19
20 void addToolbarAction(QAction *act);
21 void addToolbarActions(const QList<QAction *>& actions);
22
23 inline QString id() const;
24 QWidget *widget();
25 bool visible() const;
26
27 static TitledPanelPage *fromId(const QString &id);
28 static void updatePageTitle(const QString &id, const QString& newTitle);
29
30 signals:
31 void titleChanged(QString);
32 void iconChanged(QIcon);
33
34 public slots:
35 void setTitle(const QString &title);
36 void setIcon(const QIcon &icon);
37
38 private:
39 static QHash<QString, TitledPanelPage *> allPages;
40
41 QString m_id;
42 QString m_title;
43 QIcon m_icon;
44 QWidget *m_widget;
45
46 QAction *m_visibleAction;
47 QAction *m_selectAction;
48 QList<QAction *> *m_toolbarActions;
49 };
50
51
52 class TitledPanel : public QFrame
53 {
54 Q_OBJECT
55
56 public:
57 explicit TitledPanel(QWidget *parent = 0);
58
59 enum PageSelectorStyle {ComboSelector, TabSelector};
60 void appendPage(TitledPanelPage *page, bool guiUpdate = true);
61 void removePage(TitledPanelPage *page, bool guiUpdate = true);
62 int pageCount() const;
63 TitledPanelPage *pageFromId(const QString &id);
64
65 void setHiddenPageIds(const QStringList &hidden);
66 QStringList hiddenPageIds() const;
67
68 TitledPanelPage *currentPage() const;
69 QString currentPageId() const;
70 void showPage(const QString &id);
71 void setCurrentPage(const QString &id);
72 QAction *toggleViewAction() const;
73
74 void setSelectorStyle(PageSelectorStyle style);
75
76 signals:
77 void widgetContextMenuRequested(QWidget *widget, const QPoint &globalPosition);
78 void pageChanged(const QString &id);
79
80 public slots:
81 virtual void setVisible(bool visible);
82 void updateTopbar();
83
84 private slots:
viewToggled(bool visible)85 void viewToggled(bool visible) { setVisible(visible); }
86
87 void updatePageSelector(TitledPanelPage *page = 0);
88 void onPageTitleChange();
89 void onPageIconChange();
90
91 void setActivePageFromAction();
92 void setActivePageFromComboBox(int index);
93 void setActivePageFromTabBar(int index);
94 void togglePageVisibleFromAction(bool on);
95 //void updateToolbarForResizing(CollapseState clState);
96 void customContextMenuRequested(const QPoint &localPosition);
97
98 protected:
99 QAction *mToggleViewAction;
100 QAction *closeAction;
101
102 private:
103 QStringList mHiddenPageIds;
104 QActionGroup *pageSelectActions; // only for visible widgets
105 QList<QWidget *> widgets;
106
107 // visual elements
108 PageSelectorStyle selectorStyle;
109 QVBoxLayout *vLayout; // containing title bar and contents
110 QToolBar *topbar;
111 QLabel *lbTopbarLabel;
112 QComboBox *cbTopbarSelector;
113 QTabBar *tbTopbarSelector;
114
115 QStackedWidget *stack;
116
117 QList<TitledPanelPage *> pages;
118 };
119
120 /*** class AutoCollapsingTitledPanel ***/
121 /*
122 class AutoCollapsingTitledPanel: public TitledPanel {
123 Q_OBJECT
124 public:
125 enum CollapseState {Expanded, Collapsed, Expanding, Collapsing};
126
127 explicit AutoCollapsingTitledPanel(QWidget *parent=0) :
128 TitledPanel(parent), expandedWidth(100), clState(Expanded), mCollapsingEnabled(false), mAnimatedMotion(false)
129 {
130 containingSplitter = qobject_cast<AnimatedSplitter *>(parent);
131 if (containingSplitter)
132 connect(containingSplitter, SIGNAL(animationFinished()), this, SLOT(sizingFinished()));
133 }
134 bool animatedMotion() const {return mAnimatedMotion;}
135 bool collapsingEnabled() const {return mCollapsingEnabled;}
136 bool collapsed() const {return clState == Collapsed;}
137 void setCollapsed(bool collapse) {
138 if (!mCollapsingEnabled) return;
139 switch (clState) {
140 case Expanded:
141 if (collapse) {
142 expandedWidth = width();
143 triggerResize(Collapsing);
144 }
145 break;
146 case Expanding:
147 if (collapse) {
148 // TODO: stop the animation and start collapsing
149 qDebug() << "wah";
150 }
151 break;
152 case Collapsed:
153 if (!collapse) {
154 triggerResize(Expanding);
155 }
156 break;
157 case Collapsing:
158 if (!collapse) {
159 // TODO: stop the animation and start expanding
160 qDebug() << "wahah";
161 }
162 break;
163 }
164 }
165 signals:
166 void collapseStateChanged(CollapseState clState);
167 public slots:
168 void setAnimatedMotion(bool enabled) { mAnimatedMotion = enabled; }
169 void setCollapsingEnabled(bool enabled) {if (!enabled) setCollapsed(false); mCollapsingEnabled = enabled;}
170 protected:
171 virtual int collapsedWidth() {qDebug() << 30; return 30;}
172 virtual void enterEvent(QEvent *event) {
173 TitledPanel::enterEvent(event);
174 setCollapsed(false);
175 }
176 virtual void leaveEvent(QEvent *event) {
177 TitledPanel::leaveEvent(event);
178 setCollapsed(true);
179 }
180 virtual void resizeEvent(QResizeEvent *event) {
181 TitledPanel::resizeEvent(event);
182 if (clState == Collapsed && width() > collapsedWidth()) {
183 clState = Expanded;
184 qDebug() << "resize-event : state" << clState;
185 }
186 }
187 private slots:
188 void sizingFinished() { clState = (clState==Expanding) ? Expanded : Collapsed; emit collapseStateChanged(clState);}
189 private:
190 void triggerResize(CollapseState state) {
191 if (!containingSplitter) return;
192 containingSplitter->setActiveWidget(this);
193
194 if (!mAnimatedMotion) {
195 if (state == Collapsing) {
196 emit collapseStateChanged(state);
197 state = Collapsed;
198 }
199 if (state == Expanding) {
200 state = Expanded;
201 emit collapseStateChanged(state);
202 }
203 }
204
205 qDebug() << "resize-trigg : state" << state << ", exWidth, width:"<< expandedWidth << width();
206
207 switch (state) {
208 case Expanded:
209 containingSplitter->setActiveWidgetWidth(expandedWidth);
210 clState = state;
211 emit collapseStateChanged(state);
212 break;
213 case Collapsed:
214 containingSplitter->setActiveWidgetWidth(collapsedWidth());
215 clState = state;
216 emit collapseStateChanged(state);
217 break;
218 case Expanding:
219 clState = state;
220 emit collapseStateChanged(state);
221 containingSplitter->animateActiveWidgetWidth(expandedWidth);
222 break;
223 case Collapsing:
224 clState = state;
225 emit collapseStateChanged(state);
226 containingSplitter->animateActiveWidgetWidth(collapsedWidth());
227 break;
228 }
229 }
230
231 QToolBar *collapsedTopbar;
232 AnimatedSplitter *containingSplitter;
233 int expandedWidth;
234 CollapseState clState;
235 bool mCollapsingEnabled;
236 bool mAnimatedMotion;
237 };
238 */
239
240 #endif // TITLEDPANEL_H
241