HAL
content_layout_area.cpp
Go to the documentation of this file.
2 
10 
11 #include <QHBoxLayout>
12 #include <QVBoxLayout>
13 
14 namespace hal
15 {
17  : QWidget(parent),
18  mTopLevelLayout(new QVBoxLayout()),
19  mSecondLevelLayout(new QHBoxLayout()),
20  mThirdLevelLayout(new QVBoxLayout()),
21  mFourthLevelLayout(new QHBoxLayout()),
22  mSplitterLayout(new QVBoxLayout()),
23  mCentralLayout(new QHBoxLayout()),
24  mSpacerLayout(new QHBoxLayout()),
25 
26  mVerticalSplitter(new Splitter(Qt::Vertical, this)),
27  mHorizontalSplitter(new Splitter(Qt::Horizontal, this)),
28  mLeftSplitter(new Splitter(Qt::Vertical, this)),
29  mRightSplitter(new Splitter(Qt::Vertical, this)),
30  mBottomSplitter(new Splitter(Qt::Horizontal, this)),
31 
32  mLeftDock(new DockBar(Qt::Vertical, button_orientation::vertical_up, this)),
33  mRightDock(new DockBar(Qt::Vertical, button_orientation::vertical_down, this)),
34  mBottomDock(new DockBar(Qt::Horizontal, button_orientation::horizontal, this)),
35 
36  mBottomContainer(new QWidget(this)), mLeftSpacer(new QFrame(this)),
37  mRightSpacer(new QFrame(this)),
38 
39  mLeftAnchor(new SplitterAnchor(ContentLayout::Position::Left, mLeftDock, mLeftSplitter, this)),
40  mRightAnchor(new SplitterAnchor(ContentLayout::Position::Right, mRightDock, mRightSplitter, this)),
41  mBottomAnchor(new SplitterAnchor(ContentLayout::Position::Bottom, mBottomDock, mBottomSplitter, this)),
42 
43  mTabWidget(new TabWidget(this))
44  {
48 
51 
52  mLeftDock->setObjectName("left-dock-bar");
53  mRightDock->setObjectName("right-dock-bar");
54  mBottomDock->setObjectName("bottom-dock-bar");
55 
56  mBottomContainer->setObjectName("bottom-container");
57  mLeftSpacer->setObjectName("left-spacer");
58  mRightSpacer->setObjectName("right-spacer");
59 
60  mLeftDock->hide();
61  mRightDock->hide();
62  mBottomContainer->hide();
63 
64  mLeftSpacer->hide();
65  mRightSpacer->hide();
66 
67  mLeftSplitter->hide();
68  mRightSplitter->hide();
69  mBottomSplitter->hide();
70 
71  mLeftSplitter->setChildrenCollapsible(false);
72  mLeftSplitter->setMinimumWidth(340);
73  mLeftSplitter->setMinimumHeight(240);
74 
75  mRightSplitter->setChildrenCollapsible(false);
76  mRightSplitter->setMinimumWidth(340);
77  mRightSplitter->setMinimumHeight(240);
78 
79  mBottomSplitter->setChildrenCollapsible(false);
80  mBottomSplitter->setMinimumWidth(340);
81  mBottomSplitter->setMinimumHeight(240);
82 
83  mVerticalSplitter->setChildrenCollapsible(false);
84  mHorizontalSplitter->setChildrenCollapsible(false);
85 
86  setLayout(mTopLevelLayout);
87 
88  mTopLevelLayout->setContentsMargins(0, 0, 0, 0);
89  mTopLevelLayout->setSpacing(0);
90  mTopLevelLayout->addLayout(mSecondLevelLayout);
91  mBottomContainer->setLayout(mSpacerLayout);
92  mTopLevelLayout->addWidget(mBottomContainer);
93  mTopLevelLayout->setAlignment(Qt::AlignTop);
94 
95  mSpacerLayout->setContentsMargins(0, 0, 0, 0);
96  mSpacerLayout->setSpacing(0);
97  mSpacerLayout->addWidget(mLeftSpacer, Qt::AlignLeft);
98  mSpacerLayout->addWidget(mBottomDock);
99  mSpacerLayout->addWidget(mRightSpacer, Qt::AlignRight);
100 
101  mSecondLevelLayout->setContentsMargins(0, 0, 0, 0);
102  mSecondLevelLayout->setSpacing(0);
103  mSecondLevelLayout->addWidget(mLeftDock, Qt::AlignLeft);
104  mSecondLevelLayout->addLayout(mThirdLevelLayout);
105  mSecondLevelLayout->addWidget(mRightDock, Qt::AlignRight);
106 
107  mThirdLevelLayout->setContentsMargins(0, 0, 0, 0);
108  mThirdLevelLayout->setSpacing(0);
109  mThirdLevelLayout->addLayout(mFourthLevelLayout);
110 
111  mFourthLevelLayout->setContentsMargins(0, 0, 0, 0);
112  mFourthLevelLayout->setSpacing(0);
113  mFourthLevelLayout->addWidget(mVerticalSplitter);
114 
115  mVerticalSplitter->addWidget(mHorizontalSplitter);
116  mVerticalSplitter->addWidget(mBottomSplitter);
117 
118  mHorizontalSplitter->addWidget(mLeftSplitter);
119  mHorizontalSplitter->addWidget(mTabWidget);
120  mHorizontalSplitter->addWidget(mRightSplitter);
121  }
122 
124  {
125  int maxIndex = 0;
126  switch (anchor)
127  {
129  maxIndex = mTabWidget->count();
130  break;
132  maxIndex = mLeftAnchor->count();
133  break;
135  maxIndex = mRightAnchor->count();
136  break;
138  maxIndex = mBottomAnchor->count();
139  break;
140  }
141 
142  if (index > maxIndex)
143  {
144  log_warning("gui", "Cannot insert widget '{}' at index {}, moved to index {}", widget->name().toStdString(), index, maxIndex);
145  index = maxIndex;
146  }
147 
148 
149  switch (anchor)
150  {
152  mTabWidget->add(widget, index);
153  break;
155  mLeftAnchor->add(widget, index);
156  break;
158  mRightAnchor->add(widget, index);
159  break;
161  mBottomAnchor->add(widget, index);
162  break;
163  }
164  }
165 
167  {
168  Q_UNUSED(widget);
169  }
170 
172  {
173  saveState();
174  mTabWidget->clear();
175  mLeftAnchor->clear();
176  mRightAnchor->clear();
177  mBottomAnchor->clear();
178  }
179 
181  {
182  int height = size.height() - 240;
183  if (height > 0)
184  mVerticalSplitter->setSizes(QList<int>{height, 240});
185  else
186  mVerticalSplitter->setSizes(QList<int>{0, 240});
187 
188  int width = size.width() - 600;
189  if (width > 0)
190  mHorizontalSplitter->setSizes(QList<int>{300, width, 300});
191  else
192  mHorizontalSplitter->setSizes(QList<int>{240, 120, 240});
193  }
194 
196  {
197  if (mLeftDock->count())
198  {
199  mLeftDock->show();
200  mLeftSpacer->show();
201  }
202  else
203  {
204  mLeftDock->hide();
205  mLeftSpacer->hide();
206  }
207  }
208 
210  {
211  if (mRightDock->count())
212  {
213  mRightDock->show();
214  mRightSpacer->show();
215  }
216  else
217  {
218  mRightDock->hide();
219  mRightSpacer->hide();
220  }
221  }
222 
224  {
225  if (mBottomDock->count())
226  mBottomContainer->show();
227  else
228  mBottomContainer->hide();
229  }
230 
232  {
233  mWasBottomContainerHidden = mBottomContainer->isHidden();
234  mBottomContainer->show();
235 
236  }
237 
239  {
240  if(mWasBottomContainerHidden && mBottomDock->count() == 0)
241  mBottomContainer->hide();
242  }
243 
245  {
246  mLeftAnchor->saveState();
247  mRightAnchor->saveState();
248  mBottomAnchor->saveState();
249  mTabWidget->saveState();
250  SettingsManager::instance()->saveSplitterState("vertical", mVerticalSplitter);
251  SettingsManager::instance()->saveSplitterState("horizontal", mHorizontalSplitter);
252  SettingsManager::instance()->saveSplitterState("left", mLeftSplitter);
253  SettingsManager::instance()->saveSplitterState("right", mRightSplitter);
254  SettingsManager::instance()->saveSplitterState("bottom", mBottomSplitter);
255  }
256 
258  {
259  SettingsManager::instance()->restoreSplitterState("vertical", mVerticalSplitter);
260  SettingsManager::instance()->restoreSplitterState("horizontal", mHorizontalSplitter);
261  SettingsManager::instance()->restoreSplitterState("left", mLeftSplitter);
262  SettingsManager::instance()->restoreSplitterState("right", mRightSplitter);
263  SettingsManager::instance()->restoreSplitterState("bottom", mBottomSplitter);
264  }
265 }
void saveState() const
virtual int count() const
static ContentDragRelay * instance()
ContentLayoutArea(QWidget *parent=nullptr)
void removeContent(ContentWidget *widget)
void initSplitterSize(const QSize &size)
void addContent(ContentWidget *widget, int index, ContentLayout::Position anchor)
Abstract class for Widgets within HAL's ContentArea.
QString name() const
Contains and handles DockButtons.
Definition: dock_bar.h:48
void restoreSplitterState(const QString &tag, QSplitter *splitter) const
void saveSplitterState(const QString &tag, const QSplitter *splitter)
static SettingsManager * instance()
Adds specific ContentWidgets to HALs main content area.
virtual void add(ContentWidget *widget, int index=-1) override
A QSplitter that can be checked if it is unused or not.
Definition: splitter.h:39
Adds specific ContentWidgets to HALs main content area.
Definition: tab_widget.h:53
virtual void add(ContentWidget *widget, int index=-1)
Definition: tab_widget.cpp:60
button_orientation
Definition: dock_button.h:41
#define log_warning(channel,...)
Definition: log.h:76
void addLayout(QLayout *layout, int stretch)
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
void setSpacing(int spacing)
bool setAlignment(QWidget *w, Qt::Alignment alignment)
void setContentsMargins(int left, int top, int right, int bottom)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void setObjectName(const QString &name)
void addWidget(QWidget *widget)
void setChildrenCollapsible(bool)
void setSizes(const QList< int > &list)
std::string toStdString() const const
AlignTop
void hide()
bool isHidden() const const
void setMinimumHeight(int minh)
void setMinimumWidth(int minw)
void setLayout(QLayout *layout)
void show()