Fixed issue #164 - Single DockArea cannot be split

This commit is contained in:
Uwe Kindler 2020-05-11 09:03:28 +02:00
parent b7e7c0ccc3
commit aa7976dac6
2 changed files with 18 additions and 22 deletions

View File

@ -589,7 +589,7 @@ void CDockAreaTitleBar::mouseMoveEvent(QMouseEvent* ev)
return; return;
} }
// If this is the last dock area in a dock container it does not make // If this is the last dock area in a floating dock container it does not make
// sense to move it to a new floating widget and leave this one // sense to move it to a new floating widget and leave this one
// empty // empty
if (d->DockArea->dockContainer()->isFloating() if (d->DockArea->dockContainer()->isFloating()
@ -612,7 +612,7 @@ void CDockAreaTitleBar::mouseMoveEvent(QMouseEvent* ev)
int DragDistance = (d->DragStartMousePos - ev->pos()).manhattanLength(); int DragDistance = (d->DragStartMousePos - ev->pos()).manhattanLength();
if (DragDistance >= CDockManager::startDragDistance()) if (DragDistance >= CDockManager::startDragDistance())
{ {
ADS_PRINT("CTabsScrollArea::startFloating"); ADS_PRINT("CDockAreaTitlBar::startFloating");
d->startFloating(d->DragStartMousePos); d->startFloating(d->DragStartMousePos);
auto Overlay = d->DockArea->dockManager()->containerOverlay(); auto Overlay = d->DockArea->dockManager()->containerOverlay();
Overlay->setAllowedAreas(OuterDockAreas); Overlay->setAllowedAreas(OuterDockAreas);

View File

@ -33,7 +33,6 @@ struct FloatingDragPreviewPrivate
CFloatingDragPreview *_this; CFloatingDragPreview *_this;
QWidget* Content; QWidget* Content;
CDockAreaWidget* ContentSourceArea = nullptr; CDockAreaWidget* ContentSourceArea = nullptr;
CDockContainerWidget* ContenSourceContainer = nullptr;
QPoint DragStartMousePosition; QPoint DragStartMousePosition;
CDockManager* DockManager; CDockManager* DockManager;
CDockContainerWidget *DropContainer = nullptr; CDockContainerWidget *DropContainer = nullptr;
@ -123,22 +122,8 @@ void FloatingDragPreviewPrivate::updateDropOverlays(const QPoint &GlobalPos)
int VisibleDockAreas = TopContainer->visibleDockAreaCount(); int VisibleDockAreas = TopContainer->visibleDockAreaCount();
ContainerOverlay->setAllowedAreas( ContainerOverlay->setAllowedAreas(
VisibleDockAreas > 1 ? OuterDockAreas : AllDockAreas); VisibleDockAreas > 1 ? OuterDockAreas : AllDockAreas);
DockWidgetArea ContainerArea = InvalidDockWidgetArea;
// If there is only one single visible dock area in a container, then
// it does not make sense to show a dock overlay because the dock area
// would be removed and inserted at the same position
if (VisibleDockAreas <= 1)
{
ContainerOverlay->hideOverlay();
}
else
{
ContainerArea = ContainerOverlay->showOverlay(TopContainer);
}
ContainerOverlay->enableDropPreview(ContainerArea != InvalidDockWidgetArea);
auto DockArea = TopContainer->dockAreaAt(GlobalPos); auto DockArea = TopContainer->dockAreaAt(GlobalPos);
if (DockArea && DockArea->isVisible() && VisibleDockAreas > 0 && DockArea != ContentSourceArea) if (DockArea && DockArea->isVisible() && VisibleDockAreas >= 0 && DockArea != ContentSourceArea)
{ {
DockAreaOverlay->enableDropPreview(true); DockAreaOverlay->enableDropPreview(true);
DockAreaOverlay->setAllowedAreas( DockAreaOverlay->setAllowedAreas(
@ -149,8 +134,7 @@ void FloatingDragPreviewPrivate::updateDropOverlays(const QPoint &GlobalPos)
// the mouse is in the title bar. If the ContainerArea is valid // the mouse is in the title bar. If the ContainerArea is valid
// then we ignore the dock area of the dockAreaOverlay() and disable // then we ignore the dock area of the dockAreaOverlay() and disable
// the drop preview // the drop preview
if ((Area == CenterDockWidgetArea) if ((Area == CenterDockWidgetArea) && (ContainerDropArea != InvalidDockWidgetArea))
&& (ContainerArea != InvalidDockWidgetArea))
{ {
DockAreaOverlay->enableDropPreview(false); DockAreaOverlay->enableDropPreview(false);
ContainerOverlay->enableDropPreview(true); ContainerOverlay->enableDropPreview(true);
@ -159,10 +143,24 @@ void FloatingDragPreviewPrivate::updateDropOverlays(const QPoint &GlobalPos)
{ {
ContainerOverlay->enableDropPreview(InvalidDockWidgetArea == Area); ContainerOverlay->enableDropPreview(InvalidDockWidgetArea == Area);
} }
ContainerOverlay->showOverlay(TopContainer);
} }
else else
{ {
DockAreaOverlay->hideOverlay(); DockAreaOverlay->hideOverlay();
// If there is only one single visible dock area in a container, then
// it does not make sense to show a dock overlay because the dock area
// would be removed and inserted at the same position
if (VisibleDockAreas <= 1)
{
ContainerOverlay->hideOverlay();
}
else
{
ContainerOverlay->showOverlay(TopContainer);
}
if (DockArea == ContentSourceArea && InvalidDockWidgetArea == ContainerDropArea) if (DockArea == ContentSourceArea && InvalidDockWidgetArea == ContainerDropArea)
{ {
DropContainer = nullptr; DropContainer = nullptr;
@ -270,7 +268,6 @@ CFloatingDragPreview::CFloatingDragPreview(CDockWidget* Content)
if (Content->dockAreaWidget()->openDockWidgetsCount() == 1) if (Content->dockAreaWidget()->openDockWidgetsCount() == 1)
{ {
d->ContentSourceArea = Content->dockAreaWidget(); d->ContentSourceArea = Content->dockAreaWidget();
d->ContenSourceContainer = Content->dockContainer();
} }
setWindowTitle(Content->windowTitle()); setWindowTitle(Content->windowTitle());
} }
@ -282,7 +279,6 @@ CFloatingDragPreview::CFloatingDragPreview(CDockAreaWidget* Content)
{ {
d->DockManager = Content->dockManager(); d->DockManager = Content->dockManager();
d->ContentSourceArea = Content; d->ContentSourceArea = Content;
d->ContenSourceContainer = Content->dockContainer();
setWindowTitle(Content->currentDockWidget()->windowTitle()); setWindowTitle(Content->currentDockWidget()->windowTitle());
} }