From 632636b095aba604cac58b7e71f3b7a0ec84c9a8 2017-07-20 10:00:41 From: mperrinel Date: 2017-07-20 10:00:41 Subject: [PATCH] Merge branch 'feature/DownloadWhenTolIsOutsideCache' into develop --- diff --git a/app/src/MainWindow.cpp b/app/src/MainWindow.cpp index 05951cb..9b306a3 100644 --- a/app/src/MainWindow.cpp +++ b/app/src/MainWindow.cpp @@ -192,6 +192,10 @@ MainWindow::MainWindow(QWidget *parent) SIGNAL(variableAboutToBeDeleted(std::shared_ptr)), m_Ui->view, SLOT(onVariableAboutToBeDeleted(std::shared_ptr))); + connect(&sqpApp->visualizationController(), + SIGNAL(rangeChanged(std::shared_ptr, const SqpDateTime &)), m_Ui->view, + SLOT(onRangeChanged(std::shared_ptr, const SqpDateTime &))); + // Widgets / widgets connections // For the following connections, we use DirectConnection to allow each widget that can diff --git a/core/include/Data/IDataProvider.h b/core/include/Data/IDataProvider.h index 3f8296e..4af05f0 100644 --- a/core/include/Data/IDataProvider.h +++ b/core/include/Data/IDataProvider.h @@ -10,6 +10,8 @@ #include +#include + class DataProviderParameters; class IDataSeries; class QNetworkReply; diff --git a/core/include/DataSource/DataSourceItemAction.h b/core/include/DataSource/DataSourceItemAction.h index 1e64959..1dff4be 100644 --- a/core/include/DataSource/DataSourceItemAction.h +++ b/core/include/DataSource/DataSourceItemAction.h @@ -6,6 +6,8 @@ #include #include +#include + Q_DECLARE_LOGGING_CATEGORY(LOG_DataSourceItemAction) class DataSourceItem; diff --git a/core/include/Variable/VariableController.h b/core/include/Variable/VariableController.h index 2ba9d00..c896d44 100644 --- a/core/include/Variable/VariableController.h +++ b/core/include/Variable/VariableController.h @@ -59,6 +59,9 @@ signals: /// Signal emitted when a variable is about to be deleted from the controller void variableAboutToBeDeleted(std::shared_ptr variable); + /// Signal emitted when a data acquisition is requested on a range for a variable + void rangeChanged(std::shared_ptr variable, const SqpDateTime &range); + public slots: /// Request the data loading of the variable whithin dateTime void onRequestDataLoading(std::shared_ptr variable, const SqpDateTime &dateTime); diff --git a/core/include/Visualization/VisualizationController.h b/core/include/Visualization/VisualizationController.h index fac9491..74ff980 100644 --- a/core/include/Visualization/VisualizationController.h +++ b/core/include/Visualization/VisualizationController.h @@ -1,6 +1,8 @@ #ifndef SCIQLOP_VISUALIZATIONCONTROLLER_H #define SCIQLOP_VISUALIZATIONCONTROLLER_H +#include + #include #include #include @@ -29,6 +31,9 @@ signals: /// Signal emitted when a variable is about to be deleted from SciQlop void variableAboutToBeDeleted(std::shared_ptr variable); + /// Signal emitted when a data acquisition is requested on a range for a variable + void rangeChanged(std::shared_ptr variable, const SqpDateTime &range); + public slots: /// Manage init/end of the controller void initialize(); diff --git a/core/src/Variable/Variable.cpp b/core/src/Variable/Variable.cpp index 4a66066..286ef52 100644 --- a/core/src/Variable/Variable.cpp +++ b/core/src/Variable/Variable.cpp @@ -60,7 +60,7 @@ void Variable::setDataSeries(std::shared_ptr dataSeries) noexcept impl->m_DataSeries->merge(dataSeries.get()); impl->m_DataSeries->unlock(); dataSeries->unlock(); - emit updated(); + // emit updated(); } } diff --git a/core/src/Variable/VariableController.cpp b/core/src/Variable/VariableController.cpp index 3dca80d..fb2c553 100644 --- a/core/src/Variable/VariableController.cpp +++ b/core/src/Variable/VariableController.cpp @@ -139,6 +139,7 @@ void VariableController::createVariable(const QString &name, const QVariantHash if (varIdentifier == identifier) { impl->m_VariableCacheController->addDateTime(variable, dateTimeToPutInCache); variable->setDataSeries(dataSeriesAcquired); + emit variable->updated(); } } }; @@ -160,6 +161,7 @@ void VariableController::onDateTimeOnSelection(const SqpDateTime &dateTime) if (auto selectedVariable = impl->m_VariableModel->variable(selectedRow.row())) { selectedVariable->setDateTime(dateTime); this->onRequestDataLoading(selectedVariable, dateTime); + emit rangeChanged(selectedVariable, dateTime); } } } diff --git a/gui/include/Visualization/VisualizationGraphWidget.h b/gui/include/Visualization/VisualizationGraphWidget.h index ef0e800..c38c375 100644 --- a/gui/include/Visualization/VisualizationGraphWidget.h +++ b/gui/include/Visualization/VisualizationGraphWidget.h @@ -32,14 +32,15 @@ public: /// Removes a variable from the graph void removeVariable(std::shared_ptr variable) noexcept; + /// Rescale the X axe to range parameter + void setRange(std::shared_ptr variable, const SqpDateTime &range); + // IVisualizationWidget interface void accept(IVisualizationWidgetVisitor *visitor) override; bool canDrop(const Variable &variable) const override; bool contains(const Variable &variable) const override; QString name() const override; - void updateDisplay(std::shared_ptr variable); - signals: void requestDataLoading(std::shared_ptr variable, const SqpDateTime &dateTime); diff --git a/gui/include/Visualization/VisualizationWidget.h b/gui/include/Visualization/VisualizationWidget.h index 378b3e3..79e2538 100644 --- a/gui/include/Visualization/VisualizationWidget.h +++ b/gui/include/Visualization/VisualizationWidget.h @@ -2,6 +2,7 @@ #define SCIQLOP_VISUALIZATIONWIDGET_H #include "Visualization/IVisualizationWidget.h" +#include #include #include @@ -41,6 +42,8 @@ public slots: /// Slot called when a variable is about to be deleted from SciQlop void onVariableAboutToBeDeleted(std::shared_ptr variable) noexcept; + void onRangeChanged(std::shared_ptr variable, const SqpDateTime &range) noexcept; + private: Ui::VisualizationWidget *ui; }; diff --git a/gui/include/Visualization/operations/RescaleAxeOperation.h b/gui/include/Visualization/operations/RescaleAxeOperation.h new file mode 100644 index 0000000..5e348bb --- /dev/null +++ b/gui/include/Visualization/operations/RescaleAxeOperation.h @@ -0,0 +1,42 @@ +#ifndef SCIQLOP_RESCALEAXEOPERATION_H +#define SCIQLOP_RESCALEAXEOPERATION_H + +#include "Visualization/IVisualizationWidgetVisitor.h" +#include + +#include + +#include + +#include + +class Variable; + +Q_DECLARE_LOGGING_CATEGORY(LOG_RescaleAxeOperation) + +/** + * @brief The RescaleAxeOperation class defines an operation that traverses all of visualization + * widgets to remove a variable if they contain it + */ +class RescaleAxeOperation : public IVisualizationWidgetVisitor { +public: + /** + * Ctor + * @param variable the variable to remove from widgets + */ + explicit RescaleAxeOperation(std::shared_ptr variable, const SqpDateTime &range); + + void visitEnter(VisualizationWidget *widget) override final; + void visitLeave(VisualizationWidget *widget) override final; + void visitEnter(VisualizationTabWidget *tabWidget) override final; + void visitLeave(VisualizationTabWidget *tabWidget) override final; + void visitEnter(VisualizationZoneWidget *zoneWidget) override final; + void visitLeave(VisualizationZoneWidget *zoneWidget) override final; + void visit(VisualizationGraphWidget *graphWidget) override final; + +private: + class RescaleAxeOperationPrivate; + spimpl::unique_impl_ptr impl; +}; + +#endif // SCIQLOP_RESCALEAXEOPERATION_H diff --git a/gui/src/SqpApplication.cpp b/gui/src/SqpApplication.cpp index de830b8..89e0249 100644 --- a/gui/src/SqpApplication.cpp +++ b/gui/src/SqpApplication.cpp @@ -38,6 +38,11 @@ public: m_VisualizationController.get(), SIGNAL(variableAboutToBeDeleted(std::shared_ptr)), Qt::DirectConnection); + connect(m_VariableController.get(), + SIGNAL(rangeChanged(std::shared_ptr, const SqpDateTime &)), + m_VisualizationController.get(), + SIGNAL(rangeChanged(std::shared_ptr, const SqpDateTime &))); + m_DataSourceController->moveToThread(&m_DataSourceControllerThread); m_DataSourceControllerThread.setObjectName("DataSourceControllerThread"); diff --git a/gui/src/Visualization/VisualizationGraphHelper.cpp b/gui/src/Visualization/VisualizationGraphHelper.cpp index afd2e62..66b9d7c 100644 --- a/gui/src/Visualization/VisualizationGraphHelper.cpp +++ b/gui/src/Visualization/VisualizationGraphHelper.cpp @@ -69,7 +69,6 @@ void updateScalarData(QCPAbstractPlottable *component, ScalarSeries &scalarSerie // Display all data - component->rescaleAxes(); component->parentPlot()->replot(); } else { diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index 5af7fa8..81d03e6 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -122,6 +122,15 @@ void VisualizationGraphWidget::removeVariable(std::shared_ptr variable ui->widget->replot(); } +void VisualizationGraphWidget::setRange(std::shared_ptr variable, + const SqpDateTime &range) +{ + // auto componentsIt = impl->m_VariableToPlotMultiMap.equal_range(variable); + // for (auto it = componentsIt.first; it != componentsIt.second;) { + // } + ui->widget->xAxis->setRange(range.m_TStart, range.m_TEnd); +} + void VisualizationGraphWidget::accept(IVisualizationWidgetVisitor *visitor) { if (visitor) { @@ -177,37 +186,48 @@ void VisualizationGraphWidget::onGraphMenuRequested(const QPoint &pos) noexcept void VisualizationGraphWidget::onRangeChanged(const QCPRange &t1) { - qCDebug(LOG_VisualizationGraphWidget()) << tr("VisualizationGraphWidget::onRangeChanged") - << QThread::currentThread()->objectName(); + qCInfo(LOG_VisualizationGraphWidget()) << tr("VisualizationGraphWidget::onRangeChanged") + << QThread::currentThread()->objectName(); for (auto it = impl->m_VariableToPlotMultiMap.cbegin(); it != impl->m_VariableToPlotMultiMap.cend(); ++it) { auto variable = it->first; auto dateTime = SqpDateTime{t1.lower, t1.upper}; + auto dateTimeRange = dateTime; + + auto toleranceFactor = 0.2; + auto tolerance = toleranceFactor * (dateTime.m_TEnd - dateTime.m_TStart); + auto variableDateTimeWithTolerance = dateTime; + variableDateTimeWithTolerance.m_TStart -= tolerance; + variableDateTimeWithTolerance.m_TEnd += tolerance; - if (!variable->contains(dateTime)) { + qCInfo(LOG_VisualizationGraphWidget()) << "v" << dateTime; + qCInfo(LOG_VisualizationGraphWidget()) << "vtol" << variableDateTimeWithTolerance; + // If new range with tol is upper than variable datetime parameters. we need to request new + // data + if (!variable->contains(variableDateTimeWithTolerance)) { auto variableDateTimeWithTolerance = dateTime; if (!variable->isInside(dateTime)) { auto variableDateTime = variable->dateTime(); if (variableDateTime.m_TStart < dateTime.m_TStart) { - qCDebug(LOG_VisualizationGraphWidget()) << tr("TDetection pan to right:"); + qCInfo(LOG_VisualizationGraphWidget()) << tr("TORM: Detection pan to right:"); auto diffEndToKeepDelta = dateTime.m_TEnd - variableDateTime.m_TEnd; dateTime.m_TStart = variableDateTime.m_TStart + diffEndToKeepDelta; // Tolerance have to be added to the right - // add 10% tolerance for right (end) side - auto tolerance = 0.1 * (dateTime.m_TEnd - dateTime.m_TStart); + // add tolerance for right (end) side + tolerance = toleranceFactor * (dateTime.m_TEnd - dateTime.m_TStart); variableDateTimeWithTolerance.m_TEnd += tolerance; } else if (variableDateTime.m_TEnd > dateTime.m_TEnd) { - qCDebug(LOG_VisualizationGraphWidget()) << tr("Detection pan to left: "); + qCInfo(LOG_VisualizationGraphWidget()) << tr("TORM: Detection pan to left: "); auto diffStartToKeepDelta = variableDateTime.m_TStart - dateTime.m_TStart; dateTime.m_TEnd = variableDateTime.m_TEnd - diffStartToKeepDelta; // Tolerance have to be added to the left - // add 10% tolerance for left (start) side - auto tolerance = 0.1 * (dateTime.m_TEnd - dateTime.m_TStart); + // add tolerance for left (start) side + tolerance = toleranceFactor * (dateTime.m_TEnd - dateTime.m_TStart); variableDateTimeWithTolerance.m_TStart -= tolerance; } else { @@ -216,19 +236,24 @@ void VisualizationGraphWidget::onRangeChanged(const QCPRange &t1) } } else { - qCDebug(LOG_VisualizationGraphWidget()) << tr("Detection zoom out: "); + qCInfo(LOG_VisualizationGraphWidget()) << tr("Detection zoom out: "); // add 10% tolerance for each side - auto tolerance = 0.1 * (dateTime.m_TEnd - dateTime.m_TStart); + tolerance = 0.2 * (dateTime.m_TEnd - dateTime.m_TStart); variableDateTimeWithTolerance.m_TStart -= tolerance; variableDateTimeWithTolerance.m_TEnd += tolerance; } - variable->setDateTime(dateTime); + if (!variable->contains(dateTimeRange)) { + qCInfo(LOG_VisualizationGraphWidget()) + << "TORM: Modif on variable datetime detected" << dateTime; + variable->setDateTime(dateTime); + } + qCInfo(LOG_VisualizationGraphWidget()) << tr("Request data detection: "); // CHangement detected, we need to ask controller to request data loading emit requestDataLoading(variable, variableDateTimeWithTolerance); } else { - qCDebug(LOG_VisualizationGraphWidget()) << tr("Detection zoom in: "); + qCInfo(LOG_VisualizationGraphWidget()) << tr("Detection zoom in: "); } } } @@ -262,24 +287,21 @@ void VisualizationGraphWidget::onDataCacheVariableUpdated() // - use an ordered_multimap and the algos of std to group the values by key // - use a map (unique keys) and store as values directly the list of components + auto grapheRange = ui->widget->xAxis->range(); + auto dateTime = SqpDateTime{grapheRange.lower, grapheRange.upper}; + for (auto it = impl->m_VariableToPlotMultiMap.cbegin(); it != impl->m_VariableToPlotMultiMap.cend(); ++it) { auto variable = it->first; - VisualizationGraphHelper::updateData(QVector{} << it->second, - variable->dataSeries(), variable->dateTime()); - } -} - -void VisualizationGraphWidget::updateDisplay(std::shared_ptr variable) -{ - auto abstractPlotableItPair = impl->m_VariableToPlotMultiMap.equal_range(variable); - - auto abstractPlotableVect = QVector{}; - - for (auto it = abstractPlotableItPair.first; it != abstractPlotableItPair.second; ++it) { - abstractPlotableVect.push_back(it->second); + qCInfo(LOG_VisualizationGraphWidget()) + << "TORM: VisualizationGraphWidget::onDataCacheVariableUpdated S" + << variable->dateTime(); + qCInfo(LOG_VisualizationGraphWidget()) + << "TORM: VisualizationGraphWidget::onDataCacheVariableUpdated E" << dateTime; + if (dateTime.contains(variable->dateTime()) || dateTime.intersect(variable->dateTime())) { + + VisualizationGraphHelper::updateData(QVector{} << it->second, + variable->dataSeries(), variable->dateTime()); + } } - - VisualizationGraphHelper::updateData(abstractPlotableVect, variable->dataSeries(), - variable->dateTime()); } diff --git a/gui/src/Visualization/VisualizationWidget.cpp b/gui/src/Visualization/VisualizationWidget.cpp index 2b29114..076ff3c 100644 --- a/gui/src/Visualization/VisualizationWidget.cpp +++ b/gui/src/Visualization/VisualizationWidget.cpp @@ -5,6 +5,7 @@ #include "Visualization/VisualizationZoneWidget.h" #include "Visualization/operations/GenerateVariableMenuOperation.h" #include "Visualization/operations/RemoveVariableOperation.h" +#include "Visualization/operations/RescaleAxeOperation.h" #include "Visualization/qcustomplot.h" #include "ui_VisualizationWidget.h" @@ -141,3 +142,11 @@ void VisualizationWidget::onVariableAboutToBeDeleted(std::shared_ptr v auto removeVariableOperation = RemoveVariableOperation{variable}; accept(&removeVariableOperation); } + +void VisualizationWidget::onRangeChanged(std::shared_ptr variable, + const SqpDateTime &range) noexcept +{ + // Calls the operation of removing all references to the variable in the visualization + auto rescaleVariableOperation = RescaleAxeOperation{variable, range}; + accept(&rescaleVariableOperation); +} diff --git a/gui/src/Visualization/operations/RescaleAxeOperation.cpp b/gui/src/Visualization/operations/RescaleAxeOperation.cpp new file mode 100644 index 0000000..7145109 --- /dev/null +++ b/gui/src/Visualization/operations/RescaleAxeOperation.cpp @@ -0,0 +1,71 @@ +#include "Visualization/operations/RescaleAxeOperation.h" +#include "Visualization/VisualizationGraphWidget.h" + +Q_LOGGING_CATEGORY(LOG_RescaleAxeOperation, "RescaleAxeOperation") + +struct RescaleAxeOperation::RescaleAxeOperationPrivate { + explicit RescaleAxeOperationPrivate(std::shared_ptr variable, + const SqpDateTime &range) + : m_Variable(variable), m_Range(range) + { + } + + std::shared_ptr m_Variable; + SqpDateTime m_Range; +}; + +RescaleAxeOperation::RescaleAxeOperation(std::shared_ptr variable, + const SqpDateTime &range) + : impl{spimpl::make_unique_impl(variable, range)} +{ +} + +void RescaleAxeOperation::visitEnter(VisualizationWidget *widget) +{ + // VisualizationWidget is not intended to contain a variable + Q_UNUSED(widget) +} + +void RescaleAxeOperation::visitLeave(VisualizationWidget *widget) +{ + // VisualizationWidget is not intended to contain a variable + Q_UNUSED(widget) +} + +void RescaleAxeOperation::visitEnter(VisualizationTabWidget *tabWidget) +{ + // VisualizationTabWidget is not intended to contain a variable + Q_UNUSED(tabWidget) +} + +void RescaleAxeOperation::visitLeave(VisualizationTabWidget *tabWidget) +{ + // VisualizationTabWidget is not intended to contain a variable + Q_UNUSED(tabWidget) +} + +void RescaleAxeOperation::visitEnter(VisualizationZoneWidget *zoneWidget) +{ + // VisualizationZoneWidget is not intended to contain a variable + Q_UNUSED(zoneWidget) +} + +void RescaleAxeOperation::visitLeave(VisualizationZoneWidget *zoneWidget) +{ + // VisualizationZoneWidget is not intended to contain a variable + Q_UNUSED(zoneWidget) +} + +void RescaleAxeOperation::visit(VisualizationGraphWidget *graphWidget) +{ + if (graphWidget) { + // If the widget contains the variable, removes it + if (impl->m_Variable && graphWidget->contains(*impl->m_Variable)) { + graphWidget->setRange(impl->m_Variable, impl->m_Range); + } + } + else { + qCCritical(LOG_RescaleAxeOperation(), + "Can't visit VisualizationGraphWidget : the widget is null"); + } +}