Continued implementation of transparent docking

This commit is contained in:
Uwe Kindler 2019-11-27 12:00:04 +01:00
parent e15af4101a
commit 1be8f2861d
4 changed files with 118 additions and 17 deletions

View File

@ -170,6 +170,12 @@ public:
*/ */
void moveToNewSection(QWidget* Widget, CDockAreaWidget* TargetArea, DockWidgetArea area); void moveToNewSection(QWidget* Widget, CDockAreaWidget* TargetArea, DockWidgetArea area);
/**
* Moves the dock widget or dock area given in Widget parameter to a
* a dock area in container
*/
void moveToContainer(QWidget* Widgett, DockWidgetArea area);
/** /**
* Creates a new tab for a widget dropped into the center of a section * Creates a new tab for a widget dropped into the center of a section
*/ */
@ -550,15 +556,82 @@ void DockContainerWidgetPrivate::moveIntoCenterOfSection(QWidget* Widget, CDockA
//============================================================================ //============================================================================
void DockContainerWidgetPrivate::moveToNewSection(QWidget* Widget, CDockAreaWidget* TargetArea, DockWidgetArea area) void DockContainerWidgetPrivate::moveToNewSection(QWidget* Widget, CDockAreaWidget* TargetDockArea, DockWidgetArea area)
{ {
// Dropping into center means all dock widgets in the dropped floating // Dropping into center means all dock widgets in the dropped floating
// widget will become tabs of the drop area // widget will become tabs of the drop area
if (CenterDockWidgetArea == area) if (CenterDockWidgetArea == area)
{ {
moveIntoCenterOfSection(Widget, TargetArea); moveIntoCenterOfSection(Widget, TargetDockArea);
return; return;
} }
CDockWidget* DroppedDockWidget = qobject_cast<CDockWidget*>(Widget);
CDockAreaWidget* DroppedDockArea = qobject_cast<CDockAreaWidget*>(Widget);
CDockAreaWidget* NewDockArea;
if (DroppedDockWidget)
{
NewDockArea = new CDockAreaWidget(DockManager, _this);
CDockAreaWidget* OldDockArea = DroppedDockWidget->dockAreaWidget();
if (OldDockArea)
{
OldDockArea->removeDockWidget(DroppedDockWidget);
}
NewDockArea->addDockWidget(DroppedDockWidget);
}
else
{
DroppedDockArea->dockContainer()->removeDockArea(DroppedDockArea);
NewDockArea = DroppedDockArea;
}
auto InsertParam = internal::dockAreaInsertParameters(area);
QSplitter* TargetAreaSplitter = internal::findParent<QSplitter*>(TargetDockArea);
int index = TargetAreaSplitter ->indexOf(TargetDockArea);
if (TargetAreaSplitter->orientation() == InsertParam.orientation())
{
ADS_PRINT("TargetAreaSplitter->orientation() == InsertParam.orientation()");
TargetAreaSplitter->insertWidget(index + InsertParam.insertOffset(), NewDockArea);
}
else
{
ADS_PRINT("TargetAreaSplitter->orientation() != InsertParam.orientation()");
QSplitter* NewSplitter = newSplitter(InsertParam.orientation());
NewSplitter->addWidget(TargetDockArea);
insertWidgetIntoSplitter(NewSplitter, NewDockArea, InsertParam.append());
TargetAreaSplitter->insertWidget(index, NewSplitter);
}
addDockAreasToList({NewDockArea});
}
//============================================================================
void DockContainerWidgetPrivate::moveToContainer(QWidget* Widget, DockWidgetArea area)
{
CDockWidget* DroppedDockWidget = qobject_cast<CDockWidget*>(Widget);
CDockAreaWidget* DroppedDockArea = qobject_cast<CDockAreaWidget*>(Widget);
CDockAreaWidget* NewDockArea;
if (DroppedDockWidget)
{
NewDockArea = new CDockAreaWidget(DockManager, _this);
CDockAreaWidget* OldDockArea = DroppedDockWidget->dockAreaWidget();
if (OldDockArea)
{
OldDockArea->removeDockWidget(DroppedDockWidget);
}
NewDockArea->addDockWidget(DroppedDockWidget);
}
else
{
DroppedDockArea->dockContainer()->removeDockArea(DroppedDockArea);
NewDockArea = DroppedDockArea;
}
addDockArea(NewDockArea, area);
//NewDockArea->updateTitleBarVisibility();
LastAddedAreaCache[areaIdToIndex(area)] = NewDockArea;
} }
@ -907,9 +980,7 @@ void DockContainerWidgetPrivate::addDockArea(CDockAreaWidget* NewDockArea, DockW
RootSplitter = NewSplitter; RootSplitter = NewSplitter;
} }
appendDockAreas({NewDockArea}); addDockAreasToList({NewDockArea});
NewDockArea->updateTitleBarVisibility();
emitDockAreasAdded();
} }
@ -1305,7 +1376,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
//============================================================================ //============================================================================
void CDockContainerWidget::dropWidget(QWidget* DockWidget, const QPoint& TargetPos) void CDockContainerWidget::dropWidget(QWidget* Widget, const QPoint& TargetPos)
{ {
ADS_PRINT("CDockContainerWidget::dropFloatingWidget"); ADS_PRINT("CDockContainerWidget::dropFloatingWidget");
CDockAreaWidget* DockArea = dockAreaAt(TargetPos); CDockAreaWidget* DockArea = dockAreaAt(TargetPos);
@ -1327,7 +1398,7 @@ void CDockContainerWidget::dropWidget(QWidget* DockWidget, const QPoint& TargetP
if (dropArea != InvalidDockWidgetArea) if (dropArea != InvalidDockWidgetArea)
{ {
ADS_PRINT("Dock Area Drop Content: " << dropArea); ADS_PRINT("Dock Area Drop Content: " << dropArea);
d->moveToNewSection(DockWidget, DockArea, dropArea); d->moveToNewSection(Widget, DockArea, dropArea);
} }
} }
@ -1338,7 +1409,7 @@ void CDockContainerWidget::dropWidget(QWidget* DockWidget, const QPoint& TargetP
ADS_PRINT("Container Drop Content: " << dropArea); ADS_PRINT("Container Drop Content: " << dropArea);
if (dropArea != InvalidDockWidgetArea) if (dropArea != InvalidDockWidgetArea)
{ {
//d->dropIntoContainer(FloatingWidget, dropArea); d->moveToContainer(Widget, dropArea);
} }
} }

