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,

This commit is contained in:
Uwe Kindler 2018-12-03 12:52:57 +01:00
parent 87e3777e37
commit 653f475e72
9 changed files with 51 additions and 35 deletions

View File

@ -158,9 +158,6 @@ void DockAreaTitleBarPrivate::createButtons()
CloseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); CloseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
TopLayout->addWidget(CloseButton, 0); TopLayout->addWidget(CloseButton, 0);
_this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked())); _this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked()));
CloseButton->setEnabled(testConfigFlag(CDockManager::DockAreaHasCloseButton));
CloseButton->setVisible(CloseButton->isEnabled());
} }

View File

@ -458,16 +458,9 @@ void CDockAreaWidget::hideAreaWithNoVisibleContent()
{ {
this->toggleView(false); this->toggleView(false);
// Hide empty parent splitter // Hide empty parent splitters
auto Splitter = internal::findParent<CDockSplitter*>(this); auto Splitter = internal::findParent<CDockSplitter*>(this);
while (Splitter && Splitter->isVisible()) internal::hideEmptyParentSplitters(Splitter);
{
if (!Splitter->hasVisibleContent())
{
Splitter->hide();
}
Splitter = internal::findParent<CDockSplitter*>(Splitter);
}
//Hide empty floating widget //Hide empty floating widget
CDockContainerWidget* Container = this->dockContainer(); CDockContainerWidget* Container = this->dockContainer();

View File

@ -48,7 +48,7 @@
#include "ads_globals.h" #include "ads_globals.h"
#include "DockSplitter.h" #include "DockSplitter.h"
#include <QElapsedTimer> #include <iostream>
namespace ads namespace ads
@ -755,9 +755,13 @@ void DockContainerWidgetPrivate::dumpRecursive(int level, QWidget* widget)
{ {
qDebug("%sSplitter %s v: %s c: %s", qDebug("%sSplitter %s v: %s c: %s",
(const char*)buf, (const char*)buf,
(Splitter->orientation() == Qt::Vertical) ? "-" : "|", (Splitter->orientation() == Qt::Vertical) ? "--" : "|",
Splitter->isVisibleTo(Splitter->parentWidget()) ? "1" : "0", Splitter->isHidden() ? " " : "v",
QString::number(Splitter->count()).toStdString().c_str()); 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) for (int i = 0; i < Splitter->count(); ++i)
{ {
dumpRecursive(level + 1, Splitter->widget(i)); dumpRecursive(level + 1, Splitter->widget(i));
@ -771,6 +775,19 @@ void DockContainerWidgetPrivate::dumpRecursive(int level, QWidget* widget)
return; return;
} }
qDebug("%sDockArea", (const char*)buf); 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 #else
Q_UNUSED(level); Q_UNUSED(level);
@ -922,10 +939,10 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
d->DockAreas.removeAll(area); d->DockAreas.removeAll(area);
CDockSplitter* Splitter = internal::findParent<CDockSplitter*>(area); CDockSplitter* Splitter = internal::findParent<CDockSplitter*>(area);
// Remove are from parent splitter and hide splitter if it has no visible // Remove are from parent splitter and recursively hide tree of parent
// content // splitters if it has no visible content
area->setParent(0); 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 has more than 1 widgets, we are finished and can leave
if (Splitter->count() > 1) if (Splitter->count() > 1)
@ -1040,9 +1057,6 @@ int CDockContainerWidget::visibleDockAreaCount() const
void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWidget, void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWidget,
const QPoint& TargetPos) const QPoint& TargetPos)
{ {
QElapsedTimer Timer;
Timer.start();
qDebug() << "CDockContainerWidget::dropFloatingWidget"; qDebug() << "CDockContainerWidget::dropFloatingWidget";
CDockAreaWidget* DockArea = dockAreaAt(TargetPos); CDockAreaWidget* DockArea = dockAreaAt(TargetPos);
auto dropArea = InvalidDockWidgetArea; auto dropArea = InvalidDockWidgetArea;
@ -1203,8 +1217,10 @@ void CDockContainerWidget::dumpLayout()
{ {
#if (ADS_DEBUG_LEVEL > 0) #if (ADS_DEBUG_LEVEL > 0)
qDebug("\n\nDumping layout --------------------------"); qDebug("\n\nDumping layout --------------------------");
std::cout << "\n\nDumping layout --------------------------" << std::endl;
d->dumpRecursive(0, d->RootSplitter); d->dumpRecursive(0, d->RootSplitter);
qDebug("--------------------------\n\n"); qDebug("--------------------------\n\n");
std::cout << "--------------------------\n\n" << std::endl;
#endif #endif
} }

View File

@ -32,6 +32,7 @@
#include "DockManager.h" #include "DockManager.h"
#include <algorithm> #include <algorithm>
#include <iostream>
#include <QMainWindow> #include <QMainWindow>
#include <QList> #include <QList>
@ -53,8 +54,6 @@
#include "DockStateSerialization.h" #include "DockStateSerialization.h"
#include "DockAreaWidget.h" #include "DockAreaWidget.h"
#include <QElapsedTimer>
#include <iostream>
namespace ads namespace ads
{ {
@ -515,10 +514,6 @@ QByteArray CDockManager::saveState(eXmlMode XmlMode, int version) const
//============================================================================ //============================================================================
bool CDockManager::restoreState(const QByteArray &state, int version) 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 // Prevent multiple calls as long as state is not restore. This may
// happen, if QApplication::processEvents() is called somewhere // happen, if QApplication::processEvents() is called somewhere
if (d->RestoringState) if (d->RestoringState)

View File

@ -78,7 +78,7 @@ bool CDockSplitter::hasVisibleContent() const
// TODO Cache or precalculate this to speed up // TODO Cache or precalculate this to speed up
for (int i = 0; i < count(); ++i) for (int i = 0; i < count(); ++i)
{ {
if (widget(i)->isVisibleTo(this)) if (!widget(i)->isHidden())
{ {
return true; return true;
} }

View File

@ -224,7 +224,6 @@ bool DockWidgetTabPrivate::startFloating()
} }
else else
{ {
qDebug() << "DockWidgetTabPrivate::startFloating DockArea";
// If section widget has only one content widget, we can move the complete // If section widget has only one content widget, we can move the complete
// dock area into floating widget // dock area into floating widget
FloatingWidget = new CFloatingDockContainer(DockArea); FloatingWidget = new CFloatingDockContainer(DockArea);

View File

@ -150,10 +150,6 @@ void FloatingDockContainerPrivate::titleMouseReleaseEvent()
//============================================================================ //============================================================================
void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos) void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos)
{ {
static QElapsedTimer MsSinceLastCallTimer;
QElapsedTimer PerformanceTimer;
PerformanceTimer.start();
if (!_this->isVisible() || !DockManager) if (!_this->isVisible() || !DockManager)
{ {
return; return;
@ -225,8 +221,6 @@ void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos)
{ {
DockAreaOverlay->hideOverlay(); DockAreaOverlay->hideOverlay();
} }
std::cout << "updateDropOverlays us: " << PerformanceTimer.nsecsElapsed() / 1000 << std::endl;
} }

View File

@ -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<CDockSplitter*>(Splitter);
}
}
} // namespace internal } // namespace internal
} // namespace ads } // namespace ads

View File

@ -46,6 +46,8 @@ class QSplitter;
namespace ads namespace ads
{ {
class CDockSplitter;
enum DockWidgetArea enum DockWidgetArea
{ {
NoDockWidgetArea = 0x00, NoDockWidgetArea = 0x00,
@ -83,6 +85,12 @@ QSplitter* newSplitter(Qt::Orientation orientation, QWidget* parent = 0);
*/ */
void replaceSplitterWidget(QSplitter* Splitter, QWidget* From, QWidget* To); 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 * Convenience class for QPair to provide better naming than first and
* second * second