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 
24 #include "CollapsibleDockWidget.h"
25 
26 #include <assert.h>
27 
28 #include <iostream>
29 
30 #include <QPointer>
31 #include <QSizePolicy>
32 #include <QTimer>
33 #include <qtreeview.h>
34 
35 #include "SceneEditorMainWindow.h"
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 
46 gui::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 
53 void
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 
67 void
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 
83 bool
85 {
86  gui::CollapsibleDockWidget::InnerWidgetWrapper* innerWidget =
87  dynamic_cast<gui::CollapsibleDockWidget::InnerWidgetWrapper*>(widget());
88  return innerWidget != NULL ? innerWidget->isCollapsed() : false;
89 }
90 
91 void
93 {
94  setCollapsed(!isCollapsed());
95 }
96 
97 void
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 
109 gui::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 
123 void
124 gui::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 
138 bool
139 gui::CollapsibleDockWidget::InnerWidgetWrapper::isCollapsed()
140 {
141  return !this->widget->isVisible();
142 }
143 
144 void
145 gui::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 
181 void
182 gui::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 
199 gui::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 
218 void
219 gui::CollapsibleDockWidget::TitleBar::windowTitleChanged()
220 {
221  QDockWidget* parentDockWidget = dynamic_cast<QDockWidget*>(this->parent());
222  title->setText(parentDockWidget->windowTitle());
223 }
224 
225 void
226 gui::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 
240 QSize const&
241 gui::CollapsibleDockWidget::InnerWidgetWrapper::getOldMaximumSizeParent() const
242 {
243  return oldMaximumSizeParent;
244 }
gui::CollapsibleDockWidget::toggleCollapsed
void toggleCollapsed()
Toggles the collapsed state of the widget.
Definition: CollapsibleDockWidget.cpp:92
gui::CollapsibleDockWidget::isCollapsed
bool isCollapsed()
Returns is the widget is collapsed.
Definition: CollapsibleDockWidget.cpp:84
gui::CollapsibleDockWidget::setCollapsibleWidget
void setCollapsibleWidget(QWidget *w)
Sets a QWidget to show in the DockWidget.
Definition: CollapsibleDockWidget.cpp:54
gui::CollapsibleDockWidget::CollapsibleDockWidget
CollapsibleDockWidget(const QString &title, QWidget *parent=0, Qt::WindowFlags flags=0)
Creates a new CollapsibleDockWidget.
Definition: CollapsibleDockWidget.cpp:37
gui::CollapsibleDockWidget::windowTitleChanged
void windowTitleChanged()
A method to inform the widget, that the window title has been changed.
Definition: CollapsibleDockWidget.cpp:98
SceneEditorMainWindow.h
gui::CollapsibleDockWidget::setCollapsed
void setCollapsed(bool collapsed)
Sets the collapsed state.
Definition: CollapsibleDockWidget.cpp:68
CollapsibleDockWidget.h