diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index 211070f..b498362 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -410,7 +410,7 @@ void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget) //============================================================================ void CDockAreaWidget::hideAreaWithNoVisibleContent() { - this->hide(); + this->toggleView(false); // Hide empty parent splitter auto Splitter = internal::findParent(this); @@ -433,16 +433,6 @@ void CDockAreaWidget::hideAreaWithNoVisibleContent() } -//============================================================================ -void CDockAreaWidget::hideAreaIfNoVisibleContent() -{ - if (openedDockWidgets().isEmpty()) - { - hideAreaIfNoVisibleContent(); - } -} - - //============================================================================ void CDockAreaWidget::onTabCloseRequested(int Index) { @@ -668,18 +658,11 @@ CDockWidget::DockWidgetFeatures CDockAreaWidget::features() const //============================================================================ -void CDockAreaWidget::setVisible(bool visible) +void CDockAreaWidget::toggleView(bool Open) { - Super::setVisible(visible); - QString FirstDockWidgetLabel; - if (dockWidgetsCount()) - { - FirstDockWidgetLabel = dockWidget(0)->windowTitle(); - } - qDebug() << "CDockAreaWidget::setVisible " << visible << " " << FirstDockWidgetLabel - << " count: " << dockWidgetsCount() << " open count: " << openDockWidgetsCount(); + setVisible(Open); + emit viewToggled(Open); } - } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockAreaWidget.h b/src/DockAreaWidget.h index d07f202..b5304d2 100644 --- a/src/DockAreaWidget.h +++ b/src/DockAreaWidget.h @@ -116,13 +116,6 @@ protected: */ void hideAreaWithNoVisibleContent(); - /** - * This function checks, if the dock area has visible content, that means - * if any dock widget is open, and then calls hideAreaWithNoVisibleContent() - * if it does not find any visible content - */ - void hideAreaIfNoVisibleContent(); - /** * Updates the dock area layout and components visibility */ @@ -226,9 +219,10 @@ public slots: void setCurrentIndex(int index); /** - * This function is required for debugging purposes + * This property controls whether the dock area is open or closed. + * The toogleViewAction triggers this slot. */ - virtual void setVisible(bool visible) override; + void toggleView(bool Open); signals: /** @@ -249,6 +243,12 @@ signals: * @param index */ void currentChanged(int index); + + /** + * This signal is emitted if the visibility of this dock area is toggled + * via toggle view function + */ + void viewToggled(bool Open); }; // class DockAreaWidget } // namespace ads diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index 87c3c28..c173484 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -93,8 +93,9 @@ static void insertWidgetIntoSplitter(QSplitter* Splitter, QWidget* widget, bool /** * Private data class of CDockContainerWidget class (pimpl) */ -struct DockContainerWidgetPrivate +class DockContainerWidgetPrivate { +public: CDockContainerWidget* _this; QPointer DockManager; unsigned int zOrderIndex = 0; @@ -103,6 +104,7 @@ struct DockContainerWidgetPrivate QSplitter* RootSplitter; bool isFloating = false; CDockAreaWidget* LastAddedAreaCache[5]{0, 0, 0, 0, 0}; + int VisibleDockAreaCount = -1; /** * Private data constructor @@ -176,6 +178,42 @@ struct DockContainerWidgetPrivate * Helper function for recursive dumping of layout */ void dumpRecursive(int level, QWidget* widget); + + /** + * Initializes the visible dock area count variable if it is not initialized + * yet + */ + void initVisibleDockAreaCount() + { + if (VisibleDockAreaCount > -1) + { + return; + } + + VisibleDockAreaCount = 0; + for (auto DockArea : DockAreas) + { + VisibleDockAreaCount += DockArea->isHidden() ? 0 : 1; + } + } + + /** + * Access function for the visible dock area counter + */ + int& visibleDockAreaCount() + { + // Lazy initialisation - we initialize the VisibleDockAreaCount variable + // on first use + initVisibleDockAreaCount(); + return VisibleDockAreaCount; + } + +// private slots: ------------------------------------------------------------ + void onDockAreaViewToggled(bool Visible) + { + std::cout << "onDockAreaViewToggled " << Visible << std::endl; + VisibleDockAreaCount += Visible ? 1 : -1; + } }; // struct DockContainerWidgetPrivate @@ -922,8 +960,6 @@ int CDockContainerWidget::dockAreaCount() const //============================================================================ int CDockContainerWidget::visibleDockAreaCount() const { - // TODO Cache or precalculate this to speed it up because it is used during - // movement of floating widget int Result = 0; for (auto DockArea : d->DockAreas) { @@ -931,6 +967,10 @@ int CDockContainerWidget::visibleDockAreaCount() const } return Result; + + // TODO Cache or precalculate this to speed it up because it is used during + // movement of floating widget + //return d->visibleDockAreaCount(); } @@ -1029,6 +1069,7 @@ bool CDockContainerWidget::restoreState(QXmlStreamReader& s, bool Testing) QWidget*NewRootSplitter {}; if (!Testing) { + d->VisibleDockAreaCount = -1;// invalidate the dock area count d->DockAreas.clear(); } @@ -1162,9 +1203,8 @@ CDockWidget::DockWidgetFeatures CDockContainerWidget::features() const return Features; } - - } // namespace ads +#include "moc_DockContainerWidget.cpp" //--------------------------------------------------------------------------- // EOF DockContainerWidget.cpp diff --git a/src/DockContainerWidget.h b/src/DockContainerWidget.h index d07f688..5da5ffe 100644 --- a/src/DockContainerWidget.h +++ b/src/DockContainerWidget.h @@ -40,7 +40,7 @@ class QXmlStreamReader; namespace ads { -struct DockContainerWidgetPrivate; +class DockContainerWidgetPrivate; class CDockAreaWidget; class CDockWidget; class CDockManager; @@ -65,6 +65,7 @@ private: friend class CFloatingDockContainer; friend struct FloatingDockContainerPrivate; friend class CDockWidget; + Q_PRIVATE_SLOT(d, void onDockAreaViewToggled(bool Visible)) protected: /** diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index 1485641..a2bbb21 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -130,7 +130,7 @@ void DockWidgetPrivate::showDockWidget() } else { - DockArea->show(); + DockArea->toggleView(true); DockArea->setCurrentDockWidget(_this); TabWidget->show(); QSplitter* Splitter = internal::findParent(DockArea); diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index 7a119a8..66fb06a 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -350,14 +350,6 @@ void CFloatingDockContainer::showEvent(QShowEvent *event) { std::cout << "CFloatingDockContainer showEvent" << std::endl; QWidget::showEvent(event); - /*for (int i = 0; i < DockContainer->dockAreaCount(); ++i) - { - auto DockArea = DockContainer->dockArea(i); - for (auto DockWidget : DockArea->openedDockWidgets()) - { - DockWidget->setToggleViewActionChecked(true); - } - }*/ for (auto DockArea : d->DockContainer->openedDockAreas()) { for (auto DockWidget : DockArea->openedDockWidgets())