diff --git a/src/AutoHideDockContainer.cpp b/src/AutoHideDockContainer.cpp index 5f7a728..267039c 100644 --- a/src/AutoHideDockContainer.cpp +++ b/src/AutoHideDockContainer.cpp @@ -27,14 +27,7 @@ //============================================================================ // INCLUDES //============================================================================ -#include -#include "DockManager.h" -#include "DockWidgetSideTab.h" -#include "DockWidgetTab.h" -#include "SideTabBar.h" -#include "DockAreaWidget.h" -#include "DockingStateReader.h" -#include "ResizeHandle.h" +#include "AutoHideDockContainer.h" #include #include @@ -43,6 +36,16 @@ #include #include +#include "DockManager.h" +#include "DockWidgetSideTab.h" +#include "DockWidgetTab.h" +#include "SideTabBar.h" +#include "DockAreaWidget.h" +#include "DockingStateReader.h" +#include "ResizeHandle.h" +#include "DockComponentsFactory.h" + + #include namespace ads @@ -174,7 +177,7 @@ CAutoHideDockContainer::CAutoHideDockContainer(CDockManager* DockManager, SideBa d(new AutoHideDockContainerPrivate(this)) { d->SideTabBarArea = area; - d->SideTab = new CDockWidgetSideTab(); + d->SideTab = componentsFactory()->createDockWidgetSideTab(nullptr); connect(d->SideTab, &CDockWidgetSideTab::pressed, this, &CAutoHideDockContainer::toggleCollapseState); d->DockArea = new CDockAreaWidget(DockManager, parent); d->DockArea->setObjectName("autoHideDockArea"); @@ -294,14 +297,7 @@ void CAutoHideDockContainer::addDockWidget(CDockWidget* DockWidget) } d->DockWidget = DockWidget; - if (!d->SideTab) - { - d->SideTab = DockWidget->sideTabWidget(); - } - else - { - d->SideTab->setDockWidget(DockWidget); - } + d->SideTab->setDockWidget(DockWidget); CDockAreaWidget* OldDockArea = DockWidget->dockAreaWidget(); if (OldDockArea) { diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index db49d69..4d47cb1 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -53,6 +53,7 @@ #include "DockComponentsFactory.h" #include "DockWidgetTab.h" #include "DockWidgetSideTab.h" +#include "DockingStateReader.h" namespace ads @@ -895,6 +896,98 @@ void CDockAreaWidget::saveState(QXmlStreamWriter& s) const } +//============================================================================ +bool CDockAreaWidget::restoreDockArea(CDockingStateReader& s, CDockAreaWidget*& CreatedWidget, + bool Testing, CDockContainerWidget* Container) +{ + bool Ok; +#ifdef ADS_DEBUG_PRINT + int Tabs = s.attributes().value("Tabs").toInt(&Ok); + if (!Ok) + { + return false; + } +#endif + + QString CurrentDockWidget = s.attributes().value("Current").toString(); + ADS_PRINT("Restore NodeDockArea Tabs: " << Tabs << " Current: " + << CurrentDockWidget); + + auto DockManager = Container->dockManager(); + CDockAreaWidget* DockArea = nullptr; + if (!Testing) + { + DockArea = new CDockAreaWidget(DockManager, Container); + const auto AllowedAreasAttribute = s.attributes().value("AllowedAreas"); + if (!AllowedAreasAttribute.isEmpty()) + { + DockArea->setAllowedAreas((DockWidgetArea)AllowedAreasAttribute.toInt(nullptr, 16)); + } + + const auto FlagsAttribute = s.attributes().value("Flags"); + if (!FlagsAttribute.isEmpty()) + { + DockArea->setDockAreaFlags((CDockAreaWidget::DockAreaFlags)FlagsAttribute.toInt(nullptr, 16)); + } + } + + while (s.readNextStartElement()) + { + if (s.name() != QLatin1String("Widget")) + { + continue; + } + + auto ObjectName = s.attributes().value("Name"); + if (ObjectName.isEmpty()) + { + return false; + } + + bool Closed = s.attributes().value("Closed").toInt(&Ok); + if (!Ok) + { + return false; + } + + s.skipCurrentElement(); + CDockWidget* DockWidget = DockManager->findDockWidget(ObjectName.toString()); + if (!DockWidget || Testing) + { + continue; + } + + ADS_PRINT("Dock Widget found - parent " << DockWidget->parent()); + // We hide the DockArea here to prevent the short display (the flashing) + // of the dock areas during application startup + DockArea->hide(); + DockArea->addDockWidget(DockWidget); + DockWidget->setToggleViewActionChecked(!Closed); + DockWidget->setClosedState(Closed); + DockWidget->setProperty(internal::ClosedProperty, Closed); + DockWidget->setProperty(internal::DirtyProperty, false); + } + + if (Testing) + { + return true; + } + + if (!DockArea->dockWidgetsCount()) + { + delete DockArea; + DockArea = nullptr; + } + else + { + DockArea->setProperty("currentDockWidget", CurrentDockWidget); + } + + CreatedWidget = DockArea; + return true; +} + + //============================================================================ CDockWidget* CDockAreaWidget::nextOpenDockWidget(CDockWidget* DockWidget) const { diff --git a/src/DockAreaWidget.h b/src/DockAreaWidget.h index 6a5b5f2..61862be 100644 --- a/src/DockAreaWidget.h +++ b/src/DockAreaWidget.h @@ -46,6 +46,7 @@ class CDockManager; class CDockContainerWidget; class DockContainerWidgetPrivate; class CDockAreaTitleBar; +class CDockingStateReader; /** @@ -296,6 +297,13 @@ public: */ void saveState(QXmlStreamWriter& Stream) const; + /** + * Restores a dock area. + * \see restoreChildNodes() for details + */ + static bool restoreDockArea(CDockingStateReader& Stream, CDockAreaWidget*& CreatedWidget, + bool Testing, CDockContainerWidget* Container); + /** * This functions returns the dock widget features of all dock widget in * this area. @@ -362,6 +370,7 @@ public: */ bool containsCentralWidget() const; + public Q_SLOTS: /** * This activates the tab for the given tab index. diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index 95f865f..f6c51b3 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -910,23 +910,7 @@ void DockContainerWidgetPrivate::saveAutoHideWidgetsState(QXmlStreamWriter& s) continue; } - s.writeStartElement("SideBar"); - s.writeAttribute("Area", QString::number(sideTabBar->sideTabBarArea())); - s.writeAttribute("Tabs", QString::number(sideTabBar->tabCount())); - - for (auto i = 0; i < sideTabBar->tabCount(); ++i) - { - auto Tab = sideTabBar->tabAt(i); - if (!Tab) - { - continue; - } - - auto DockArea = Tab->dockWidget()->dockAreaWidget(); - DockArea->saveState(s); - } - - s.writeEndElement(); + sideTabBar->saveState(s); } } @@ -1049,6 +1033,11 @@ bool DockContainerWidgetPrivate::restoreSplitter(CDockingStateReader& s, //============================================================================ bool DockContainerWidgetPrivate::restoreAutoHideDockArea(CDockingStateReader& s, SideBarLocation area, bool Testing) { + if (!CDockManager::testConfigFlag(CDockManager::AutoHideFeatureEnabled)) + { + return false; + } + bool Ok; #ifdef ADS_DEBUG_PRINT int Tabs = s.attributes().value("Tabs").toInt(&Ok); @@ -1062,11 +1051,6 @@ bool DockContainerWidgetPrivate::restoreAutoHideDockArea(CDockingStateReader& s, ADS_PRINT("Restore NodeDockArea Tabs: " << Tabs << " Current: " << CurrentDockWidget); - if (!CDockManager::testConfigFlag(CDockManager::AutoHideFeatureEnabled)) - { - return false; - } - CDockAreaWidget* DockArea = nullptr; CAutoHideDockContainer* AutoHideContainer = nullptr; if (!Testing) @@ -1136,91 +1120,14 @@ bool DockContainerWidgetPrivate::restoreAutoHideDockArea(CDockingStateReader& s, bool DockContainerWidgetPrivate::restoreDockArea(CDockingStateReader& s, QWidget*& CreatedWidget, bool Testing) { - bool Ok; -#ifdef ADS_DEBUG_PRINT - int Tabs = s.attributes().value("Tabs").toInt(&Ok); - if (!Ok) - { - return false; - } -#endif - - QString CurrentDockWidget = s.attributes().value("Current").toString(); - ADS_PRINT("Restore NodeDockArea Tabs: " << Tabs << " Current: " - << CurrentDockWidget); - CDockAreaWidget* DockArea = nullptr; - if (!Testing) + auto Result = CDockAreaWidget::restoreDockArea(s, DockArea, Testing, _this); + if (Result && DockArea) { - DockArea = new CDockAreaWidget(DockManager, _this); - const auto AllowedAreasAttribute = s.attributes().value("AllowedAreas"); - if (!AllowedAreasAttribute.isEmpty()) - { - DockArea->setAllowedAreas((DockWidgetArea)AllowedAreasAttribute.toInt(nullptr, 16)); - } - - const auto FlagsAttribute = s.attributes().value("Flags"); - if (!FlagsAttribute.isEmpty()) - { - DockArea->setDockAreaFlags((CDockAreaWidget::DockAreaFlags)FlagsAttribute.toInt(nullptr, 16)); - } - } - - while (s.readNextStartElement()) - { - if (s.name() != QLatin1String("Widget")) - { - continue; - } - - auto ObjectName = s.attributes().value("Name"); - if (ObjectName.isEmpty()) - { - return false; - } - - bool Closed = s.attributes().value("Closed").toInt(&Ok); - if (!Ok) - { - return false; - } - - s.skipCurrentElement(); - CDockWidget* DockWidget = DockManager->findDockWidget(ObjectName.toString()); - if (!DockWidget || Testing) - { - continue; - } - - ADS_PRINT("Dock Widget found - parent " << DockWidget->parent()); - // We hide the DockArea here to prevent the short display (the flashing) - // of the dock areas during application startup - DockArea->hide(); - DockArea->addDockWidget(DockWidget); - DockWidget->setToggleViewActionChecked(!Closed); - DockWidget->setClosedState(Closed); - DockWidget->setProperty(internal::ClosedProperty, Closed); - DockWidget->setProperty(internal::DirtyProperty, false); - } - - if (Testing) - { - return true; - } - - if (!DockArea->dockWidgetsCount()) - { - delete DockArea; - DockArea = nullptr; - } - else - { - DockArea->setProperty("currentDockWidget", CurrentDockWidget); appendDockAreas({DockArea}); } - CreatedWidget = DockArea; - return true; + return Result; } @@ -2319,6 +2226,13 @@ QRect CDockContainerWidget::contentRectGlobal() const } return internal::globalGeometry(d->RootSplitter); } + + +//=========================================================================== +CDockManager* CDockContainerWidget::dockManager() const +{ + return d->DockManager; +} } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockContainerWidget.h b/src/DockContainerWidget.h index 709d555..b97783a 100644 --- a/src/DockContainerWidget.h +++ b/src/DockContainerWidget.h @@ -342,6 +342,11 @@ public: */ QRect contentRectGlobal() const; + /** + * Returns the dock manager that owns this container + */ + CDockManager* dockManager() const; + Q_SIGNALS: /** diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index 855eba8..529bd1a 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -325,10 +325,6 @@ CDockWidget::CDockWidget(const QString &title, QWidget *parent) : setObjectName(title); d->TabWidget = componentsFactory()->createDockWidgetTab(this); - d->SideTabWidget = componentsFactory()->createDockWidgetSideTab(nullptr); - d->SideTabWidget->hide(); - - connect(d->SideTabWidget, &CDockWidgetSideTab::pressed, this, &CDockWidget::onDockWidgetSideTabClicked); d->ToggleViewAction = new QAction(title, this); d->ToggleViewAction->setCheckable(true); @@ -346,10 +342,6 @@ CDockWidget::CDockWidget(const QString &title, QWidget *parent) : CDockWidget::~CDockWidget() { ADS_PRINT("~CDockWidget()"); - if (d->SideTabWidget) - { - delete d->SideTabWidget; - } delete d; } @@ -443,6 +435,8 @@ CDockWidgetTab* CDockWidget::tabWidget() const return d->TabWidget; } + +//============================================================================ CAutoHideDockContainer* CDockWidget::autoHideDockContainer() const { if (!d->DockArea) @@ -534,6 +528,20 @@ CDockWidgetSideTab* CDockWidget::sideTabWidget() const } +//============================================================================ +void CDockWidget::setSideTabWidget(CDockWidgetSideTab* SideTab) const +{ + d->SideTabWidget = SideTab; +} + + +//============================================================================ +bool CDockWidget::isAutoHide() const +{ + return !d->SideTabWidget.isNull(); +} + + //============================================================================ bool CDockWidget::isFloating() const { @@ -741,6 +749,10 @@ bool CDockWidget::event(QEvent *e) { d->TabWidget->setText(title); } + if (d->SideTabWidget) + { + d->SideTabWidget->setText(title); + } if (d->ToggleViewAction) { d->ToggleViewAction->setText(title); @@ -791,7 +803,12 @@ void CDockWidget::setTabToolTip(const QString &text) void CDockWidget::setIcon(const QIcon& Icon) { d->TabWidget->setIcon(Icon); - d->SideTabWidget->setIcon(Icon); + + if (d->SideTabWidget) + { + d->SideTabWidget->setIcon(Icon); + } + if (!d->ToggleViewAction->isCheckable()) { d->ToggleViewAction->setIcon(Icon); @@ -1082,17 +1099,6 @@ void CDockWidget::showNormal() } } -//============================================================================ -void CDockWidget::onDockWidgetSideTabClicked() -{ - const auto autoHideContainer = autoHideDockContainer(); - if (!autoHideContainer) - { - return; - } - - autoHideContainer->toggleCollapseState(); -} //============================================================================ bool CDockWidget::isFullScreen() const diff --git a/src/DockWidget.h b/src/DockWidget.h index 52d87b2..ae8852c 100644 --- a/src/DockWidget.h +++ b/src/DockWidget.h @@ -315,12 +315,6 @@ public: */ CDockWidgetTab* tabWidget() const; - /** - * Returns the auto hide dock container of this dock widget - * or 0 if there is none - */ - CAutoHideDockContainer* autoHideDockContainer() const; - /** * Sets, whether the dock widget is movable, closable, and floatable. */ @@ -371,6 +365,22 @@ public: */ CDockWidgetSideTab* sideTabWidget() const; + /** + * Assign a side tab widget if this dock widget is an auto hide container + */ + void setSideTabWidget(CDockWidgetSideTab* SideTab) const; + + /** + * Returns true, if this dock widget is in an auto hide container + */ + bool isAutoHide() const; + + /** + * Returns the auto hide dock container of this dock widget + * or 0 if there is none + */ + CAutoHideDockContainer* autoHideDockContainer() 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 @@ -613,10 +623,6 @@ public Q_SLOTS: */ void showNormal(); - /** - * Toggles the dock auto hide container when the side tab is clicked - */ - void onDockWidgetSideTabClicked(); Q_SIGNALS: /** diff --git a/src/DockWidgetSideTab.cpp b/src/DockWidgetSideTab.cpp index 4b90cdd..29e8ccc 100644 --- a/src/DockWidgetSideTab.cpp +++ b/src/DockWidgetSideTab.cpp @@ -205,6 +205,7 @@ void CDockWidgetSideTab::setDockWidget(CDockWidget* DockWidget) } d->DockWidget = DockWidget; setText(DockWidget->windowTitle()); + setIcon(d->DockWidget->icon()); } } diff --git a/src/SideTabBar.cpp b/src/SideTabBar.cpp index c1c0a19..8c7296d 100644 --- a/src/SideTabBar.cpp +++ b/src/SideTabBar.cpp @@ -34,12 +34,14 @@ #include #include #include +#include #include "DockContainerWidget.h" #include "DockWidgetSideTab.h" #include "DockWidgetTab.h" #include "DockFocusController.h" #include "AutoHideDockContainer.h" +#include "DockAreaWidget.h" namespace ads { @@ -274,4 +276,31 @@ SideBarLocation CSideTabBar::sideTabBarArea() const return d->SideTabArea; } + +//============================================================================ +void CSideTabBar::saveState(QXmlStreamWriter& s) const +{ + if (!tabCount()) + { + return; + } + + s.writeStartElement("SideBar"); + s.writeAttribute("Area", QString::number(sideTabBarArea())); + s.writeAttribute("Tabs", QString::number(tabCount())); + + for (auto i = 0; i < tabCount(); ++i) + { + auto Tab = tabAt(i); + if (!Tab) + { + continue; + } + + auto DockArea = Tab->dockWidget()->dockAreaWidget(); + DockArea->saveState(s); + } + + s.writeEndElement(); +} } diff --git a/src/SideTabBar.h b/src/SideTabBar.h index 4ba757a..585be39 100644 --- a/src/SideTabBar.h +++ b/src/SideTabBar.h @@ -33,9 +33,12 @@ #include "DockWidgetSideTab.h" #include "ads_globals.h" +class QXmlStreamWriter; + namespace ads { struct SideTabBarPrivate; +class DockContainerWidgetPrivate; class CDockContainerWidget; class CDockWidgetSideTab; class CAutoHideDockContainer; @@ -57,12 +60,18 @@ private: SideTabBarPrivate* d; ///< private data (pimpl) friend struct SideTabBarPrivate; friend class DockWidgetSideTab; + friend DockContainerWidgetPrivate; protected: virtual void paintEvent(QPaintEvent* event) override; virtual bool event(QEvent* e) override; virtual bool eventFilter(QObject *watched, QEvent *event) override; + /** + * Saves the state into the given stream + */ + void saveState(QXmlStreamWriter& Stream) const; + public: using Super = QFrame;