Reworked toggle view

Previous:
- It would just hide the overlay dock widget and leave the side tabs
still visible
- Close button, toggle view action would simply collapse the dock widget
intsead of completely hiding it

Current:
- Now toggle view and collapse functionality are separated.
- Toggle view will now hide the side tab bars completely
- Close button and toggle view action will completely hide it
- Collapse view will simply hide the overlay dock container without
hiding the side tabs
- Handled logic for floating widgets and toggling view
This commit is contained in:
Syarif Fakhri
2022-09-09 12:18:41 +08:00
parent 6ae14fada3
commit 84c6afa428
8 changed files with 105 additions and 27 deletions

View File

@@ -118,6 +118,12 @@ struct DockWidgetPrivate
*/
void updateParentDockArea();
/**
* Closes all overlayed dock widgets if there are no more opened dock areas
* This prevents the overlayed dock widgets from being pinned to an empty dock area
*/
void closeOverlayDockWidgetsIfNeeded();
/**
* Setup the top tool bar
*/
@@ -187,9 +193,10 @@ void DockWidgetPrivate::showDockWidget()
FloatingWidget->show();
}
if (DockArea->isOverlayed())
// If this widget is pinned and there are no opened dock widgets, unpin the overlay widget by moving it's contents to parent container
if (Container->openedDockWidgets().count() == 0 && DockArea->isOverlayed())
{
DockArea->overlayDockContainer()->show();
DockArea->overlayDockContainer()->moveContentsToParent();
}
}
}
@@ -200,17 +207,14 @@ void DockWidgetPrivate::hideDockWidget()
{
TabWidget->hide();
updateParentDockArea();
closeOverlayDockWidgetsIfNeeded();
if (Features.testFlag(CDockWidget::DeleteContentOnClose))
{
Widget->deleteLater();
Widget = nullptr;
}
if (DockArea->isOverlayed())
{
DockArea->overlayDockContainer()->hide();
}
}
@@ -239,6 +243,22 @@ void DockWidgetPrivate::updateParentDockArea()
}
}
void DockWidgetPrivate::closeOverlayDockWidgetsIfNeeded()
{
if (_this->dockContainer() && _this->dockContainer()->openedDockWidgets().isEmpty())
{
for (auto overlayWidget : _this->dockContainer()->overlayWidgets())
{
if (overlayWidget->dockWidget() == _this)
{
continue;
}
overlayWidget->dockWidget()->toggleView(false);
}
}
}
//============================================================================
void DockWidgetPrivate::setupToolBar()
@@ -611,6 +631,8 @@ void CDockWidget::toggleViewInternal(bool Open)
CDockWidget* TopLevelDockWidgetBefore = DockContainer
? DockContainer->topLevelDockWidget() : nullptr;
d->Closed = !Open;
if (Open)
{
d->showDockWidget();
@@ -619,7 +641,7 @@ void CDockWidget::toggleViewInternal(bool Open)
{
d->hideDockWidget();
}
d->Closed = !Open;
d->ToggleViewAction->blockSignals(true);
d->ToggleViewAction->setChecked(Open);
d->ToggleViewAction->blockSignals(false);
@@ -628,6 +650,11 @@ void CDockWidget::toggleViewInternal(bool Open)
d->DockArea->toggleDockWidgetView(this, Open);
}
if (d->DockArea->isOverlayed())
{
d->DockArea->overlayDockContainer()->toggleView(Open);
}
if (Open && TopLevelDockWidgetBefore)
{
CDockWidget::emitTopLevelEventForWidget(TopLevelDockWidgetBefore, false);
@@ -1051,9 +1078,8 @@ void CDockWidget::onDockWidgetSideTabClicked()
}
overlayContainer->raise();
const auto show = !overlayContainer->isVisible();
overlayContainer->setVisible(show);
toggleView(show);
const auto shouldCollapse = overlayContainer->isVisible();
overlayContainer->collapseView(shouldCollapse);
if (overlayContainer->isVisible())
{
// d->DockManager->setDockWidgetFocused(this) does not