13#include <QXmlStreamWriter>
14#include <QApplication>
20class DockSideBarPrivate
27 inline bool isHorizontal()
const;
28 void handleViewportEvent(QEvent *e);
30 DockContainer *m_container;
31 QBoxLayout *m_tabsLayout;
33 Qt::Orientation m_orientation;
34 SideTabsWidget *m_tabsContainerWidget;
37class SideTabsWidget :
public QWidget
40 using QWidget::QWidget;
41 using Super = QWidget;
42 DockSideBarPrivate *eventHandler;
44 virtual QSize minimumSizeHint()
const override
46 return Super::sizeHint();
49 virtual bool event(QEvent *e)
override
51 eventHandler->handleViewportEvent(e);
52 return Super::event(e);
56DockSideBarPrivate::DockSideBarPrivate()
60void DockSideBarPrivate::init()
64 m_tabsContainerWidget =
new SideTabsWidget();
65 m_tabsContainerWidget->eventHandler =
this;
66 m_tabsContainerWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
67 m_tabsContainerWidget->setObjectName(
"sideTabsContainerWidget");
69 m_tabsLayout =
new QBoxLayout(m_orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
70 m_tabsLayout->setContentsMargins(0, 0, 0, 0);
71 m_tabsLayout->setSpacing(12);
72 m_tabsLayout->addStretch(1);
73 m_tabsContainerWidget->setLayout(m_tabsLayout);
74 q->setWidget(m_tabsContainerWidget);
77bool DockSideBarPrivate::isHorizontal()
const
79 return Qt::Horizontal == m_orientation;
82void DockSideBarPrivate::handleViewportEvent(QEvent *e)
86 case QEvent::ChildRemoved:
87 if (m_tabsLayout->isEmpty()) {
102 d->m_container = parent;
103 d->m_sideTabArea = area;
106 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
107 setFrameStyle(QFrame::NoFrame);
108 setWidgetResizable(
true);
109 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
110 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
114 setFocusPolicy(Qt::NoFocus);
115 if (d->isHorizontal()) {
116 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
118 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
126 auto tabs = findChildren<DockSideTab *>(QString(), Qt::FindDirectChildrenOnly);
127 for (
auto tab : tabs) {
128 tab->setParent(
nullptr);
136 sideTab->removeEventFilter(
this);
137 d->m_tabsLayout->removeWidget(sideTab);
138 if (d->m_tabsLayout->isEmpty()) {
156 focusController->clearDockWidgetFocus(w);
158 auto tab = autoHideContainer->autoHideTab();
161 return autoHideContainer;
173 if (sideBar ==
this) {
176 if (autoHideWidget->
tabIndex() == index || (autoHideWidget->
tabIndex() + 1) == index) {
182 if (autoHideWidget->
tabIndex() < index) {
190 autoHideWidget->setParent(d->m_container);
191 autoHideWidget->setSideBarArea(d->m_sideTabArea);
192 d->m_container->registerAutoHideWidget(autoHideWidget);
203 autoHideWidget->setParent(
nullptr);
209 return d->m_orientation;
215 return qobject_cast<DockSideTab *>(d->m_tabsLayout->itemAt(index)->widget());
231 if (pos.x() <
tab(0)->geometry().x()) {
235 if (pos.y() <
tab(0)->geometry().y()) {
240 for (
int i = 0; i <
count(); ++i) {
241 if (
tab(i)->geometry().contains(pos)) {
251 int index =
tabAt(pos);
255 return (index < 0) ? 0 : index;
261 for (
auto i = 0; i <
count(); i++) {
262 if (this->
tab(i) == &
tab) {
273 return d->m_tabsLayout->count() - 1;
279 auto parentWidget = this->parentWidget();
280 for (
auto i = 0; i <
count(); i++) {
281 if (
tab(i)->isVisibleTo(parentWidget)) {
297 auto parentWidget = this->parentWidget();
298 for (
auto i = 0; i <
count(); i++) {
299 if (
tab(i)->isVisibleTo(parentWidget)) {
310 return d->m_sideTabArea;
324 if (d->isHorizontal()) {
335 return d->m_tabsContainerWidget->sizeHint();
341 return d->m_tabsLayout->spacing();
347 d->m_tabsLayout->setSpacing(
spacing);
354 sideTab->installEventFilter(
this);
357 d->m_tabsLayout->insertWidget(d->m_tabsLayout->count() - 1, sideTab);
359 d->m_tabsLayout->insertWidget(index, sideTab);
370 s.writeStartElement(
"SideBar");
371 s.writeAttribute(
"Area", QString::number(
sideBarArea()));
372 s.writeAttribute(
"Tabs", QString::number(
count()));
374 for (
auto i = 0; i <
count(); ++i) {
379 t->dockWidget()->autoHideContainer()->saveState(s);
387 auto tab = qobject_cast<DockSideTab *>(watched);
392 switch (event->type()) {
393 case QEvent::ShowToParent:
397 case QEvent::HideToParent:
Auto hide container for hosting an auto hide dock widget
DockSideTab * autoHideTab() const
DockContainer * dockContainer() const
int tabIndex() const
Returns the index of this container in the sidebar
Container that manages a number of dock panels with single dock widgets or tabyfied dock widgets in e...
void removeAutoHideWidget(DockAutoHideContainer *autoHideWidget)
A dock widget Side tab that shows a title or an icon.
DockSideBar * sideBar() const
Returns the side bar that contains this tab or a nullptr if the tab is not in a side bar
void setSideBar(DockSideBar *sideBar)
DockFocusController * dockFocusController() const
@ DockTabDefaultInsertIndex
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE