HAL
content_layout_area.cpp
Go to the documentation of this file.
2 
9 
10 #include <QHBoxLayout>
11 #include <QVBoxLayout>
12 
13 
14 namespace hal
15 {
17  : QWidget(parent), mTopLevelLayout(new QVBoxLayout()), mSecondLevelLayout(new QHBoxLayout()), mThirdLevelLayout(new QVBoxLayout()), mFourthLevelLayout(new QHBoxLayout()),
18  mSplitterLayout(new QVBoxLayout()), mCentralLayout(new QHBoxLayout()), mSpacerLayout(new QHBoxLayout()),
19 
20  mVerticalSplitter(new Splitter(Qt::Vertical, this)), mHorizontalSplitter(new Splitter(Qt::Horizontal, this)), mLeftSplitter(new Splitter(Qt::Vertical, this)),
21  mRightSplitter(new Splitter(Qt::Vertical, this)), mBottomSplitter(new Splitter(Qt::Horizontal, this)),
22 
23  mLeftDock(new DockBar(Qt::Vertical, button_orientation::vertical_up, this)), mRightDock(new DockBar(Qt::Vertical, button_orientation::vertical_down, this)),
24  mBottomDock(new DockBar(Qt::Horizontal, button_orientation::horizontal, this)),
25 
26  mBottomContainer(new QWidget(this)), mLeftSpacer(new QFrame(this)), mRightSpacer(new QFrame(this)),
27 
28  mLeftAnchor(new SplitterAnchor(mLeftDock, mLeftSplitter, this)), mRightAnchor(new SplitterAnchor(mRightDock, mRightSplitter, this)),
29  mBottomAnchor(new SplitterAnchor(mBottomDock, mBottomSplitter, this)),
30 
31  mTabWidget(new TabWidget(this))
32  {
36 
39 
40  mLeftDock->setObjectName("left-dock-bar");
41  mRightDock->setObjectName("right-dock-bar");
42  mBottomDock->setObjectName("bottom-dock-bar");
43 
44  mBottomContainer->setObjectName("bottom-container");
45  mLeftSpacer->setObjectName("left-spacer");
46  mRightSpacer->setObjectName("right-spacer");
47 
48  mLeftDock->hide();
49  mRightDock->hide();
50  mBottomContainer->hide();
51 
52  mLeftSpacer->hide();
53  mRightSpacer->hide();
54 
55  mLeftSplitter->hide();
56  mRightSplitter->hide();
57  mBottomSplitter->hide();
58 
59  mLeftSplitter->setChildrenCollapsible(false);
60  mLeftSplitter->setMinimumWidth(340);
61  mLeftSplitter->setMinimumHeight(240);
62 
63  mRightSplitter->setChildrenCollapsible(false);
64  mRightSplitter->setMinimumWidth(340);
65  mRightSplitter->setMinimumHeight(240);
66 
67  mBottomSplitter->setChildrenCollapsible(false);
68  mBottomSplitter->setMinimumWidth(340);
69  mBottomSplitter->setMinimumHeight(240);
70 
71  mVerticalSplitter->setChildrenCollapsible(false);
72  mHorizontalSplitter->setChildrenCollapsible(false);
73 
74  setLayout(mTopLevelLayout);
75 
76  mTopLevelLayout->setContentsMargins(0, 0, 0, 0);
77  mTopLevelLayout->setSpacing(0);
78  mTopLevelLayout->addLayout(mSecondLevelLayout);
79  mBottomContainer->setLayout(mSpacerLayout);
80  mTopLevelLayout->addWidget(mBottomContainer);
81  mTopLevelLayout->setAlignment(Qt::AlignTop);
82 
83  mSpacerLayout->setContentsMargins(0, 0, 0, 0);
84  mSpacerLayout->setSpacing(0);
85  mSpacerLayout->addWidget(mLeftSpacer, Qt::AlignLeft);
86  mSpacerLayout->addWidget(mBottomDock);
87  mSpacerLayout->addWidget(mRightSpacer, Qt::AlignRight);
88 
89  mSecondLevelLayout->setContentsMargins(0, 0, 0, 0);
90  mSecondLevelLayout->setSpacing(0);
91  mSecondLevelLayout->addWidget(mLeftDock, Qt::AlignLeft);
92  mSecondLevelLayout->addLayout(mThirdLevelLayout);
93  mSecondLevelLayout->addWidget(mRightDock, Qt::AlignRight);
94 
95  mThirdLevelLayout->setContentsMargins(0, 0, 0, 0);
96  mThirdLevelLayout->setSpacing(0);
97  mThirdLevelLayout->addLayout(mFourthLevelLayout);
98 
99  mFourthLevelLayout->setContentsMargins(0, 0, 0, 0);
100  mFourthLevelLayout->setSpacing(0);
101  mFourthLevelLayout->addWidget(mVerticalSplitter);
102 
103  mVerticalSplitter->addWidget(mHorizontalSplitter);
104  mVerticalSplitter->addWidget(mBottomSplitter);
105 
106  mHorizontalSplitter->addWidget(mLeftSplitter);
107  mHorizontalSplitter->addWidget(mTabWidget);
108  mHorizontalSplitter->addWidget(mRightSplitter);
109  }
110 
112  {
113  int maxIndex = 0;
114  switch (anchor)
115  {
117  maxIndex = mTabWidget->count();
118  break;
120  maxIndex = mLeftAnchor->count();
121  break;
123  maxIndex = mRightAnchor->count();
124  break;
126  maxIndex = mBottomAnchor->count();
127  break;
128  }
129 
130  if (index > maxIndex)
131  {
132  log_warning("gui", "Cannot insert widget '{}' at index {}, moved to index {}", widget->name().toStdString(), index, maxIndex);
133  index = maxIndex;
134  }
135 
136 
137  switch (anchor)
138  {
140  mTabWidget->add(widget, index);
141  break;
143  mLeftAnchor->add(widget, index);
144  break;
146  mRightAnchor->add(widget, index);
147  break;
149  mBottomAnchor->add(widget, index);
150  break;
151  }
152  }
153 
155  {
156  Q_UNUSED(widget);
157  }
158 
160  {
161  mTabWidget->clear();
162  mLeftAnchor->clear();
163  mRightAnchor->clear();
164  mBottomAnchor->clear();
165  }
166 
168  {
169  int height = size.height() - 240;
170  if (height > 0)
171  mVerticalSplitter->setSizes(QList<int>{height, 240});
172  else
173  mVerticalSplitter->setSizes(QList<int>{0, 240});
174 
175  int width = size.width() - 600;
176  if (width > 0)
177  mHorizontalSplitter->setSizes(QList<int>{300, width, 300});
178  else
179  mHorizontalSplitter->setSizes(QList<int>{240, 120, 240});
180  }
181 
183  {
184  if (mLeftDock->count())
185  {
186  mLeftDock->show();
187  mLeftSpacer->show();
188  }
189  else
190  {
191  mLeftDock->hide();
192  mLeftSpacer->hide();
193  }
194  }
195 
197  {
198  if (mRightDock->count())
199  {
200  mRightDock->show();
201  mRightSpacer->show();
202  }
203  else
204  {
205  mRightDock->hide();
206  mRightSpacer->hide();
207  }
208  }
209 
211  {
212  if (mBottomDock->count())
213  mBottomContainer->show();
214  else
215  mBottomContainer->hide();
216  }
217 
219  {
220  mWasBottomContainerHidden = mBottomContainer->isHidden();
221  mBottomContainer->show();
222 
223  }
224 
226  {
227  if(mWasBottomContainerHidden && mBottomDock->count() == 0)
228  mBottomContainer->hide();
229  }
230 }
static ContentDragRelay * instance()
void addContent(ContentWidget *widget, int index, content_anchor anchor)
ContentLayoutArea(QWidget *parent=nullptr)
void removeContent(ContentWidget *widget)
void initSplitterSize(const QSize &size)
Abstract class for Widgets within HAL's ContentArea.
Contains and handles DockButtons.
Definition: dock_bar.h:48
Adds specific ContentWidgets to HALs main content area.
int count() const override
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:58
int count() const override
Definition: tab_widget.cpp:205
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()