Started implementing VisibleDockAreaCount cache

This commit is contained in:
Uwe Kindler 2018-11-01 07:53:54 +01:00
parent 268f8655a1
commit 5e6c82b68d
6 changed files with 61 additions and 45 deletions

View File

@ -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<CDockSplitter*>(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
//---------------------------------------------------------------------------

View File

@ -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

View File

@ -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<CDockManager> 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

View File

@ -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:
/**

View File

@ -130,7 +130,7 @@ void DockWidgetPrivate::showDockWidget()
}
else
{
DockArea->show();
DockArea->toggleView(true);
DockArea->setCurrentDockWidget(_this);
TabWidget->show();
QSplitter* Splitter = internal::findParent<QSplitter*>(DockArea);

View File

@ -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())