diff --git a/AdvancedDockingSystem/src/v2/DockAreaWidget.cpp b/AdvancedDockingSystem/src/v2/DockAreaWidget.cpp index 00028ea..d3bf17c 100644 --- a/AdvancedDockingSystem/src/v2/DockAreaWidget.cpp +++ b/AdvancedDockingSystem/src/v2/DockAreaWidget.cpp @@ -42,6 +42,7 @@ #include "DockContainerWidget.h" #include "DockWidget.h" #include "DockWidgetTitleBar.h" +#include "FloatingDockContainer.h" #include @@ -52,12 +53,19 @@ static const char* const ACTION_PROPERTY = "action"; /** * Custom scroll bar implementation for dock area tab bar + * This scroll area enables floating of a whole dock area including all + * dock widgets */ class CTabsScrollArea : public QScrollArea { +private: + QPoint m_DragStartMousePos; + CDockAreaWidget* DockArea; + public: - CTabsScrollArea(QWidget* parent = nullptr) - : QScrollArea(parent) + CTabsScrollArea(CDockAreaWidget* parent) + : QScrollArea(parent), + DockArea(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored); setFrameStyle(QFrame::NoFrame); @@ -80,6 +88,40 @@ protected: horizontalScrollBar()->setValue(horizontalScrollBar()->value() - 20); } } + + /** + * Stores mouse position to detect dragging + */ + void mousePressEvent(QMouseEvent* ev) + { + if (ev->button() == Qt::LeftButton) + { + ev->accept(); + m_DragStartMousePos = ev->pos(); + return; + } + QScrollArea::mousePressEvent(ev); + } + + /** + * Starts floating the complete docking area including all dock widgets + */ + void mouseMoveEvent(QMouseEvent* ev) + { + QScrollArea::mouseMoveEvent(ev); + if (ev->buttons() != Qt::LeftButton) + { + return; + } + if (!this->geometry().contains(ev->pos())) + { + QSize Size = DockArea->size(); + CFloatingDockContainer* FloatingWidget = new CFloatingDockContainer(DockArea); + FloatingWidget->startFloating(m_DragStartMousePos, Size); + } + + return; + } }; // class CTabsScrollArea diff --git a/AdvancedDockingSystem/src/v2/DockWidgetTitleBar.cpp b/AdvancedDockingSystem/src/v2/DockWidgetTitleBar.cpp index f99a38a..2873121 100644 --- a/AdvancedDockingSystem/src/v2/DockWidgetTitleBar.cpp +++ b/AdvancedDockingSystem/src/v2/DockWidgetTitleBar.cpp @@ -172,9 +172,7 @@ void DockWidgetTitleBarPrivate::startFloating(const QPoint& GlobalPos) FloatingWidget = new CFloatingDockContainer(DockArea); } - FloatingWidget->resize(Size); - FloatingWidget->setObjectName("FloatingWidget"); - FloatingWidget->startFloating(DragStartMousePosition); + FloatingWidget->startFloating(DragStartMousePosition, Size); /* * DropOverlay* ContainerDropOverlay = cw->dropOverlay(); diff --git a/AdvancedDockingSystem/src/v2/FloatingDockContainer.cpp b/AdvancedDockingSystem/src/v2/FloatingDockContainer.cpp index fe83a3f..6050ba5 100644 --- a/AdvancedDockingSystem/src/v2/FloatingDockContainer.cpp +++ b/AdvancedDockingSystem/src/v2/FloatingDockContainer.cpp @@ -279,6 +279,7 @@ bool CFloatingDockContainer::event(QEvent *e) std::cout << "FloatingWidget::event QEvent::NonClientAreaMouseButtonRelease" << std::endl; d->titleMouseReleaseEvent(); } + return QWidget::event(e); } @@ -286,7 +287,7 @@ bool CFloatingDockContainer::event(QEvent *e) //============================================================================ bool CFloatingDockContainer::eventFilter(QObject *watched, QEvent *event) { - if (event->type() == QEvent::MouseButtonRelease) + if (event->type() == QEvent::MouseButtonRelease && d->DraggingActive) { std::cout << "FloatingWidget::eventFilter QEvent::MouseButtonRelease" << std::endl; d->titleMouseReleaseEvent(); @@ -304,8 +305,9 @@ bool CFloatingDockContainer::eventFilter(QObject *watched, QEvent *event) //============================================================================ -void CFloatingDockContainer::startFloating(const QPoint& Pos) +void CFloatingDockContainer::startFloating(const QPoint& Pos, const QSize& Size) { + resize(Size); d->setDraggingActive(true); QPoint TargetPos = QCursor::pos() - Pos; move(TargetPos); diff --git a/AdvancedDockingSystem/src/v2/FloatingDockContainer.h b/AdvancedDockingSystem/src/v2/FloatingDockContainer.h index 76374ca..ace29c9 100644 --- a/AdvancedDockingSystem/src/v2/FloatingDockContainer.h +++ b/AdvancedDockingSystem/src/v2/FloatingDockContainer.h @@ -86,7 +86,7 @@ public: /** * Starts floating at the given global position */ - void startFloating(const QPoint& Pos); + void startFloating(const QPoint& Pos, const QSize& Size = QSize()); }; // class FloatingDockContainer } // namespace ads