diff --git a/demo/mainwindow.cpp b/demo/mainwindow.cpp index a565d42..b3caeb6 100644 --- a/demo/mainwindow.cpp +++ b/demo/mainwindow.cpp @@ -105,8 +105,8 @@ void MainWindow::createContent() DockWidget->setFeatures(DockWidget->features().setFlag(ads::CDockWidget::DockWidgetClosable, false)); m_DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget); m_DockManager->addDockWidget(ads::LeftDockWidgetArea, createLongTextLabelDockWidget(ViewMenu)); - /*m_DockManager->addDockWidget(ads::BottomDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu)); - auto TopDockArea = m_DockManager->addDockWidget(ads::TopDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu)); + m_DockManager->addDockWidget(ads::BottomDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu)); + /*auto TopDockArea = m_DockManager->addDockWidget(ads::TopDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu)); DockWidget = createCalendarDockWidget(ViewMenu); DockWidget->setFeatures(DockWidget->features().setFlag(ads::CDockWidget::DockWidgetClosable, false)); m_DockManager->addDockWidget(ads::CenterDockWidgetArea, DockWidget, TopDockArea); diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index 8697f19..e3b31dc 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -124,7 +124,8 @@ struct DockContainerWidgetPrivate /** * Restore state of child nodes. * \param[in] Stream The data stream that contains the serialized state - * \param[out] CreatedWidget The widget created from parsed data + * \param[out] CreatedWidget The widget created from parsed data or 0 if + * the parsed widget was an empty splitter * \param[in] Testing If Testing is true, only the stream data is * parsed without modifiying anything. */ @@ -828,10 +829,18 @@ bool CDockContainerWidget::restoreState(QDataStream& stream, bool Testing) return true; } + // If the root splitter is empty, rostoreChildNodes returns a 0 pointer + // and we need to create a new empty root splitter + if (!NewRootSplitter) + { + NewRootSplitter = internal::newSplitter(Qt::Horizontal); + } + d->Layout->replaceWidget(d->RootSplitter, NewRootSplitter); QSplitter* OldRoot = d->RootSplitter; d->RootSplitter = dynamic_cast(NewRootSplitter); OldRoot->deleteLater(); + return true; } diff --git a/src/DockOverlay.cpp b/src/DockOverlay.cpp index 7da4a84..4c06f2d 100644 --- a/src/DockOverlay.cpp +++ b/src/DockOverlay.cpp @@ -148,6 +148,7 @@ struct DockOverlayPrivate QPointer TargetWidget; QRect TargetRect; DockWidgetArea LastLocation = InvalidDockWidgetArea; + bool DropPreviewEnabled = true; /** * Private data constructor @@ -187,7 +188,7 @@ CDockOverlay::CDockOverlay(QWidget* parent, eMode Mode) : { d->Cross = new CDockOverlayCross(this); setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); - setWindowOpacity(0.2); + setWindowOpacity(1); setWindowTitle("DockOverlay"); setAttribute(Qt::WA_NoSystemBackground); setAttribute(Qt::WA_TranslucentBackground); @@ -195,6 +196,8 @@ CDockOverlay::CDockOverlay(QWidget* parent, eMode Mode) : QBoxLayout* l = new QBoxLayout(QBoxLayout::TopToBottom); l->setSpacing(0); setLayout(l); + l->setContentsMargins(QMargins(0, 0, 0, 0)); + l->addWidget(d->Cross); d->Cross->setupOverlayCross(Mode); d->Cross->setVisible(false); @@ -253,7 +256,6 @@ DockWidgetArea CDockOverlay::dropAreaUnderCursor() const //============================================================================ DockWidgetArea CDockOverlay::showOverlay(QWidget* target) { - //std::cout << "CDockOverlay::showDockOverlay(QWidget* target)" << std::endl; if (d->TargetWidget == target) { qInfo() << "_target == target"; @@ -274,33 +276,15 @@ DockWidgetArea CDockOverlay::showOverlay(QWidget* target) // Move it over the target. resize(target->size()); - move(target->mapToGlobal(target->rect().topLeft())); + QPoint TopLeft = target->mapToGlobal(target->rect().topLeft()); + move(TopLeft); + std::cout << "Overlay top: " << TopLeft.x() << " left: " << TopLeft.y() + << std::endl; show(); return dropAreaUnderCursor(); } -//============================================================================ -void CDockOverlay::showOverlay(QWidget* target, const QRect& targetAreaRect) -{ - qInfo() << "CDockOverlay::showDockOverlay(QWidget* target, const QRect& targetAreaRect)"; - if (d->TargetWidget == target && d->TargetRect == targetAreaRect) - { - return; - } - //hideDockOverlay(); - d->TargetWidget = target; - d->TargetRect = targetAreaRect; - d->LastLocation = InvalidDockWidgetArea; - - // Move it over the target's area. - resize(targetAreaRect.size()); - move(target->mapToGlobal(QPoint(targetAreaRect.x(), targetAreaRect.y()))); - show(); - return; -} - - //============================================================================ void CDockOverlay::hideOverlay() { @@ -313,12 +297,25 @@ void CDockOverlay::hideOverlay() //============================================================================ -void CDockOverlay::paintEvent(QPaintEvent*) +void CDockOverlay::enableDropPreview(bool Enable) +{ + d->DropPreviewEnabled = Enable; + update(); +} + + +//============================================================================ +void CDockOverlay::paintEvent(QPaintEvent* event) { // Draw rect based on location + if (!d->DropPreviewEnabled) + { + return; + } + QRect r = rect(); const DockWidgetArea da = dropAreaUnderCursor(); - std::cout << "CursorLocation: " << dropAreaUnderCursor() << std::endl; + //std::cout << "CursorLocation: " << dropAreaUnderCursor() << std::endl; switch (da) { case TopDockWidgetArea: r.setHeight(r.height() / 2); break; @@ -330,9 +327,9 @@ void CDockOverlay::paintEvent(QPaintEvent*) } QPainter painter(this); QColor Color = palette().color(QPalette::Active, QPalette::Highlight); - painter.fillRect(r, QBrush(Color, Qt::Dense4Pattern)); - painter.setBrush(QBrush(Color)); - painter.drawRect(r); + Color.setAlpha(64); + painter.setPen(Qt::NoPen); + painter.fillRect(r, Color); } @@ -353,23 +350,6 @@ void CDockOverlay::hideEvent(QHideEvent*) } - -//============================================================================ -void CDockOverlay::resizeEvent(QResizeEvent* e) -{ - qInfo() << "CDockOverlay::resizeEvent" << e->size(); - d->Cross->resize(e->size()); -} - - -//============================================================================ -void CDockOverlay::moveEvent(QMoveEvent* e) -{ - qInfo() << "CDockOverlay::moveEvent" << e->pos(); - d->Cross->move(e->pos()); -} - - //============================================================================ static int areaAlignment(const DockWidgetArea area) { @@ -568,6 +548,8 @@ void CDockOverlayCross::reset() } } + + } // namespace ads //---------------------------------------------------------------------------- diff --git a/src/DockOverlay.h b/src/DockOverlay.h index 47c639a..250145f 100644 --- a/src/DockOverlay.h +++ b/src/DockOverlay.h @@ -84,22 +84,21 @@ public: */ DockWidgetArea showOverlay(QWidget* target); - /** - * Show drop overlay for the given target widget and the given rectangle - */ - void showOverlay(QWidget* target, const QRect& targetAreaRect); - /** * Hides the overlay */ void hideOverlay(); + /** + * Enables / disables the semi transparent overlay rectangle that represents + * the future area of the dropped widget + */ + void enableDropPreview(bool Enable); + protected: virtual void paintEvent(QPaintEvent *e) override; virtual void showEvent(QShowEvent* e) override; virtual void hideEvent(QHideEvent* e) override; - virtual void resizeEvent(QResizeEvent* e) override; - virtual void moveEvent(QMoveEvent* e) override; }; diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index f863252..2b2dae2 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -133,6 +133,7 @@ void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos) } DropContainer = TopContainer; + //std::cout << "TopContainer " << TopContainer << std::endl; auto ContainerOverlay = DockManager->containerOverlay(); auto DockAreaOverlay = DockManager->dockAreaOverlay(); @@ -146,13 +147,15 @@ void FloatingDockContainerPrivate::updateDropOverlays(const QPoint& GlobalPos) ContainerOverlay->setAllowedAreas(TopContainer->dockAreaCount() > 1 ? OuterDockAreas : AllDockAreas); ContainerOverlay->showOverlay(TopContainer); - ContainerOverlay->raise(); + //ContainerOverlay->raise(); auto DockArea = TopContainer->dockAreaAt(GlobalPos); - if (DockArea && TopContainer->dockAreaCount() > 1) + if (DockArea && TopContainer->dockAreaCount() > 0) { - DockAreaOverlay->setAllowedAreas(AllDockAreas); - DockAreaOverlay->showOverlay(DockArea); + DockAreaOverlay->setAllowedAreas((TopContainer->dockAreaCount() == 1) ? + NoDockWidgetArea : AllDockAreas); + DockWidgetArea Area = DockAreaOverlay->showOverlay(DockArea); + ContainerOverlay->enableDropPreview(InvalidDockWidgetArea == Area); } else {