View File

@ -517,7 +517,6 @@ void CFloatingDockContainer::startFloating(const QPoint &DragStartMousePos,
#endif #endif
moveFloating(); moveFloating();
show(); show();
} }
//============================================================================ //============================================================================

View File

@ -32,11 +32,14 @@ struct FloatingOverlayPrivate
{ {
CFloatingOverlay *_this; CFloatingOverlay *_this;
QWidget* Content; QWidget* Content;
CDockAreaWidget* ContentSourceArea = nullptr;
CDockContainerWidget* ContenSourceContainer = nullptr;
QPoint DragStartMousePosition; QPoint DragStartMousePosition;
CDockManager* DockManager; CDockManager* DockManager;
CDockContainerWidget *DropContainer = nullptr; CDockContainerWidget *DropContainer = nullptr;
qreal WindowOpacity; qreal WindowOpacity;
bool Hidden = false; bool Hidden = false;
bool IgnoreMouseEvents = false;
/** /**
@ -89,6 +92,8 @@ void FloatingOverlayPrivate::updateDropOverlays(const QPoint &GlobalPos)
DropContainer = TopContainer; DropContainer = TopContainer;
auto ContainerOverlay = DockManager->containerOverlay(); auto ContainerOverlay = DockManager->containerOverlay();
auto DockAreaOverlay = DockManager->dockAreaOverlay(); auto DockAreaOverlay = DockManager->dockAreaOverlay();
auto DockDropArea = DockAreaOverlay->dropAreaUnderCursor();
auto ContainerDropArea = ContainerOverlay->dropAreaUnderCursor();
if (!TopContainer) if (!TopContainer)
{ {
@ -104,7 +109,7 @@ void FloatingOverlayPrivate::updateDropOverlays(const QPoint &GlobalPos)
DockWidgetArea ContainerArea = ContainerOverlay->showOverlay(TopContainer); DockWidgetArea ContainerArea = ContainerOverlay->showOverlay(TopContainer);
ContainerOverlay->enableDropPreview(ContainerArea != InvalidDockWidgetArea); ContainerOverlay->enableDropPreview(ContainerArea != InvalidDockWidgetArea);
auto DockArea = TopContainer->dockAreaAt(GlobalPos); auto DockArea = TopContainer->dockAreaAt(GlobalPos);
if (DockArea && DockArea->isVisible() && VisibleDockAreas > 0) if (DockArea && DockArea->isVisible() && VisibleDockAreas > 0 && DockArea != ContentSourceArea)
{ {
DockAreaOverlay->enableDropPreview(true); DockAreaOverlay->enableDropPreview(true);
DockAreaOverlay->setAllowedAreas( DockAreaOverlay->setAllowedAreas(
@ -129,10 +134,12 @@ void FloatingOverlayPrivate::updateDropOverlays(const QPoint &GlobalPos)
else else
{ {
DockAreaOverlay->hideOverlay(); DockAreaOverlay->hideOverlay();
if (DockArea == ContentSourceArea && InvalidDockWidgetArea == ContainerDropArea)
{
DropContainer = nullptr;
}
} }
auto DockDropArea = DockAreaOverlay->dropAreaUnderCursor();
auto ContainerDropArea = ContainerOverlay->dropAreaUnderCursor();
setHidden(DockDropArea != InvalidDockWidgetArea || ContainerDropArea != InvalidDockWidgetArea); setHidden(DockDropArea != InvalidDockWidgetArea || ContainerDropArea != InvalidDockWidgetArea);
} }
@ -165,18 +172,25 @@ CFloatingOverlay::CFloatingOverlay(QWidget* Content, QWidget* parent) :
//============================================================================ //============================================================================
CFloatingOverlay::CFloatingOverlay(CDockWidget* Content, QWidget* parent) CFloatingOverlay::CFloatingOverlay(CDockWidget* Content)
: CFloatingOverlay((QWidget*)Content, Content->dockManager()) : CFloatingOverlay((QWidget*)Content, Content->dockManager())
{ {
d->DockManager = Content->dockManager(); d->DockManager = Content->dockManager();
if (Content->dockAreaWidget()->openDockWidgetsCount() == 1)
{
d->ContentSourceArea = Content->dockAreaWidget();
d->ContenSourceContainer = Content->dockContainer();
}
} }
//============================================================================ //============================================================================
CFloatingOverlay::CFloatingOverlay(CDockAreaWidget* Content, QWidget* parent) CFloatingOverlay::CFloatingOverlay(CDockAreaWidget* Content)
: CFloatingOverlay((QWidget*)Content, Content->dockManager()) : CFloatingOverlay((QWidget*)Content, Content->dockManager())
{ {
d->DockManager = Content->dockManager(); d->DockManager = Content->dockManager();
d->ContentSourceArea = Content;
d->ContenSourceContainer = Content->dockContainer();
} }
@ -224,7 +238,7 @@ void CFloatingOverlay::moveEvent(QMoveEvent *event)
bool CFloatingOverlay::eventFilter(QObject *watched, QEvent *event) bool CFloatingOverlay::eventFilter(QObject *watched, QEvent *event)
{ {
Q_UNUSED(watched); Q_UNUSED(watched);
if (event->type() == QEvent::MouseButtonRelease) if (event->type() == QEvent::MouseButtonRelease && !d->IgnoreMouseEvents)
{ {
ADS_PRINT("FloatingWidget::eventFilter QEvent::MouseButtonRelease"); ADS_PRINT("FloatingWidget::eventFilter QEvent::MouseButtonRelease");
std::cout << "CFloatingOverlay::eventFilter QEvent::MouseButtonRelease" << std::endl; std::cout << "CFloatingOverlay::eventFilter QEvent::MouseButtonRelease" << std::endl;
@ -234,10 +248,27 @@ bool CFloatingOverlay::eventFilter(QObject *watched, QEvent *event)
d->DropContainer->dropWidget(d->Content, QCursor::pos()); d->DropContainer->dropWidget(d->Content, QCursor::pos());
d->DropContainer = nullptr; d->DropContainer = nullptr;
} }
else
{
CDockWidget* DockWidget = qobject_cast<CDockWidget*>(d->Content);
CFloatingDockContainer* FloatingWidget;
if (DockWidget)
{
FloatingWidget = new CFloatingDockContainer(DockWidget);
}
else
{
CDockAreaWidget* DockArea = qobject_cast<CDockAreaWidget*>(d->Content);
FloatingWidget = new CFloatingDockContainer(DockArea);
}
FloatingWidget->setGeometry(this->geometry());
FloatingWidget->show();
}
this->close(); this->close();
d->DockManager->containerOverlay()->hideOverlay(); d->DockManager->containerOverlay()->hideOverlay();
d->DockManager->dockAreaOverlay()->hideOverlay(); d->DockManager->dockAreaOverlay()->hideOverlay();
d->IgnoreMouseEvents = true;
} }
return false; return false;

View File

@ -41,8 +41,8 @@ protected:
public: public:
using Super = QRubberBand; using Super = QRubberBand;
CFloatingOverlay(CDockWidget* Content, QWidget* parent = nullptr); CFloatingOverlay(CDockWidget* Content);
CFloatingOverlay(CDockAreaWidget* Content, QWidget* parent = nullptr); CFloatingOverlay(CDockAreaWidget* Content);
/** /**
* Delete private data * Delete private data