diff --git a/gui/include/DragDropHelper.h b/gui/include/DragDropHelper.h index 17103c4..30c3b5b 100644 --- a/gui/include/DragDropHelper.h +++ b/gui/include/DragDropHelper.h @@ -54,6 +54,7 @@ public: QUrl imageTemporaryUrl(const QImage &image) const; void setHightlightedDragWidget(VisualizationDragWidget *dragWidget); + VisualizationDragWidget *getHightlightedDragWidget() const; private: class DragDropHelperPrivate; diff --git a/gui/include/Visualization/VisualizationDragDropContainer.h b/gui/include/Visualization/VisualizationDragDropContainer.h index 6abfbc3..1b60794 100644 --- a/gui/include/Visualization/VisualizationDragDropContainer.h +++ b/gui/include/Visualization/VisualizationDragDropContainer.h @@ -17,7 +17,8 @@ class VisualizationDragDropContainer : public QWidget { Q_OBJECT signals: - void dropOccured(int dropIndex, const QMimeData *mimeData); + void dropOccuredInContainer(int dropIndex, const QMimeData *mimeData); + void dropOccuredOnWidget(VisualizationDragWidget *dragWidget, const QMimeData *mimeData); public: using AcceptMimeDataFunction = std::function; diff --git a/gui/include/Visualization/VisualizationZoneWidget.h b/gui/include/Visualization/VisualizationZoneWidget.h index 3700489..f364645 100644 --- a/gui/include/Visualization/VisualizationZoneWidget.h +++ b/gui/include/Visualization/VisualizationZoneWidget.h @@ -85,6 +85,7 @@ private slots: void onVariableAboutToBeRemoved(std::shared_ptr variable); void dropMimeData(int index, const QMimeData *mimeData); + void dropMimeDataOnGraph(VisualizationDragWidget *dragWidget, const QMimeData *mimeData); }; #endif // SCIQLOP_VISUALIZATIONZONEWIDGET_H diff --git a/gui/src/DragDropHelper.cpp b/gui/src/DragDropHelper.cpp index 7f96d19..8806547 100644 --- a/gui/src/DragDropHelper.cpp +++ b/gui/src/DragDropHelper.cpp @@ -281,6 +281,11 @@ void DragDropHelper::setHightlightedDragWidget(VisualizationDragWidget *dragWidg impl->m_HighlightedDragWidget = dragWidget; } +VisualizationDragWidget *DragDropHelper::getHightlightedDragWidget() const +{ + return impl->m_HighlightedDragWidget; +} + bool DragDropHelper::checkMimeDataForVisualization(const QMimeData *mimeData, VisualizationDragDropContainer *dropContainer) { diff --git a/gui/src/Visualization/VisualizationDragDropContainer.cpp b/gui/src/Visualization/VisualizationDragDropContainer.cpp index f31b5e8..25e8deb 100644 --- a/gui/src/Visualization/VisualizationDragDropContainer.cpp +++ b/gui/src/Visualization/VisualizationDragDropContainer.cpp @@ -264,10 +264,12 @@ void VisualizationDragDropContainer::dragMoveEvent(QDragMoveEvent *event) void VisualizationDragDropContainer::dropEvent(QDropEvent *event) { + auto &helper = sqpApp->dragDropHelper(); + if (impl->acceptMimeData(event->mimeData())) { - auto dragWidget = sqpApp->dragDropHelper().getCurrentDragWidget(); + auto dragWidget = helper.getCurrentDragWidget(); if (impl->hasPlaceHolder()) { - auto &helper = sqpApp->dragDropHelper(); + // drop where the placeHolder is located auto droppedIndex = impl->m_Layout->indexOf(&helper.placeHolder()); @@ -287,13 +289,22 @@ void VisualizationDragDropContainer::dropEvent(QDropEvent *event) helper.removePlaceHolder(); - emit dropOccured(droppedIndex, event->mimeData()); + emit dropOccuredInContainer(droppedIndex, event->mimeData()); } - else { - qCWarning(LOG_VisualizationDragDropContainer()) - << tr("VisualizationDragDropContainer::dropEvent, couldn't drop because the " - "placeHolder is not found."); - // Q_ASSERT(false); + else if (helper.getHightlightedDragWidget()) { + // drop on the highlighted widget + + auto canMerge = impl->allowMergeMimeData(event->mimeData()); + if (canMerge) { + event->acceptProposedAction(); + emit dropOccuredOnWidget(helper.getHightlightedDragWidget(), event->mimeData()); + } + else { + qCWarning(LOG_VisualizationDragDropContainer()) + << tr("VisualizationDragDropContainer::dropEvent, dropping on a widget, but " + "the merge is forbidden."); + Q_ASSERT(false); + } } } else { diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index 2bdce7f..2856324 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -70,7 +70,7 @@ VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *par ui->dragDropContainer->setAcceptedMimeTypes( {MIME_TYPE_GRAPH, MIME_TYPE_ZONE, MIME_TYPE_VARIABLE_LIST}); - connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccured, this, + connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredInContainer, this, &VisualizationTabWidget::dropMimeData); ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) { return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData, diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index 2f1642e..9dff6bb 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -91,8 +91,11 @@ VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *p return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData, ui->dragDropContainer); }); - connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccured, this, + + connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredInContainer, this, &VisualizationZoneWidget::dropMimeData); + connect(ui->dragDropContainer, &VisualizationDragDropContainer::dropOccuredOnWidget, this, + &VisualizationZoneWidget::dropMimeDataOnGraph); // 'Close' options : widget is deleted when closed setAttribute(Qt::WA_DeleteOnClose); @@ -381,6 +384,31 @@ void VisualizationZoneWidget::dropMimeData(int index, const QMimeData *mimeData) } } +void VisualizationZoneWidget::dropMimeDataOnGraph(VisualizationDragWidget *dragWidget, + const QMimeData *mimeData) +{ + auto graphWidget = qobject_cast(dragWidget); + if (!graphWidget) { + qCWarning(LOG_VisualizationZoneWidget()) + << tr("VisualizationZoneWidget::dropMimeDataOnGraph, dropping in an unknown widget, " + "drop aborted"); + Q_ASSERT(false); + return; + } + + if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) { + auto variables = sqpApp->variableController().variablesForMimeData( + mimeData->data(MIME_TYPE_VARIABLE_LIST)); + for (const auto &var : variables) { + graphWidget->addVariable(var, graphWidget->graphRange()); + } + } + else { + qCWarning(LOG_VisualizationZoneWidget()) + << tr("VisualizationZoneWidget::dropMimeDataOnGraph, unknown MIME data received."); + } +} + void VisualizationZoneWidget::VisualizationZoneWidgetPrivate::dropGraph( int index, VisualizationZoneWidget *zoneWidget) {