diff --git a/core/include/DataSource/DataSourceController.h b/core/include/DataSource/DataSourceController.h index 3a495e9..3aeaafc 100644 --- a/core/include/DataSource/DataSourceController.h +++ b/core/include/DataSource/DataSourceController.h @@ -56,9 +56,11 @@ public: /** * Loads an item (product) as a variable in SciQlop + * @param dataSourceUid the unique id of the data source containing the item. It is used to get + * the data provider associated to the data source, and pass it to for the variable creation * @param productItem the item to load */ - void loadProductItem(const DataSourceItem &productItem) noexcept; + void loadProductItem(const QUuid &dataSourceUid, const DataSourceItem &productItem) noexcept; public slots: /// Manage init/end of the controller diff --git a/core/src/DataSource/DataSourceController.cpp b/core/src/DataSource/DataSourceController.cpp index fc0bd48..21daf89 100644 --- a/core/src/DataSource/DataSourceController.cpp +++ b/core/src/DataSource/DataSourceController.cpp @@ -19,7 +19,9 @@ public: /// Data sources structures std::map > m_DataSourceItems; /// Data providers registered - std::map > m_DataProviders; + /// @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; }; DataSourceController::DataSourceController(QObject *parent) @@ -48,6 +50,7 @@ void DataSourceController::setDataSourceItem( const QUuid &dataSourceUid, std::unique_ptr dataSourceItem) noexcept { if (impl->m_DataSources.contains(dataSourceUid)) { + // The data provider is implicitly converted to a shared_ptr impl->m_DataSourceItems.insert(std::make_pair(dataSourceUid, std::move(dataSourceItem))); // Retrieves the data source item to emit the signal with it @@ -76,7 +79,8 @@ void DataSourceController::setDataProvider(const QUuid &dataSourceUid, } } -void DataSourceController::loadProductItem(const DataSourceItem &productItem) noexcept +void DataSourceController::loadProductItem(const QUuid &dataSourceUid, + const DataSourceItem &productItem) noexcept { /// @todo ALX } diff --git a/plugins/mockplugin/src/MockPlugin.cpp b/plugins/mockplugin/src/MockPlugin.cpp index 79d95d2..adc3bf6 100644 --- a/plugins/mockplugin/src/MockPlugin.cpp +++ b/plugins/mockplugin/src/MockPlugin.cpp @@ -20,16 +20,18 @@ std::unique_ptr createDataProvider() noexcept return std::make_unique(); } -std::unique_ptr createProductItem(const QString &productName) +std::unique_ptr createProductItem(const QString &productName, + const QUuid &dataSourceUid) { auto result = std::make_unique(DataSourceItemType::PRODUCT, QVector{productName}); // Add action to load product from DataSourceController result->addAction(std::make_unique( - QObject::tr("Load %1 product").arg(productName), [productName](DataSourceItem &item) { + QObject::tr("Load %1 product").arg(productName), + [productName, dataSourceUid](DataSourceItem &item) { if (auto app = sqpApp) { - app->dataSourceController().loadProductItem(item); + app->dataSourceController().loadProductItem(dataSourceUid, item); } })); @@ -37,13 +39,13 @@ std::unique_ptr createProductItem(const QString &productName) } /// Creates the data source item relative to the plugin -std::unique_ptr createDataSourceItem() noexcept +std::unique_ptr createDataSourceItem(const QUuid &dataSourceUid) noexcept { // Magnetic field products auto magneticFieldFolder = std::make_unique( DataSourceItemType::NODE, QVector{QStringLiteral("Magnetic field")}); - magneticFieldFolder->appendChild(createProductItem(QStringLiteral("FGM"))); - magneticFieldFolder->appendChild(createProductItem(QStringLiteral("SC"))); + magneticFieldFolder->appendChild(createProductItem(QStringLiteral("FGM"), dataSourceUid)); + magneticFieldFolder->appendChild(createProductItem(QStringLiteral("SC"), dataSourceUid)); // Electric field products auto electricFieldFolder = std::make_unique( @@ -68,7 +70,7 @@ void MockPlugin::initialize() auto dataSourceUid = dataSourceController.registerDataSource(DATA_SOURCE_NAME); // Sets data source tree - dataSourceController.setDataSourceItem(dataSourceUid, createDataSourceItem()); + dataSourceController.setDataSourceItem(dataSourceUid, createDataSourceItem(dataSourceUid)); // Sets data provider dataSourceController.setDataProvider(dataSourceUid, createDataProvider());