18#include <QApplication>
19#include <QXmlStreamWriter>
24static const int s_resizeMargin = 30;
45 return Qt::BottomEdge;
81static bool objectIsAncestorOf(
const QObject *descendant,
const QObject *ancestor)
87 if (descendant == ancestor) {
90 descendant = descendant->parent();
99static bool isObjectOrAncestor(
const QObject *descendant,
const QObject *ancestor)
101 if (ancestor && (descendant == ancestor)) {
104 return objectIsAncestorOf(descendant, ancestor);
108class DockAutoHideContainerPrivate
113 DockAutoHideContainerPrivate();
115 bool isHorizontal()
const;
119 void updateResizeHandleSizeLimitMax();
120 void forwardEventToDockContainer(QEvent *event);
122 DockPanel *m_panel =
nullptr;
123 DockWidget *m_dockWidget =
nullptr;
125 QBoxLayout *m_layout =
nullptr;
126 DockResizeHandle *m_resizeHandle =
nullptr;
127 QPointer<DockSideTab> m_sideTab;
132DockAutoHideContainerPrivate::DockAutoHideContainerPrivate()
136bool DockAutoHideContainerPrivate::isHorizontal()
const
138 return isHorizontalArea(m_sideTabBarArea);
159void DockAutoHideContainerPrivate::updateResizeHandleSizeLimitMax()
161 Q_Q(DockAutoHideContainer);
162 auto rect = q->dockContainer()->contentRect();
163 const auto maxResizeHandleSize = m_resizeHandle->orientation() == Qt::Horizontal ? rect.width() : rect.height();
164 m_resizeHandle->setMaxResizeSize(maxResizeHandleSize - s_resizeMargin);
167void DockAutoHideContainerPrivate::forwardEventToDockContainer(QEvent *event)
169 Q_Q(DockAutoHideContainer);
170 auto container = q->dockContainer();
172 container->handleAutoHideWidgetEvent(event, q);
183 d->m_sideTabBarArea = area;
187 d->m_panel->setObjectName(
"autoHideDockPanel");
188 d->m_panel->setAutoHideContainer(
this);
190 setObjectName(
"autoHideDockContainer");
192 d->m_layout =
new QBoxLayout(isHorizontalArea(area) ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
193 d->m_layout->setContentsMargins(0, 0, 0, 0);
194 d->m_layout->setSpacing(0);
195 setLayout(d->m_layout);
198 d->m_resizeHandle->setMinResizeSize(64);
200 d->m_resizeHandle->setOpaqueResize(opaqueResize);
202 d->m_size = d->m_panel->size();
203 d->m_sizeCache = w->size();
211 d->m_layout->addWidget(d->m_panel);
219 qApp->removeEventFilter(
this);
234 return d->m_sideTab->sideBar();
237 return container ? container->autoHideSideBar(d->m_sideTabBarArea) :
nullptr;
253 return d->m_sideTab->tabIndex();
259 return d->m_dockWidget;
265 if (d->m_dockWidget) {
267 d->m_panel->removeDockWidget(d->m_dockWidget);
271 d->m_sideTab->setDockWidget(w);
274 if (oldPanel && !isRestoringState) {
278 d->m_size = oldPanel->size() + QSize(16, 16);
281 d->m_panel->addDockWidget(w);
286 d->m_panel->resize(size());
291 return internal::findParent<DockContainer *>(
this);
297 return d->m_sideTabBarArea;
308 if (d->m_sideTabBarArea == area) {
312 d->m_sideTabBarArea = area;
313 d->m_layout->removeWidget(d->m_resizeHandle);
314 d->m_layout->setDirection(isHorizontalArea(area) ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
316 d->m_resizeHandle->setHandlePosition(edgeFromSideBarArea(area));
328 auto sideTab = d->m_sideTab;
329 sideTab->removeFromSideBar();
330 sideTab->setParent(
nullptr);
349 d->m_dockWidget->setDockPanel(
nullptr);
351 container->addDockWidget(d->getDockWidgetArea(d->m_sideTabBarArea), d->m_dockWidget);
370 if (sideBar->orientation() != oldOrientation) {
384 d->m_sideTab->show();
388 d->m_sideTab->hide();
391 qApp->removeEventFilter(
this);
404 qApp->removeEventFilter(
this);
407 d->updateResizeHandleSizeLimitMax();
410 d->m_dockWidget->dockWindow()->setDockWidgetFocused(d->m_dockWidget);
411 qApp->installEventFilter(
this);
414 d->m_sideTab->updateStyle();
433 if (d->isHorizontal()) {
434 d->m_size.setHeight(size);
436 d->m_size.setWidth(size);
453 setSize(d->m_sizeCache.height());
455 setSize(d->m_sizeCache.width());
477 if (
event->type() == QEvent::Resize) {
478 if (!d->m_resizeHandle->isResizing()) {
481 }
else if (
event->type() == QEvent::MouseButtonPress) {
482 auto widget = qobject_cast<QWidget *>(watched);
485 return Super::eventFilter(watched,
event);
492 if (widget == d->m_sideTab.data()) {
493 return Super::eventFilter(watched,
event);
500 if (isObjectOrAncestor(widget,
this)) {
501 return Super::eventFilter(watched,
event);
506 return Super::eventFilter(watched,
event);
515 if (floatingWidget != watched) {
522 return Super::eventFilter(watched,
event);
528 Super::resizeEvent(
event);
529 if (d->m_resizeHandle->isResizing()) {
530 d->m_size = this->size();
531 d->updateResizeHandleSizeLimitMax();
541 auto pos = mapFromGlobal(QCursor::pos());
542 if (!rect().contains(pos)) {
543 d->forwardEventToDockContainer(
event);
545 Super::leaveEvent(
event);
551 switch (
event->type()) {
554 d->forwardEventToDockContainer(
event);
557 case QEvent::MouseButtonPress:
565 return Super::event(
event);
575 if (!dockContainerParent) {
579 auto rect = dockContainerParent->contentRect();
582 resize(rect.width(), qMin(rect.height() - s_resizeMargin, d->m_size.height()));
583 move(rect.topLeft());
587 resize(qMin(d->m_size.width(), rect.width() - s_resizeMargin), rect.height());
588 move(rect.topLeft());
592 resize(qMin(d->m_size.width(), rect.width() - s_resizeMargin), rect.height());
593 QPoint p = rect.topRight();
594 p.rx() -= (width() - 1);
599 resize(rect.width(), qMin(rect.height() - s_resizeMargin, d->m_size.height()));
600 QPoint p = rect.bottomLeft();
601 p.ry() -= (height() - 1);
610 d->m_sizeCache.setHeight(this->height());
612 d->m_sizeCache.setWidth(this->width());
619 s.writeStartElement(
"Widget");
620 s.writeAttribute(
"Name", d->m_dockWidget->objectName());
621 s.writeAttribute(
"Closed", QString::number(d->m_dockWidget->isClosed() ? 1 : 0));
622 s.writeAttribute(
"Size", QString::number(d->isHorizontal() ? d->m_size.height() : d->m_size.width()));
Auto hide container for hosting an auto hide dock widget
DockSideTab * autoHideTab() const
void toggleView(bool enable)
virtual void leaveEvent(QEvent *event) override
void toggleCollapseState()
Toggles the current collapse state
void addDockWidget(DockWidget *w)
void moveContentsToParent()
Moves the contents to the parent container widget Used before removing this Auto Hide dock container
virtual bool eventFilter(QObject *watched, QEvent *event) override
void resetToInitialDockWidgetSize()
Resets the width or height to the initial dock widget size dependinng on the orientation.
void saveState(QXmlStreamWriter &s) const
DockWidget * dockWidget() const
virtual void resizeEvent(QResizeEvent *event) override
DockSideBar * autoHideSideBar() const
Qt::Orientation orientation() const
Returns orientation of this container.
void setSize(int size)
Use this instead of resize.
void collapseView(bool enable)
void cleanupAndDelete()
Cleanups up the side tab widget and then deletes itself
Qx::DockSideBarArea sideBarArea() const
virtual ~DockAutoHideContainer()
void moveToNewSideBarArea(Qx::DockSideBarArea area, int tabIndex=-1)
Removes the AutoHide container from the current side bar and adds it to the new side bar given in are...
void updateSize()
Updates the size considering the size limits and the resize margins
virtual bool event(QEvent *event) override
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 registerAutoHideWidget(DockAutoHideContainer *autoHideWidget)
void removeAutoHideWidget(DockAutoHideContainer *autoHideWidget)
DockSideBar * autoHideSideBar(Qx::DockSideBarArea area) const
DockFloatingContainer * floatingWidget() const
If this dock container is in a floating widget, this function returns the floating widget.
static bool testConfigFlag(ConfigFlag flag)
DockPanel manages multiple instances of DockWidgets.
void removeDockWidget(DockWidget *w)
Resize handle for resizing its parent widget (such as DockAutoHideContainer)
A dock widget Side tab that shows a title or an icon.
bool isRestoringState() const
This function returns true between the restoringState() and stateRestored() signals.
const int DockedWidgetDragStartEvent
bool isHorizontalSideBarArea(Qx::DockSideBarArea area)
void repolishStyle(QWidget *w, RepolishChildOptions options)
Calls unpolish() / polish for the style of the given widget to update stylesheet if a property change...
const int FloatingWidgetDragStartEvent
int resizeHandleLayoutPosition(Qx::DockSideBarArea area)
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE