From 653f475e72fdb342dbcf36b3f7cefae263a529ab Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 3 Dec 2018 12:52:57 +0100 Subject: [PATCH] Removed wrong visibility initialisation of titlebar close button, added hideEmptyParentSplitters() function to properly hide tree of empty parent splitters if DockArea or DockWidget is removed, --- src/DockAreaTitleBar.cpp | 3 --- src/DockAreaWidget.cpp | 11 ++--------- src/DockContainerWidget.cpp | 34 +++++++++++++++++++++++++--------- src/DockManager.cpp | 7 +------ src/DockSplitter.cpp | 2 +- src/DockWidgetTab.cpp | 1 - src/FloatingDockContainer.cpp | 6 ------ src/ads_globals.cpp | 14 ++++++++++++++ src/ads_globals.h | 8 ++++++++ 9 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index 33ec304..0bcc7e4 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -158,9 +158,6 @@ void DockAreaTitleBarPrivate::createButtons() CloseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); TopLayout->addWidget(CloseButton, 0); _this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked())); - - CloseButton->setEnabled(testConfigFlag(CDockManager::DockAreaHasCloseButton)); - CloseButton->setVisible(CloseButton->isEnabled()); } diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index a31b035..b511c59 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -458,16 +458,9 @@ void CDockAreaWidget::hideAreaWithNoVisibleContent() { this->toggleView(false); - // Hide empty parent splitter + // Hide empty parent splitters auto Splitter = internal::findParent(this); - while (Splitter && Splitter->isVisible()) - { - if (!Splitter->hasVisibleContent()) - { - Splitter->hide(); - } - Splitter = internal::findParent(Splitter); - } + internal::hideEmptyParentSplitters(Splitter); //Hide empty floating widget CDockContainerWidget* Container = this->dockContainer(); diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index d86225f..3cb0de0 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -48,7 +48,7 @@ #include "ads_globals.h" #include "DockSplitter.h" -#include +#include namespace ads @@ -755,9 +755,13 @@ void DockContainerWidgetPrivate::dumpRecursive(int level, QWidget* widget) { qDebug("%sSplitter %s v: %s c: %s", (const char*)buf, - (Splitter->orientation() == Qt::Vertical) ? "-" : "|", - Splitter->isVisibleTo(Splitter->parentWidget()) ? "1" : "0", + (Splitter->orientation() == Qt::Vertical) ? "--" : "|", + Splitter->isHidden() ? " " : "v", QString::number(Splitter->count()).toStdString().c_str()); + std::cout << (const char*)buf << "Splitter " + << ((Splitter->orientation() == Qt::Vertical) ? "--" : "|") << " " + << (Splitter->isHidden() ? " " : "v") << " " + << QString::number(Splitter->count()).toStdString() << std::endl; for (int i = 0; i < Splitter->count(); ++i) { dumpRecursive(level + 1, Splitter->widget(i)); @@ -771,6 +775,19 @@ void DockContainerWidgetPrivate::dumpRecursive(int level, QWidget* widget) return; } qDebug("%sDockArea", (const char*)buf); + std::cout << (const char*)buf + << (DockArea->isHidden() ? " " : "v") + << (DockArea->openDockWidgetsCount() > 0 ? " " : "c") + << " DockArea" << std::endl; + buf.fill(' ', (level + 1) * 4); + for (int i = 0; i < DockArea->dockWidgetsCount(); ++i) + { + std::cout << (const char*)buf << (i == DockArea->currentIndex() ? "*" : " "); + CDockWidget* DockWidget = DockArea->dockWidget(i); + std::cout << (DockWidget->isHidden() ? " " : "v"); + std::cout << (DockWidget->isClosed() ? "c" : " ") << " "; + std::cout << DockWidget->windowTitle().toStdString() << std::endl; + } } #else Q_UNUSED(level); @@ -922,10 +939,10 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area) d->DockAreas.removeAll(area); CDockSplitter* Splitter = internal::findParent(area); - // Remove are from parent splitter and hide splitter if it has no visible - // content + // Remove are from parent splitter and recursively hide tree of parent + // splitters if it has no visible content area->setParent(0); - Splitter->setVisible(Splitter->hasVisibleContent()); + internal::hideEmptyParentSplitters(Splitter); // If splitter has more than 1 widgets, we are finished and can leave if (Splitter->count() > 1) @@ -1040,9 +1057,6 @@ int CDockContainerWidget::visibleDockAreaCount() const void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWidget, const QPoint& TargetPos) { - QElapsedTimer Timer; - Timer.start(); - qDebug() << "CDockContainerWidget::dropFloatingWidget"; CDockAreaWidget* DockArea = dockAreaAt(TargetPos); auto dropArea = InvalidDockWidgetArea; @@ -1203,8 +1217,10 @@ void CDockContainerWidget::dumpLayout() { #if (ADS_DEBUG_LEVEL > 0) qDebug("\n\nDumping layout --------------------------"); + std::cout << "\n\nDumping layout --------------------------" << std::endl; d->dumpRecursive(0, d->RootSplitter); qDebug("--------------------------\n\n"); + std::cout << "--------------------------\n\n" << std::endl; #endif } diff --git a/src/DockManager.cpp b/src/DockManager.cpp index ee07c64..a20ad5f 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -32,6 +32,7 @@ #include "DockManager.h" #include +#include #include #include @@ -53,8 +54,6 @@ #include "DockStateSerialization.h" #include "DockAreaWidget.h" -#include -#include namespace ads { @@ -515,10 +514,6 @@ QByteArray CDockManager::saveState(eXmlMode XmlMode, int version) const //============================================================================ bool CDockManager::restoreState(const QByteArray &state, int version) { - std::cout << "CDockManager::restoreState-----------------------" << std::endl; - QElapsedTimer Timer; - Timer.start(); - // Prevent multiple calls as long as state is not restore. This may // happen, if QApplication::processEvents() is called somewhere if (d->RestoringState) diff --git a/src/DockSplitter.cpp b/src/DockSplitter.cpp index 26cd2d8..fbbca6f 100644 --- a/src/DockSplitter.cpp +++ b/src/DockSplitter.cpp @@ -78,7 +78,7 @@ bool CDockSplitter::hasVisibleContent() const // TODO Cache or precalculate this to speed up for (int i = 0; i < count(); ++i) { - if (widget(i)->isVisibleTo(this)) + if (!widget(i)->isHidden()) { return true; } diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 00cba2e..b99288b 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -224,7 +224,6 @@ bool DockWidgetTabPrivate::startFloating() } else { - qDebug() << "DockWidgetTabPrivate::startFloating DockArea"; // If section widget has only one content widget, we can move the complete // dock area into floating widget FloatingWidget = new CFloatingDockContainer(DockArea); diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index 63dbe16..9d789b4 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -150,10 +150,6 @@ void FloatingDockContainerPrivate::titleMouseReleaseEvent() //============================================================================ void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos) { - static QElapsedTimer MsSinceLastCallTimer; - QElapsedTimer PerformanceTimer; - PerformanceTimer.start(); - if (!_this->isVisible() || !DockManager) { return; @@ -225,8 +221,6 @@ void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos) { DockAreaOverlay->hideOverlay(); } - - std::cout << "updateDropOverlays us: " << PerformanceTimer.nsecsElapsed() / 1000 << std::endl; } diff --git a/src/ads_globals.cpp b/src/ads_globals.cpp index 41b882c..48d8863 100644 --- a/src/ads_globals.cpp +++ b/src/ads_globals.cpp @@ -87,6 +87,20 @@ QPixmap createTransparentPixmap(const QPixmap& Source, qreal Opacity) } +//============================================================================ +void hideEmptyParentSplitters(CDockSplitter* Splitter) +{ + while (Splitter && Splitter->isVisible()) + { + if (!Splitter->hasVisibleContent()) + { + Splitter->hide(); + } + Splitter = internal::findParent(Splitter); + } +} + + } // namespace internal } // namespace ads diff --git a/src/ads_globals.h b/src/ads_globals.h index fb44cc9..5ddd626 100644 --- a/src/ads_globals.h +++ b/src/ads_globals.h @@ -46,6 +46,8 @@ class QSplitter; namespace ads { +class CDockSplitter; + enum DockWidgetArea { NoDockWidgetArea = 0x00, @@ -83,6 +85,12 @@ QSplitter* newSplitter(Qt::Orientation orientation, QWidget* parent = 0); */ void replaceSplitterWidget(QSplitter* Splitter, QWidget* From, QWidget* To); +/** + * This function walks the splitter tree upwards to hides all splitters + * that do not have visible content + */ +void hideEmptyParentSplitters(CDockSplitter* FirstParentSplitter); + /** * Convenience class for QPair to provide better naming than first and * second