diff --git a/src/AutoHideDockContainer.cpp b/src/AutoHideDockContainer.cpp index c25d60b..cd87a5c 100644 --- a/src/AutoHideDockContainer.cpp +++ b/src/AutoHideDockContainer.cpp @@ -117,6 +117,7 @@ struct AutoHideDockContainerPrivate CResizeHandle* ResizeHandle = nullptr; QSize Size; // creates invalid size QPointer SideTab; + QSize OriginalDockWidgetSize; /** * Private data constructor @@ -214,7 +215,9 @@ CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, SideBarL d->ResizeHandle->setMinResizeSize(64); bool OpaqueResize = CDockManager::testConfigFlag(CDockManager::OpaqueSplitterResize); d->ResizeHandle->setOpaqueResize(OpaqueResize); + std::cout << "d->DockArea->size(); " << d->DockArea->size().width() << std::endl; d->Size = d->DockArea->size(); + d->OriginalDockWidgetSize = DockWidget->size(); addDockWidget(DockWidget); parent->registerAutoHideWidget(this); @@ -303,7 +306,7 @@ CAutoHideDockContainer::~CAutoHideDockContainer() } //============================================================================ -CAutoHideSideBar* CAutoHideDockContainer::sideBar() const +CAutoHideSideBar* CAutoHideDockContainer::autoHideSideBar() const { if (d->SideTab) { @@ -312,7 +315,7 @@ CAutoHideSideBar* CAutoHideDockContainer::sideBar() const else { auto DockContainer = dockContainer(); - return DockContainer ? DockContainer->sideTabBar(d->SideTabBarArea) : nullptr; + return DockContainer ? DockContainer->autoHideSideBar(d->SideTabBarArea) : nullptr; } } @@ -657,5 +660,19 @@ bool CAutoHideDockContainer::event(QEvent* event) return Super::event(event); } + +//============================================================================ +QSize CAutoHideDockContainer::originalDockWidgetSize() const +{ + return d->OriginalDockWidgetSize; +} + + +//============================================================================ +Qt::Orientation CAutoHideDockContainer::orientation() const +{ + return autoHideSideBar()->orientation(); +} + } diff --git a/src/AutoHideDockContainer.h b/src/AutoHideDockContainer.h index d042b40..58b1c3e 100644 --- a/src/AutoHideDockContainer.h +++ b/src/AutoHideDockContainer.h @@ -93,7 +93,7 @@ public: /** * Get's the side tab bar */ - CAutoHideSideBar* sideBar() const; + CAutoHideSideBar* autoHideSideBar() const; /** * Returns the side tab @@ -166,6 +166,21 @@ public: * of this auto hide container. */ void setSize(int Size); + + /** + * Returns the original size of the dock widget at the time it has been + * added to this auto hide widget + */ + QSize originalDockWidgetSize() const; + + /** + * Returns orientation of this container. + * Left and right containers have a Qt::Vertical orientation and top / bottom + * containers have a Qt::Horizontal orientation. + * The function returns the orientation of the corresponding auto hide + * side bar. + */ + Qt::Orientation orientation() const; }; } // namespace ads diff --git a/src/AutoHideTab.cpp b/src/AutoHideTab.cpp index bee969b..ce807f3 100644 --- a/src/AutoHideTab.cpp +++ b/src/AutoHideTab.cpp @@ -42,6 +42,8 @@ namespace ads { +static const char* const LocationProperty = "Location"; + /** * Private data class of CDockWidgetTab class (pimpl) */ @@ -83,6 +85,20 @@ struct AutoHideTabPrivate DockContainer->handleAutoHideWidgetEvent(event, _this); } } + + /** + * Helper function to create and initialize the menu entries for + * the "Auto Hide Group To..." menu + */ + QAction* createAutoHideToAction(const QString& Title, SideBarLocation Location, + QMenu* Menu) + { + auto Action = Menu->addAction(Title); + Action->setProperty("Location", Location); + QObject::connect(Action, &QAction::triggered, _this, &CAutoHideTab::onAutoHideToActionClicked); + Action->setEnabled(Location != _this->sideBarLocation()); + return Action; + } }; // struct DockWidgetTabPrivate @@ -299,10 +315,10 @@ void CAutoHideTab::contextMenuEvent(QContextMenuEvent* ev) auto menu = Menu.addMenu(tr("Pin To...")); menu->setEnabled(IsPinnable); - //d->createAutoHideToAction(tr("Top"), SideBarTop, menu); - //d->createAutoHideToAction(tr("Left"), SideBarLeft, menu); - //d->createAutoHideToAction(tr("Right"), SideBarRight, menu); - //d->createAutoHideToAction(tr("Bottom"), SideBarBottom, menu); + d->createAutoHideToAction(tr("Top"), SideBarTop, menu); + d->createAutoHideToAction(tr("Left"), SideBarLeft, menu); + d->createAutoHideToAction(tr("Right"), SideBarRight, menu); + d->createAutoHideToAction(tr("Bottom"), SideBarBottom, menu); /*Menu.addSeparator(); Action = Menu.addAction(tr("Close"), this, SIGNAL(closeRequested())); @@ -315,23 +331,33 @@ void CAutoHideTab::contextMenuEvent(QContextMenuEvent* ev) } -//============================================================================ -void CAutoHideTab::mouseDoubleClickEvent(QMouseEvent *event) -{ - if (event->button() == Qt::LeftButton) - { - setDockWidgetFloating(); - } - - Super::mouseDoubleClickEvent(event); -} - - //============================================================================ void CAutoHideTab::setDockWidgetFloating() { + /*auto DockArea = dockWidget()->dockAreaWidget(); + auto AutoHideContainer = dockWidget()->autoHideDockContainer(); + auto OriginalSize = AutoHideContainer->originalDockWidgetSize(); + auto DockAreaSize = DockArea->size(); + if (ads::internal::isHorizontalSideBarLocation(sideBarLocation())) + { + DockAreaSize.setHeight(OriginalSize.height()); + } + else + { + DockAreaSize.setWidth(OriginalSize.width()); + } + DockArea->resize(DockAreaSize);*/ dockWidget()->setFloating(); } +//=========================================================================== +void CAutoHideTab::onAutoHideToActionClicked() +{ + int Location = sender()->property(LocationProperty).toInt(); + std::cout << "CAutoHideTab::onAutoHideToActionClicked " << Location << std::endl; + d->DockWidget->setAutoHide(true, (SideBarLocation)Location); +} + + } diff --git a/src/AutoHideTab.h b/src/AutoHideTab.h index 1e4a374..c9c6e0e 100644 --- a/src/AutoHideTab.h +++ b/src/AutoHideTab.h @@ -65,12 +65,14 @@ private: friend class CDockContainerWidget; friend DockContainerWidgetPrivate; +private Q_SLOTS: + void onAutoHideToActionClicked(); + protected: void setSideBar(CAutoHideSideBar *SideTabBar); void removeFromSideBar(); virtual bool event(QEvent* event) override; virtual void contextMenuEvent(QContextMenuEvent* ev) override; - virtual void mouseDoubleClickEvent(QMouseEvent *event) override; public: using Super = CPushButton; diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index daa1231..f968515 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1156,12 +1156,12 @@ bool DockContainerWidgetPrivate::restoreSideBar(CDockingStateReader& s, continue; } - auto SideBar = _this->sideTabBar(Area); + auto SideBar = _this->autoHideSideBar(Area); CAutoHideDockContainer* AutoHideContainer; if (DockWidget->isAutoHide()) { AutoHideContainer = DockWidget->autoHideDockContainer(); - if (AutoHideContainer->sideBar() != SideBar) + if (AutoHideContainer->autoHideSideBar() != SideBar) { SideBar->addAutoHideWidget(AutoHideContainer); } @@ -1472,7 +1472,7 @@ CAutoHideDockContainer* CDockContainerWidget::createAndSetupAutoHideContainer( DockWidget->setDockManager(d->DockManager); // Auto hide Dock Container needs a valid dock manager } - return sideTabBar(area)->insertDockWidget(-1, DockWidget); + return autoHideSideBar(area)->insertDockWidget(-1, DockWidget); } @@ -1731,7 +1731,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi // them into this widget for (auto AutohideWidget : FloatingWidget->dockContainer()->autoHideWidgets()) { - auto SideBar = sideTabBar(AutohideWidget->sideBarLocation()); + auto SideBar = autoHideSideBar(AutohideWidget->sideBarLocation()); SideBar->addAutoHideWidget(AutohideWidget); } @@ -2118,7 +2118,7 @@ void CDockContainerWidget::closeOtherAreas(CDockAreaWidget* KeepOpenArea) } //============================================================================ -CAutoHideSideBar* CDockContainerWidget::sideTabBar(SideBarLocation area) const +CAutoHideSideBar* CDockContainerWidget::autoHideSideBar(SideBarLocation area) const { return d->SideTabBarWidgets[area]; } @@ -2140,10 +2140,10 @@ QRect CDockContainerWidget::contentRect() const { auto ContentRect = this->rect(); ContentRect.adjust( - sideTabBar(SideBarLeft)->sizeHint().width(), - sideTabBar(SideBarTop)->sizeHint().height(), - -sideTabBar(SideBarRight)->sizeHint().width(), - -sideTabBar(SideBarBottom)->sizeHint().height()); + autoHideSideBar(SideBarLeft)->sizeHint().width(), + autoHideSideBar(SideBarTop)->sizeHint().height(), + -autoHideSideBar(SideBarRight)->sizeHint().width(), + -autoHideSideBar(SideBarBottom)->sizeHint().height()); return ContentRect; } diff --git a/src/DockContainerWidget.h b/src/DockContainerWidget.h index 2b080b4..6cc522b 100644 --- a/src/DockContainerWidget.h +++ b/src/DockContainerWidget.h @@ -329,7 +329,7 @@ public: /** * Returns the side tab widget for the given area */ - CAutoHideSideBar* sideTabBar(SideBarLocation area) const; + CAutoHideSideBar* autoHideSideBar(SideBarLocation area) const; /** diff --git a/src/DockOverlay.cpp b/src/DockOverlay.cpp index 096bc17..127fd6e 100644 --- a/src/DockOverlay.cpp +++ b/src/DockOverlay.cpp @@ -370,7 +370,7 @@ struct DockOverlayCrossPrivate int DockOverlayPrivate::sideBarOverlaySize(SideBarLocation sideBarLocation) { auto Container = qobject_cast(TargetWidget.data()); - auto SideBar = Container->sideTabBar(sideBarLocation); + auto SideBar = Container->autoHideSideBar(sideBarLocation); if (!SideBar || !SideBar->isVisibleTo(Container)) { return AutoHideAreaWidth; @@ -386,7 +386,7 @@ int DockOverlayPrivate::sideBarOverlaySize(SideBarLocation sideBarLocation) int DockOverlayPrivate::sideBarMouseZone(SideBarLocation sideBarLocation) { auto Container = qobject_cast(TargetWidget.data()); - auto SideBar = Container->sideTabBar(sideBarLocation); + auto SideBar = Container->autoHideSideBar(sideBarLocation); if (!SideBar || !SideBar->isVisibleTo(Container)) { return AutoHideAreaMouseZone; diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index f16a187..a22bec2 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -555,6 +555,13 @@ bool CDockWidget::isAutoHide() const } +//============================================================================ +SideBarLocation CDockWidget::autoHideLocation() const +{ + return isAutoHide() ? autoHideDockContainer()->sideBarLocation() : SideBarNone; +} + + //============================================================================ bool CDockWidget::isFloating() const { @@ -1206,7 +1213,7 @@ void CDockWidget::setAutoHide(bool Enable, SideBarLocation Location) } // Do nothing if nothing changes - if (Enable == isAutoHide()) + if (Enable == isAutoHide() && Location == autoHideLocation()) { return; } @@ -1216,6 +1223,25 @@ void CDockWidget::setAutoHide(bool Enable, SideBarLocation Location) { DockArea->setAutoHide(false); } + else if (isAutoHide()) + { + auto AutoHideContainer = autoHideDockContainer(); + auto OldOrientation = AutoHideContainer->orientation(); + auto SideBar = dockContainer()->autoHideSideBar(Location); + SideBar->addAutoHideWidget(AutoHideContainer); + if (SideBar->orientation() != OldOrientation) + { + auto OriginalSize = AutoHideContainer->originalDockWidgetSize(); + if (SideBar->orientation() == Qt::Horizontal) + { + AutoHideContainer->setSize(OriginalSize.height()); + } + else + { + AutoHideContainer->setSize(OriginalSize.width()); + } + } + } else { auto area = (SideBarNone == Location) ? DockArea->calculateSideTabBarArea() : Location; diff --git a/src/DockWidget.h b/src/DockWidget.h index 43f8048..4e6b0c7 100644 --- a/src/DockWidget.h +++ b/src/DockWidget.h @@ -377,6 +377,12 @@ public: */ CAutoHideDockContainer* autoHideDockContainer() const; + /** + * Returns the auto hide side bar location or SideBarNone if, this is not + * an autohide dock widget + */ + SideBarLocation autoHideLocation() const; + /** * This property holds whether the dock widget is floating. * A dock widget is only floating, if it is the one and only widget inside