diff --git a/core b/core index de55e7b..c08d1b8 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit de55e7be90966d1efbd34a10df9a3231c50e245b +Subproject commit c08d1b8ad2976824def52cf0fca26a72b1069356 diff --git a/gui/src/DragAndDrop/DragDropGuiController.cpp b/gui/src/DragAndDrop/DragDropGuiController.cpp index 87ed9f0..1067065 100644 --- a/gui/src/DragAndDrop/DragDropGuiController.cpp +++ b/gui/src/DragAndDrop/DragDropGuiController.cpp @@ -245,7 +245,7 @@ bool DragDropGuiController::checkMimeDataForVisualization( if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) { auto variables = sqpApp->variableController().variables( - mimeData->data(MIME_TYPE_VARIABLE_LIST)); + Variable::variablesIDs(mimeData->data(MIME_TYPE_VARIABLE_LIST))); if (variables.size() == 1) { diff --git a/gui/src/SqpApplication.cpp b/gui/src/SqpApplication.cpp index 9332642..856a6dd 100644 --- a/gui/src/SqpApplication.cpp +++ b/gui/src/SqpApplication.cpp @@ -19,7 +19,6 @@ class SqpApplication::SqpApplicationPrivate { public: SqpApplicationPrivate() : m_VariableController{std::make_shared()}, - m_VariableModel{m_VariableController}, m_PlotInterractionMode(SqpApplication::PlotsInteractionMode::None), m_PlotCursorMode(SqpApplication::PlotsCursorMode::NoCursor) { @@ -29,11 +28,12 @@ public: // VariableController <-> DataSourceController connect(&m_DataSourceController, - SIGNAL(variableCreationRequested(const QString &, const QVariantHash &, - std::shared_ptr)), - m_VariableController.get(), - SLOT(createVariable(const QString &, const QVariantHash &, - std::shared_ptr))); + &DataSourceController::createVariable,[](const QString &variableName, + const QVariantHash &variableMetadata, + std::shared_ptr variableProvider) + { + sqpApp->variableController().createVariable(variableName,variableMetadata,variableProvider,sqpApp->timeController().dateTime()); + }); // connect(m_VariableController->variableModel(), &VariableModel::requestVariable, // m_DataSourceController.get(), &DataSourceController::requestVariable); @@ -79,7 +79,6 @@ public: NetworkController m_NetworkController; VisualizationController m_VisualizationController; CatalogueController m_CatalogueController; - VariableModel2 m_VariableModel; QThread m_DataSourceControllerThread; QThread m_NetworkControllerThread; diff --git a/gui/src/Variable/VariableInspectorWidget.cpp b/gui/src/Variable/VariableInspectorWidget.cpp index e74eea1..7188f4c 100644 --- a/gui/src/Variable/VariableInspectorWidget.cpp +++ b/gui/src/Variable/VariableInspectorWidget.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -125,13 +126,22 @@ VariableInspectorWidget::VariableInspectorWidget(QWidget *parent) // auto sortFilterModel = new QSortFilterProxyModel{this}; // sortFilterModel->setSourceModel(sqpApp->variableController().variableModel()); - m_model = new VariableModel2(sqpApp->variableControllerOwner()); + m_model = new VariableModel2(); ui->tableView->setModel(m_model); + connect(m_model, &VariableModel2::createVariable, + [](const QVariantHash &productData) + { + sqpApp->dataSourceController().requestVariable(productData); + }); + auto vc = &(sqpApp->variableController()); + connect(vc, &VariableController2::variableAdded, m_model, &VariableModel2::variableAdded); + connect(vc, &VariableController2::variableDeleted, m_model, &VariableModel2::variableDeleted); + connect(m_model, &VariableModel2::asyncChangeRange, vc, &VariableController2::asyncChangeRange); // Adds extra signal/slot between view and model, so the view can be updated instantly when // there is a change of data in the model - connect(m_model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, - SLOT(refresh())); + //connect(m_model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, + // SLOT(refresh())); //ui->tableView->setSelectionModel(sqpApp->variableController().variableSelectionModel()); ui->tableView->setItemDelegateForColumn(0, m_ProgressBarItemDelegate); diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index d2d8b9f..ce0ee79 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -231,7 +231,7 @@ void VisualizationTabWidget::dropMimeData(int index, const QMimeData *mimeData) } else if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) { auto variables = sqpApp->variableController().variables( - mimeData->data(MIME_TYPE_VARIABLE_LIST)); + Variable::variablesIDs(mimeData->data(MIME_TYPE_VARIABLE_LIST))); impl->dropVariables(variables, index, this); } else if (mimeData->hasFormat(MIME_TYPE_PRODUCT_LIST)) { diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index a1de13b..9cbe26f 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -119,7 +119,7 @@ VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *p if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) { auto variables = sqpApp->variableController().variables( - mimeData->data(MIME_TYPE_VARIABLE_LIST)); + Variable::variablesIDs(mimeData->data(MIME_TYPE_VARIABLE_LIST))); if (variables.size() != 1) { return false; @@ -460,7 +460,7 @@ void VisualizationZoneWidget::dropMimeData(int index, const QMimeData *mimeData) } else if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) { auto variables = sqpApp->variableController().variables( - mimeData->data(MIME_TYPE_VARIABLE_LIST)); + Variable::variablesIDs(mimeData->data(MIME_TYPE_VARIABLE_LIST))); impl->dropVariables(variables, index, this); } else if (mimeData->hasFormat(MIME_TYPE_PRODUCT_LIST)) { @@ -488,7 +488,7 @@ void VisualizationZoneWidget::dropMimeDataOnGraph(VisualizationDragWidget *dragW if (mimeData->hasFormat(MIME_TYPE_VARIABLE_LIST)) { auto variables = sqpApp->variableController().variables( - mimeData->data(MIME_TYPE_VARIABLE_LIST)); + Variable::variablesIDs(mimeData->data(MIME_TYPE_VARIABLE_LIST))); for (const auto &var : variables) { graphWidget->addVariable(var, graphWidget->graphRange()); } diff --git a/plugins/mockplugin/include/CosinusProvider.h b/plugins/mockplugin/include/CosinusProvider.h index eb670ff..1d02ef6 100644 --- a/plugins/mockplugin/include/CosinusProvider.h +++ b/plugins/mockplugin/include/CosinusProvider.h @@ -22,6 +22,8 @@ public: void requestDataLoading(QUuid acqIdentifier, const DataProviderParameters ¶meters) override; + virtual IDataSeries* getData(const DataProviderParameters ¶meters) override; + /// @sa IDataProvider::requestDataAborting(). The current impl isn't thread safe. void requestDataAborting(QUuid acqIdentifier) override; @@ -35,6 +37,8 @@ private: std::shared_ptr retrieveData(QUuid acqIdentifier, const DateTimeRange &dataRangeRequested, const QVariantHash &data); + IDataSeries* _generate(const DateTimeRange &range, const QVariantHash &metaData); + QHash m_VariableToEnableProvider; }; diff --git a/plugins/mockplugin/src/CosinusProvider.cpp b/plugins/mockplugin/src/CosinusProvider.cpp index d561ae9..0cfd001 100644 --- a/plugins/mockplugin/src/CosinusProvider.cpp +++ b/plugins/mockplugin/src/CosinusProvider.cpp @@ -30,9 +30,9 @@ const auto SPECTROGRAM_ZERO_BANDS = std::set{2, 15, 19, 29}; struct ICosinusType { virtual ~ICosinusType() = default; /// @return the number of components generated for the type - virtual int componentCount() const = 0; + virtual std::size_t componentCount() const = 0; /// @return the data series created for the type - virtual std::shared_ptr createDataSeries(std::vector xAxisData, + virtual IDataSeries* createDataSeries(std::vector xAxisData, std::vector valuesData) const = 0; /// Generates values (one value per component) /// @param x the x-axis data used to generate values @@ -43,12 +43,12 @@ struct ICosinusType { }; struct ScalarCosinus : public ICosinusType { - int componentCount() const override { return 1; } + std::size_t componentCount() const override { return 1; } - std::shared_ptr createDataSeries(std::vector xAxisData, + IDataSeries* createDataSeries(std::vector xAxisData, std::vector valuesData) const override { - return std::make_shared(std::move(xAxisData), std::move(valuesData), + return new ScalarSeries(std::move(xAxisData), std::move(valuesData), Unit{QStringLiteral("t"), true}, Unit{}); } @@ -67,12 +67,12 @@ struct SpectrogramCosinus : public ICosinusType { { } - int componentCount() const override { return m_YAxisData.size(); } + std::size_t componentCount() const override { return m_YAxisData.size(); } - std::shared_ptr createDataSeries(std::vector xAxisData, + IDataSeries* createDataSeries(std::vector xAxisData, std::vector valuesData) const override { - return std::make_shared( + return new SpectrogramSeries( std::move(xAxisData), m_YAxisData, std::move(valuesData), Unit{QStringLiteral("t"), true}, m_YAxisUnit, m_ValuesUnit); } @@ -107,12 +107,12 @@ struct SpectrogramCosinus : public ICosinusType { }; struct VectorCosinus : public ICosinusType { - int componentCount() const override { return 3; } + std::size_t componentCount() const override { return 3; } - std::shared_ptr createDataSeries(std::vector xAxisData, + IDataSeries* createDataSeries(std::vector xAxisData, std::vector valuesData) const override { - return std::make_shared(std::move(xAxisData), std::move(valuesData), + return new VectorSeries(std::move(xAxisData), std::move(valuesData), Unit{QStringLiteral("t"), true}, Unit{}); } @@ -244,6 +244,41 @@ std::shared_ptr CosinusProvider::retrieveData(QUuid acqIdentifier, // We can close progression beacause all data has been retrieved emit dataProvidedProgress(acqIdentifier, 100); } + return std::shared_ptr(type->createDataSeries(std::move(xAxisData), std::move(valuesData))); +} + +IDataSeries *CosinusProvider::_generate(const DateTimeRange &range, const QVariantHash &metaData) +{ + auto dataIndex = 0; + + // Retrieves cosinus type + auto typeVariant = metaData.value(COSINUS_TYPE_KEY, COSINUS_TYPE_DEFAULT_VALUE); + auto type = cosinusType(typeVariant.toString()); + auto freqVariant = metaData.value(COSINUS_FREQUENCY_KEY, COSINUS_FREQUENCY_DEFAULT_VALUE); + double freq = freqVariant.toDouble(); + double start = std::ceil(range.m_TStart * freq); + double end = std::floor(range.m_TEnd * freq); + if (end < start) { + std::swap(start, end); + } + std::size_t dataCount = static_cast(end - start + 1); + std::size_t componentCount = type->componentCount(); + + auto xAxisData = std::vector{}; + xAxisData.resize(dataCount); + + auto valuesData = std::vector{}; + valuesData.resize(dataCount * componentCount); + + int progress = 0; + auto progressEnd = dataCount; + for (auto time = start; time <= end; ++time, ++dataIndex) + { + const auto x = time / freq; + xAxisData[dataIndex] = x; + // Generates values (depending on the type) + type->generateValues(x, valuesData, dataIndex); + } return type->createDataSeries(std::move(xAxisData), std::move(valuesData)); } @@ -265,6 +300,12 @@ void CosinusProvider::requestDataLoading(QUuid acqIdentifier, } } +IDataSeries* CosinusProvider::getData(const DataProviderParameters ¶meters) +{ + return _generate(parameters.m_Times.front(),parameters.m_Data); +} + + void CosinusProvider::requestDataAborting(QUuid acqIdentifier) { qCDebug(LOG_CosinusProvider()) << "CosinusProvider::requestDataAborting" << acqIdentifier