diff --git a/gui/include/Visualization/VisualizationDragDropContainer.h b/gui/include/Visualization/VisualizationDragDropContainer.h index 68a4aff..25150ae 100644 --- a/gui/include/Visualization/VisualizationDragDropContainer.h +++ b/gui/include/Visualization/VisualizationDragDropContainer.h @@ -25,6 +25,8 @@ signals: public: enum class DropBehavior { Inserted, Merged, InsertedAndMerged, Forbidden }; using AcceptMimeDataFunction = std::function; + using AcceptDragWidgetFunction + = std::function; VisualizationDragDropContainer(QWidget *parent = nullptr); @@ -37,6 +39,8 @@ public: void setAcceptMimeDataFunction(AcceptMimeDataFunction fun); + void setAcceptDragWidgetFunction(AcceptDragWidgetFunction fun); + void setPlaceHolderType(DragDropHelper::PlaceHolderType type, const QString &placeHolderText = QString()); diff --git a/gui/src/Visualization/VisualizationDragDropContainer.cpp b/gui/src/Visualization/VisualizationDragDropContainer.cpp index caa8ef6..7fc18f1 100644 --- a/gui/src/Visualization/VisualizationDragDropContainer.cpp +++ b/gui/src/Visualization/VisualizationDragDropContainer.cpp @@ -25,6 +25,8 @@ struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { VisualizationDragDropContainer::AcceptMimeDataFunction m_AcceptMimeDataFun = [](auto mimeData) { return true; }; + VisualizationDragDropContainer::AcceptDragWidgetFunction m_AcceptDragWidgetFun + = [](auto dragWidget, auto mimeData) { return true; }; int m_MinContainerHeight = 0; @@ -143,8 +145,8 @@ struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { return nbGraph; } - void findPlaceHolderPosition(const QPoint &pos, bool canInsert, bool canMerge, - const VisualizationDragDropContainer *container); + bool findPlaceHolderPosition(const QPoint &pos, const QMimeData *mimeData, bool canInsert, + bool canMerge, const VisualizationDragDropContainer *container); }; VisualizationDragDropContainer::VisualizationDragDropContainer(QWidget *parent) @@ -188,6 +190,12 @@ void VisualizationDragDropContainer::setAcceptMimeDataFunction( impl->m_AcceptMimeDataFun = fun; } +void VisualizationDragDropContainer::setAcceptDragWidgetFunction( + VisualizationDragDropContainer::AcceptDragWidgetFunction fun) +{ + impl->m_AcceptDragWidgetFun = fun; +} + void VisualizationDragDropContainer::setPlaceHolderType(DragDropHelper::PlaceHolderType type, const QString &placeHolderText) { @@ -263,7 +271,10 @@ void VisualizationDragDropContainer::dragEnterEvent(QDragEnterEvent *event) auto canMerge = impl->allowMergeForMimeData(event->mimeData()); auto canInsert = impl->allowInsertForMimeData(event->mimeData()); - impl->findPlaceHolderPosition(event->pos(), canInsert, canMerge, this); + if (!impl->findPlaceHolderPosition(event->pos(), event->mimeData(), canInsert, canMerge, + this)) { + event->ignore(); + } } else { // do nothing @@ -313,7 +324,7 @@ void VisualizationDragDropContainer::dragMoveEvent(QDragMoveEvent *event) if (impl->acceptMimeData(event->mimeData())) { auto canMerge = impl->allowMergeForMimeData(event->mimeData()); auto canInsert = impl->allowInsertForMimeData(event->mimeData()); - impl->findPlaceHolderPosition(event->pos(), canInsert, canMerge, this); + impl->findPlaceHolderPosition(event->pos(), event->mimeData(), canInsert, canMerge, this); } else { event->ignore(); @@ -387,8 +398,8 @@ void VisualizationDragDropContainer::dropEvent(QDropEvent *event) } -void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::findPlaceHolderPosition( - const QPoint &pos, bool canInsert, bool canMerge, +bool VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::findPlaceHolderPosition( + const QPoint &pos, const QMimeData *mimeData, bool canInsert, bool canMerge, const VisualizationDragDropContainer *container) { auto &helper = sqpApp->dragDropHelper(); @@ -451,7 +462,13 @@ void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::find helper.removePlaceHolder(); } - helper.setHightlightedDragWidget(dragWidgetHovered); + if (m_AcceptDragWidgetFun(dragWidgetHovered, mimeData)) { + helper.setHightlightedDragWidget(dragWidgetHovered); + return true; + } + else { + return false; + } } else { qCWarning(LOG_VisualizationDragDropContainer()) @@ -470,4 +487,6 @@ void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::find // the mouse is hover the placeHolder // Do nothing } + + return true; } diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index ed90b7c..e5cfd59 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -115,6 +115,29 @@ VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *p ui->dragDropContainer); }); + auto acceptDragWidgetFun = [](auto dragWidget, auto mimeData) { + if (!mimeData) { + return false; + } + + if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) { + auto variables = sqpApp->variableController().variablesForMimeData( + mimeData->data(MIME_TYPE_VARIABLE_LIST)); + + if (variables.count() != 1) { + return false; + } + auto variable = variables.first(); + + if (auto graphWidget = dynamic_cast(dragWidget)) { + return graphWidget->canDrop(*variable); + } + } + + return true; + }; + ui->dragDropContainer->setAcceptDragWidgetFunction(acceptDragWidgetFun); + connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredInContainer, this, &VisualizationZoneWidget::dropMimeData); connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredOnWidget, this,