From 7d2f05cda6a0e3372c75cf3093a5b4e4a0df30f5 2017-10-31 09:17:08 From: Thibaud Rabillard Date: 2017-10-31 09:17:08 Subject: [PATCH] drop of product on the variables --- diff --git a/core/include/DataSource/DataSourceController.h b/core/include/DataSource/DataSourceController.h index 568f5a9..13e89a2 100644 --- a/core/include/DataSource/DataSourceController.h +++ b/core/include/DataSource/DataSourceController.h @@ -64,11 +64,16 @@ public: */ void loadProductItem(const QUuid &dataSourceUid, const DataSourceItem &productItem) noexcept; + QByteArray mimeDataForProductsData(const QVariantList &productsData) const; + QVariantList productsDataForMimeData(const QByteArray &mimeData) const; + public slots: /// Manage init/end of the controller void initialize(); void finalize(); + void requestVariable(const QVariantHash &productData); + signals: /// Signal emitted when a structure has been set for a data source void dataSourceItemSet(DataSourceItem *dataSourceItem); diff --git a/core/include/DataSource/DataSourceItem.h b/core/include/DataSource/DataSourceItem.h index cecbf82..3b03955 100644 --- a/core/include/DataSource/DataSourceItem.h +++ b/core/include/DataSource/DataSourceItem.h @@ -91,6 +91,14 @@ public: DataSourceItemType type() const noexcept; + /** + * @brief Searches the first child matching the specified data. + * @param data The data to search. + * @param recursive So the search recursively. + * @return the item matching the data or nullptr if it was not found. + */ + DataSourceItem *findItem(const QVariantHash &data, bool recursive); + bool operator==(const DataSourceItem &other); bool operator!=(const DataSourceItem &other); diff --git a/core/include/Variable/VariableModel.h b/core/include/Variable/VariableModel.h index 95da42c..f3928f8 100644 --- a/core/include/Variable/VariableModel.h +++ b/core/include/Variable/VariableModel.h @@ -93,6 +93,7 @@ public: signals: void abortProgessRequested(std::shared_ptr variable); + void requestVariable(const QVariantHash &productData); private: class VariableModelPrivate; diff --git a/core/src/DataSource/DataSourceController.cpp b/core/src/DataSource/DataSourceController.cpp index 22441fe..1228d87 100644 --- a/core/src/DataSource/DataSourceController.cpp +++ b/core/src/DataSource/DataSourceController.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -44,6 +45,20 @@ public: /// @remarks Data providers are stored as shared_ptr as they can be sent to a variable and /// continue to live without necessarily the data source controller std::map > m_DataProviders; + + // Search for the first datasource item matching the specified data + DataSourceItem *findDataSourceItem(const QVariantHash &data) + { + DataSourceItem *sourceItem = nullptr; + for (const auto &item : m_DataSourceItems) { + sourceItem = item.second->findItem(data, true); + if (sourceItem) { + break; + } + } + + return sourceItem; + } }; DataSourceController::DataSourceController(QObject *parent) @@ -124,6 +139,26 @@ void DataSourceController::loadProductItem(const QUuid &dataSourceUid, } } +QByteArray DataSourceController::mimeDataForProductsData(const QVariantList &productsData) const +{ + QByteArray encodedData; + QDataStream stream(&encodedData, QIODevice::WriteOnly); + + stream << productsData; + + return encodedData; +} + +QVariantList DataSourceController::productsDataForMimeData(const QByteArray &mimeData) const +{ + QDataStream stream(mimeData); + + QVariantList productList; + stream >> productList; + + return productList; +} + void DataSourceController::initialize() { qCDebug(LOG_DataSourceController()) @@ -137,6 +172,20 @@ void DataSourceController::finalize() impl->m_WorkingMutex.unlock(); } +void DataSourceController::requestVariable(const QVariantHash &productData) +{ + DataSourceItem *sourceItem = impl->findDataSourceItem(productData); + + if (sourceItem) { + auto sourceName = sourceItem->rootItem().name(); + auto sourceId = impl->m_DataSources.key(sourceName); + loadProductItem(sourceId, *sourceItem); + } + else { + qCWarning(LOG_DataSourceController()) << tr("requestVariable, product data not found"); + } +} + void DataSourceController::waitForFinish() { QMutexLocker locker{&impl->m_WorkingMutex}; diff --git a/core/src/DataSource/DataSourceItem.cpp b/core/src/DataSource/DataSourceItem.cpp index cf316d8..a1fe8e7 100644 --- a/core/src/DataSource/DataSourceItem.cpp +++ b/core/src/DataSource/DataSourceItem.cpp @@ -123,6 +123,24 @@ DataSourceItemType DataSourceItem::type() const noexcept return impl->m_Type; } +DataSourceItem *DataSourceItem::findItem(const QVariantHash &data, bool recursive) +{ + for (const auto &child : impl->m_Children) { + if (child->impl->m_Data == data) { + return child.get(); + } + + if (recursive) { + auto foundItem = child->findItem(data, true); + if (foundItem) { + return foundItem; + } + } + } + + return nullptr; +} + bool DataSourceItem::operator==(const DataSourceItem &other) { // Compares items' attributes diff --git a/core/src/Variable/VariableModel.cpp b/core/src/Variable/VariableModel.cpp index ccc9933..9ef8378 100644 --- a/core/src/Variable/VariableModel.cpp +++ b/core/src/Variable/VariableModel.cpp @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -267,7 +268,7 @@ Qt::ItemFlags VariableModel::flags(const QModelIndex &index) const Qt::DropActions VariableModel::supportedDropActions() const { - return Qt::MoveAction; + return Qt::CopyAction | Qt::MoveAction; } Qt::DropActions VariableModel::supportedDragActions() const @@ -304,13 +305,29 @@ QMimeData *VariableModel::mimeData(const QModelIndexList &indexes) const bool VariableModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const { - return false; + // drop of a product + return data->hasFormat(MIME_TYPE_PRODUCT_LIST); } bool VariableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { - return false; + bool dropDone = false; + + if (data->hasFormat(MIME_TYPE_PRODUCT_LIST)) { + QDataStream stream(data->data(MIME_TYPE_PRODUCT_LIST)); + + QVariantList productList; + stream >> productList; + + for (auto metaData : productList) { + emit requestVariable(metaData.toHash()); + } + + dropDone = true; + } + + return dropDone; } void VariableModel::abortProgress(const QModelIndex &index) diff --git a/gui/src/DataSource/DataSourceTreeWidget.cpp b/gui/src/DataSource/DataSourceTreeWidget.cpp index db7d6f5..2e39d7e 100644 --- a/gui/src/DataSource/DataSourceTreeWidget.cpp +++ b/gui/src/DataSource/DataSourceTreeWidget.cpp @@ -1,8 +1,11 @@ #include "DataSource/DataSourceTreeWidget.h" #include "Common/MimeTypesDef.h" +#include "DataSource/DataSourceController.h" #include "DataSource/DataSourceItem.h" #include "DataSource/DataSourceTreeWidgetItem.h" +#include "SqpApplication.h" + #include DataSourceTreeWidget::DataSourceTreeWidget(QWidget *parent) : QTreeWidget(parent) {} @@ -27,11 +30,7 @@ QMimeData *DataSourceTreeWidget::mimeData(const QList items) } } - QByteArray encodedData; - QDataStream stream(&encodedData, QIODevice::WriteOnly); - - stream << productData; - + auto encodedData = sqpApp->dataSourceController().mimeDataForProductsData(productData); mimeData->setData(MIME_TYPE_PRODUCT_LIST, encodedData); return mimeData; diff --git a/gui/src/SqpApplication.cpp b/gui/src/SqpApplication.cpp index 7eaec69..1d4f3a6 100644 --- a/gui/src/SqpApplication.cpp +++ b/gui/src/SqpApplication.cpp @@ -8,6 +8,7 @@ #include