mirror of
https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git
synced 2025-02-03 17:59:12 +08:00
Continued implementation of transparent docking
This commit is contained in:
parent
e15af4101a
commit
1be8f2861d
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +517,6 @@ void CFloatingDockContainer::startFloating(const QPoint &DragStartMousePos,
|
|||||||
#endif
|
#endif
|
||||||
moveFloating();
|
moveFloating();
|
||||||
show();
|
show();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user