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