CollapsibleDockWidget.cpp
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5 *
6 * ArmarX is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * ArmarX is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * @package MemoryX::gui-plugins::SceneEditor
19 * @date 2015
20 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
21 * GNU General Public License
22 */
23
25
26#include <assert.h>
27
28#include <iostream>
29
30#include <QPointer>
31#include <QSizePolicy>
32#include <QTimer>
33#include <qtreeview.h>
34
36
38 QWidget* parent,
39 Qt::WindowFlags flags) :
40 QDockWidget(title, parent, flags)
41{
42 gui::CollapsibleDockWidget::TitleBar* titleBar = new gui::CollapsibleDockWidget::TitleBar(this);
43 setTitleBarWidget(titleBar);
44}
45
46gui::CollapsibleDockWidget::CollapsibleDockWidget(QWidget* parent, Qt::WindowFlags flags) :
47 QDockWidget(parent, flags)
48{
49 gui::CollapsibleDockWidget::TitleBar* titleBar = new gui::CollapsibleDockWidget::TitleBar(this);
50 setTitleBarWidget(titleBar);
51}
52
53void
55{
56 gui::CollapsibleDockWidget::InnerWidgetWrapper* wid =
57 new gui::CollapsibleDockWidget::InnerWidgetWrapper(this);
58 wid->setWidget(w);
59 QDockWidget::setWidget(wid);
60
61 if (isVisible())
62 {
63 widget()->show();
64 }
65}
66
67void
69{
70 gui::CollapsibleDockWidget::InnerWidgetWrapper* innerWidget =
71 dynamic_cast<gui::CollapsibleDockWidget::InnerWidgetWrapper*>(widget());
72
73 if (innerWidget != NULL)
74 {
75 innerWidget->setCollapsed(collapsed);
76 }
77 else
78 {
79 std::cerr << "DockWidget is not collapsible" << std::endl;
80 }
81}
82
83bool
85{
86 gui::CollapsibleDockWidget::InnerWidgetWrapper* innerWidget =
87 dynamic_cast<gui::CollapsibleDockWidget::InnerWidgetWrapper*>(widget());
88 return innerWidget != NULL ? innerWidget->isCollapsed() : false;
89}
90
91void
96
97void
99{
100 gui::CollapsibleDockWidget::TitleBar* titleBar =
101 dynamic_cast<gui::CollapsibleDockWidget::TitleBar*>(this->titleBarWidget());
102
103 if (titleBar)
104 {
105 titleBar->windowTitleChanged();
106 }
107}
108
109gui::CollapsibleDockWidget::InnerWidgetWrapper::InnerWidgetWrapper(QDockWidget* parent) :
110 QWidget(parent), widget(NULL), hlayout(new QHBoxLayout(this)), widget_height(0), oldSize(0, 0)
111{
112 this->hlayout->setSpacing(0);
113 this->hlayout->setContentsMargins(0, 0, 0, 0);
114 this->setLayout(this->hlayout);
115 QDockWidget* parentDockWidget = dynamic_cast<QDockWidget*>(parent);
116 assert(parentDockWidget != NULL);
117 oldMinimumSizeParent = parentDockWidget->minimumSize();
118 oldMaximumSizeParent = parentDockWidget->maximumSize();
119 oldMinimumSize = minimumSize();
120 oldMaximumSize = maximumSize();
121}
122
123void
124gui::CollapsibleDockWidget::InnerWidgetWrapper::setWidget(QWidget* widget)
125{
126 this->widget = widget;
127 this->widget_height = widget->height();
128 this->layout()->addWidget(widget);
129 this->oldSize = this->size();
130 QDockWidget* parentDockWidget = dynamic_cast<QDockWidget*>(this->parent());
131 assert(parentDockWidget != NULL);
132 oldMinimumSizeParent = parentDockWidget->minimumSize();
133 oldMaximumSizeParent = parentDockWidget->maximumSize();
134 oldMinimumSize = minimumSize();
135 oldMaximumSize = maximumSize();
136}
137
138bool
139gui::CollapsibleDockWidget::InnerWidgetWrapper::isCollapsed()
140{
141 return !this->widget->isVisible();
142}
143
144void
145gui::CollapsibleDockWidget::InnerWidgetWrapper::setCollapsed(bool collapsed)
146{
147 QDockWidget* parentDockWidget = dynamic_cast<QDockWidget*>(this->parent());
148 assert(parentDockWidget != NULL);
149 gui::CollapsibleDockWidget::TitleBar* parentDockWidgetTitleBar =
150 dynamic_cast<gui::CollapsibleDockWidget::TitleBar*>(parentDockWidget->titleBarWidget());
151 assert(parentDockWidgetTitleBar != NULL);
152
153 if (!collapsed)
154 {
155 parentDockWidget->setMinimumSize(oldMinimumSizeParent);
156 parentDockWidget->setMaximumSize(oldMaximumSizeParent);
157 this->widget->show();
158 parentDockWidgetTitleBar->showTitle(true);
159 this->layout()->addWidget(this->widget);
160 this->setMinimumSize(oldMinimumSize);
161 this->setMaximumSize(oldMaximumSize);
162 this->setBaseSize(this->oldSize);
163 this->resize(this->oldSize);
164 }
165 else
166 {
167 this->oldSize = this->size();
168 oldMinimumSizeParent = parentDockWidget->minimumSize();
169 oldMaximumSizeParent = parentDockWidget->maximumSize();
170 oldMinimumSize = minimumSize();
171 oldMaximumSize = maximumSize();
172 this->layout()->removeWidget(this->widget);
173 this->widget->hide();
174 parentDockWidgetTitleBar->showTitle(false);
175 parentDockWidget->setMinimumSize(25, 25);
176 parentDockWidget->setMaximumSize(25, 25);
177 QTimer::singleShot(1, parentDockWidget, SLOT(setCollapsedSizes()));
178 }
179}
180
181void
182gui::CollapsibleDockWidget::setCollapsedSizes()
183{
184 gui::CollapsibleDockWidget::InnerWidgetWrapper* innerWidget =
185 dynamic_cast<gui::CollapsibleDockWidget::InnerWidgetWrapper*>(widget());
186 assert(innerWidget != NULL);
187 setMinimumSize(25, 25);
188
189 if (features() & QDockWidget::DockWidgetVerticalTitleBar)
190 {
191 setMaximumSize(25, innerWidget->getOldMaximumSizeParent().height());
192 }
193 else
194 {
195 setMaximumSize(innerWidget->getOldMaximumSizeParent().width(), 25);
196 }
197}
198
199gui::CollapsibleDockWidget::TitleBar::TitleBar(QWidget* parent) :
200 QWidget(parent),
201 hlayout(new QHBoxLayout(this)),
202 collapse(new QPushButton(this)),
203 title(new QLabel(parent->windowTitle()))
204{
205 this->hlayout->setDirection(QBoxLayout::Direction::RightToLeft);
206 this->hlayout->setSpacing(0);
207 this->hlayout->setContentsMargins(0, 0, 0, 0);
208 this->setLayout(this->hlayout);
209 this->hlayout->addWidget(collapse);
210 collapse->setIcon(QIcon(":/images/branch-open.png"));
211 collapse->setCheckable(false);
212 collapse->setFixedSize(20, 20);
213 connect(collapse, SIGNAL(released()), parent, SLOT(toggleCollapsed()));
214 this->hlayout->addStretch();
215 this->hlayout->addWidget(title);
216}
217
218void
219gui::CollapsibleDockWidget::TitleBar::windowTitleChanged()
220{
221 QDockWidget* parentDockWidget = dynamic_cast<QDockWidget*>(this->parent());
222 title->setText(parentDockWidget->windowTitle());
223}
224
225void
226gui::CollapsibleDockWidget::TitleBar::showTitle(bool show)
227{
228 title->setVisible(show);
229
230 if (show)
231 {
232 collapse->setIcon(QIcon(":/images/branch-open.png"));
233 }
234 else
235 {
236 collapse->setIcon(QIcon(":/images/branch-closed.png"));
237 }
238}
239
240QSize const&
241gui::CollapsibleDockWidget::InnerWidgetWrapper::getOldMaximumSizeParent() const
242{
243 return oldMaximumSizeParent;
244}
CollapsibleDockWidget(const QString &title, QWidget *parent=0, Qt::WindowFlags flags=0)
Creates a new CollapsibleDockWidget.
void setCollapsed(bool collapsed)
Sets the collapsed state.
void toggleCollapsed()
Toggles the collapsed state of the widget.
bool isCollapsed()
Returns is the widget is collapsed.
void windowTitleChanged()
A method to inform the widget, that the window title has been changed.
void setCollapsibleWidget(QWidget *w)
Sets a QWidget to show in the DockWidget.