diff --git a/core/include/DataSource/DataSourceController.h b/core/include/DataSource/DataSourceController.h index 4393814..ef886ab 100644 --- a/core/include/DataSource/DataSourceController.h +++ b/core/include/DataSource/DataSourceController.h @@ -9,6 +9,8 @@ Q_DECLARE_LOGGING_CATEGORY(LOG_DataSourceController) +class DataSourceItem; + /** * @brief The DataSourceController class aims to make the link between SciQlop and its plugins. This * is the intermediate class that SciQlop has to use in the way to connect a data source. Please @@ -30,11 +32,25 @@ public: */ QUuid registerDataSource(const QString &dataSourceName) noexcept; + /** + * Sets the structure of a data source. The controller takes ownership of the structure. + * @param dataSourceUid the unique id with which the data source has been registered into the + * controller. If it is invalid, the method has no effect. + * @param dataSourceItem the structure of the data source + * @sa registerDataSource() + */ + void setDataSourceItem(const QUuid &dataSourceUid, + std::unique_ptr dataSourceItem) noexcept; + public slots: /// Manage init/end of the controller void initialize(); void finalize(); +signals: + /// Signal emitted when a structure has been set for a data source + void dataSourceItemSet(const DataSourceItem &dataSourceItem); + private: void waitForFinish(); diff --git a/core/src/DataSource/DataSourceController.cpp b/core/src/DataSource/DataSourceController.cpp index b4af453..0149694 100644 --- a/core/src/DataSource/DataSourceController.cpp +++ b/core/src/DataSource/DataSourceController.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -11,7 +12,10 @@ Q_LOGGING_CATEGORY(LOG_DataSourceController, "DataSourceController") class DataSourceController::DataSourceControllerPrivate { public: QMutex m_WorkingMutex; + /// Data sources registered QHash m_DataSources; + /// Data sources structures + std::map > m_DataSourceItems; }; DataSourceController::DataSourceController(QObject *parent) @@ -36,6 +40,25 @@ QUuid DataSourceController::registerDataSource(const QString &dataSourceName) no return dataSourceUid; } +void DataSourceController::setDataSourceItem( + const QUuid &dataSourceUid, std::unique_ptr dataSourceItem) noexcept +{ + if (impl->m_DataSources.contains(dataSourceUid)) { + impl->m_DataSourceItems.insert(std::make_pair(dataSourceUid, std::move(dataSourceItem))); + + // Retrieves the data source item to emit the signal with it + auto it = impl->m_DataSourceItems.find(dataSourceUid); + if (it != impl->m_DataSourceItems.end()) { + emit dataSourceItemSet(*it->second); + } + } + else { + qCWarning(LOG_DataSourceController()) << tr("Can't set data source item for uid %1 : no " + "data source has been registered with the uid") + .arg(dataSourceUid.toString()); + } +} + void DataSourceController::initialize() { qCDebug(LOG_DataSourceController())