diff --git a/core/include/DataSource/DataSourceController.h b/core/include/DataSource/DataSourceController.h index 7184dff..13e89a2 100644 --- a/core/include/DataSource/DataSourceController.h +++ b/core/include/DataSource/DataSourceController.h @@ -72,6 +72,8 @@ public slots: 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 299ebfa..6d42abf 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) @@ -157,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/DataSourceTreeWidgetItem.cpp b/gui/src/DataSource/DataSourceTreeWidgetItem.cpp index df831ad..67bbeb1 100644 --- a/gui/src/DataSource/DataSourceTreeWidgetItem.cpp +++ b/gui/src/DataSource/DataSourceTreeWidgetItem.cpp @@ -129,6 +129,15 @@ DataSourceTreeWidgetItem::DataSourceTreeWidgetItem(QTreeWidget *parent, const Da auto itemActions = impl->m_Data->actions(); std::transform(std::cbegin(itemActions), std::cend(itemActions), std::back_inserter(impl->m_Actions), createTreeAction); + + // Sets the flags of the items + auto flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled; + if (data->type() == DataSourceItemType::COMPONENT + || data->type() == DataSourceItemType::PRODUCT) { + flags |= Qt::ItemIsDragEnabled; + } + + setFlags(flags); } const DataSourceItem *DataSourceTreeWidgetItem::data() const diff --git a/gui/src/SqpApplication.cpp b/gui/src/SqpApplication.cpp index 09ee43b..7b200c1 100644 --- a/gui/src/SqpApplication.cpp +++ b/gui/src/SqpApplication.cpp @@ -8,6 +8,7 @@ #include