diff --git a/core/include/DataSource/DataSourceController.h b/core/include/DataSource/DataSourceController.h index 9e9fcdb..4e41b7e 100644 --- a/core/include/DataSource/DataSourceController.h +++ b/core/include/DataSource/DataSourceController.h @@ -76,7 +76,7 @@ public slots: void finalize(); /// Request the creation of a variable from the ID_DATA_KEY of a product - void requestVariable(const QString &datasourceIdKey); + void requestVariableFromProductIdKey(const QString &datasourceIdKey); /// Request the creation of a variable from metadata of a product void requestVariable(const QVariantHash &productData); diff --git a/core/src/DataSource/DataSourceController.cpp b/core/src/DataSource/DataSourceController.cpp index 6532709..b59016a 100644 --- a/core/src/DataSource/DataSourceController.cpp +++ b/core/src/DataSource/DataSourceController.cpp @@ -163,7 +163,7 @@ void DataSourceController::finalize() impl->m_WorkingMutex.unlock(); } -void DataSourceController::requestVariable(const QString &datasourceIdKey) +void DataSourceController::requestVariableFromProductIdKey(const QString &datasourceIdKey) { auto sourceItem = impl->findDataSourceItem(datasourceIdKey); diff --git a/gui/src/DragAndDrop/DragDropGuiController.cpp b/gui/src/DragAndDrop/DragDropGuiController.cpp index 1546c22..22f058b 100644 --- a/gui/src/DragAndDrop/DragDropGuiController.cpp +++ b/gui/src/DragAndDrop/DragDropGuiController.cpp @@ -7,6 +7,7 @@ #include "Visualization/VisualizationWidget.h" #include "Visualization/operations/FindVariableOperation.h" +#include "DataSource/DataSourceController.h" #include "Variable/Variable.h" #include "Variable/VariableController.h" @@ -286,11 +287,22 @@ bool DragDropGuiController::checkMimeDataForVisualization( // result = false: cannot drop multiple variables in the visualisation } } + else if (mimeData->hasFormat(MIME_TYPE_PRODUCT_LIST)) { + auto productDataList = sqpApp->dataSourceController().productsDataForMimeData( + mimeData->data(MIME_TYPE_PRODUCT_LIST)); + if (productDataList.count() == 1) { + result = true; + } + else { + // result = false: cannot drop multiple products in the visualisation + } + } else { // Other MIME data // no special rules, accepted by default result = true; } + return result; } diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index 957de0e..e983b6a 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -7,6 +7,7 @@ #include "Visualization/MacScrollBarStyle.h" +#include "DataSource/DataSourceController.h" #include "Variable/VariableController.h" #include "Common/MimeTypesDef.h" @@ -69,6 +70,8 @@ struct VisualizationTabWidget::VisualizationTabWidgetPrivate { void dropZone(int index, VisualizationTabWidget *tabWidget); void dropVariables(const QList > &variables, int index, VisualizationTabWidget *tabWidget); + void dropProducts(const QVariantList &productsMetaData, int index, + VisualizationTabWidget *tabWidget); }; VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *parent) @@ -91,6 +94,8 @@ VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *par VisualizationDragDropContainer::DropBehavior::Inserted); ui->dragDropContainer->setMimeType(MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->setMimeType(MIME_TYPE_PRODUCT_LIST, + VisualizationDragDropContainer::DropBehavior::Inserted); ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) { return sqpApp->dragDropGuiController().checkMimeDataForVisualization(mimeData, @@ -229,6 +234,11 @@ void VisualizationTabWidget::dropMimeData(int index, const QMimeData *mimeData) mimeData->data(MIME_TYPE_VARIABLE_LIST)); impl->dropVariables(variables, index, this); } + else if (mimeData->hasFormat(MIME_TYPE_PRODUCT_LIST)) { + auto productsData = sqpApp->dataSourceController().productsDataForMimeData( + mimeData->data(MIME_TYPE_PRODUCT_LIST)); + impl->dropProducts(productsData, index, this); + } else { qCWarning(LOG_VisualizationZoneWidget()) << tr("VisualizationTabWidget::dropMimeData, unknown MIME data received."); @@ -352,3 +362,23 @@ void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropVariables( tabWidget->createZone(variables, index); } + +void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropProducts( + const QVariantList &productsMetaData, int index, VisualizationTabWidget *tabWidget) +{ + // Note: the AcceptMimeDataFunction (set on the drop container) ensure there is a single and + // compatible variable here + if (productsMetaData.count() != 1) { + qCWarning(LOG_VisualizationZoneWidget()) + << tr("VisualizationTabWidget::dropProducts, dropping multiple products, operation " + "aborted."); + return; + } + + auto productData = productsMetaData.first().toHash(); + QMetaObject::invokeMethod(&sqpApp->dataSourceController(), "requestVariable", + Qt::QueuedConnection, Q_ARG(QVariantHash, productData)); + + + // TODO: add graph +} diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index eb1222c..830fb06 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -10,6 +10,7 @@ #include "Common/VisualizationDef.h" #include +#include #include