From 8f094eaa3c043e99a92059931cb933d75aba44ee 2017-11-08 08:27:55 From: Alexandre Leroux Date: 2017-11-08 08:27:55 Subject: [PATCH] Refactors VisualizationGraphWidget::setYRange() - Moves method in VisualizationGraphHelper, as it won't return the same for scalars/vectors as for spectrograms: --- diff --git a/gui/include/Visualization/VisualizationGraphHelper.h b/gui/include/Visualization/VisualizationGraphHelper.h index 33eee26..c0bf2cf 100644 --- a/gui/include/Visualization/VisualizationGraphHelper.h +++ b/gui/include/Visualization/VisualizationGraphHelper.h @@ -34,6 +34,8 @@ struct VisualizationGraphHelper { static void updateData(PlottablesMap &plottables, std::shared_ptr dataSeries, const SqpRange &dateTime); + + static void setYAxisRange(std::shared_ptr variable, QCustomPlot &plot) noexcept; }; #endif // SCIQLOP_VISUALIZATIONGRAPHHELPER_H diff --git a/gui/include/Visualization/VisualizationGraphWidget.h b/gui/include/Visualization/VisualizationGraphWidget.h index a012cb7..c97c9ca 100644 --- a/gui/include/Visualization/VisualizationGraphWidget.h +++ b/gui/include/Visualization/VisualizationGraphWidget.h @@ -46,7 +46,8 @@ public: /// Returns the list of all variables used in the graph QList > variables() const; - void setYRange(const SqpRange &range); + /// Sets the y-axis range based on the data of a variable + void setYRange(std::shared_ptr variable); SqpRange graphRange() const noexcept; void setGraphRange(const SqpRange &range); diff --git a/gui/src/Visualization/VisualizationGraphHelper.cpp b/gui/src/Visualization/VisualizationGraphHelper.cpp index 141b9b9..7bfce64 100644 --- a/gui/src/Visualization/VisualizationGraphHelper.cpp +++ b/gui/src/Visualization/VisualizationGraphHelper.cpp @@ -75,6 +75,12 @@ struct PlottablesCreator struct PlottablesUpdater { + static void setPlotYAxisRange(T &, const SqpRange &, QCustomPlot &) + { + qCCritical(LOG_DataSeries()) + << QObject::tr("Can't set plot y-axis range: unmanaged data series type"); + } + static void updatePlottables(T &, PlottablesMap &, const SqpRange &, bool) { qCCritical(LOG_DataSeries()) @@ -91,6 +97,24 @@ template struct PlottablesUpdater::value or std::is_base_of::value> > { + static void setPlotYAxisRange(T &dataSeries, const SqpRange &xAxisRange, QCustomPlot &plot) + { + auto minValue = 0., maxValue = 0.; + + dataSeries.lockRead(); + auto valuesBounds = dataSeries.valuesBounds(xAxisRange.m_TStart, xAxisRange.m_TEnd); + auto end = dataSeries.cend(); + if (valuesBounds.first != end && valuesBounds.second != end) { + auto rangeValue = [](const auto &value) { return std::isnan(value) ? 0. : value; }; + + minValue = rangeValue(valuesBounds.first->minValue()); + maxValue = rangeValue(valuesBounds.second->maxValue()); + } + dataSeries.unlock(); + + plot.yAxis->setRange(QCPRange{minValue, maxValue}); + } + static void updatePlottables(T &dataSeries, PlottablesMap &plottables, const SqpRange &range, bool rescaleAxes) { @@ -139,6 +163,7 @@ struct PlottablesUpdater::updatePlottables(m_DataSeries, plottables, range, rescaleAxes); } + void setYAxisRange(const SqpRange &xAxisRange, QCustomPlot &plot) const override + { + return PlottablesUpdater::setPlotYAxisRange(m_DataSeries, xAxisRange, plot); + } + T &m_DataSeries; }; @@ -195,6 +225,19 @@ PlottablesMap VisualizationGraphHelper::create(std::shared_ptr variabl } } +void VisualizationGraphHelper::setYAxisRange(std::shared_ptr variable, + QCustomPlot &plot) noexcept +{ + if (variable) { + auto helper = createHelper(variable->dataSeries()); + helper->setYAxisRange(variable->range(), plot); + } + else { + qCDebug(LOG_VisualizationGraphHelper()) + << QObject::tr("Can't set y-axis range of plot: the variable is null"); + } +} + void VisualizationGraphHelper::updateData(PlottablesMap &plottables, std::shared_ptr dataSeries, const SqpRange &dateTime) diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index ba0672b..ac2534e 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -177,9 +177,14 @@ QList > VisualizationGraphWidget::variables() const return variables; } -void VisualizationGraphWidget::setYRange(const SqpRange &range) +void VisualizationGraphWidget::setYRange(std::shared_ptr variable) { - ui->widget->yAxis->setRange(range.m_TStart, range.m_TEnd); + if (!variable) { + qCCritical(LOG_VisualizationGraphWidget()) << "Can't set y-axis range: variable is null"; + return; + } + + VisualizationGraphHelper::setYAxisRange(variable, *ui->widget); } SqpRange VisualizationGraphWidget::graphRange() const noexcept diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index 0a911cb..365012f 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -271,23 +271,7 @@ VisualizationGraphWidget *VisualizationZoneWidget::createGraph(std::shared_ptrinsertGraph(index, graphWidget); graphWidget->addVariable(variable, range); - - // get y using variable range - if (auto dataSeries = variable->dataSeries()) { - dataSeries->lockRead(); - auto valuesBounds - = dataSeries->valuesBounds(variable->range().m_TStart, variable->range().m_TEnd); - auto end = dataSeries->cend(); - if (valuesBounds.first != end && valuesBounds.second != end) { - auto rangeValue = [](const auto &value) { return std::isnan(value) ? 0. : value; }; - - auto minValue = rangeValue(valuesBounds.first->minValue()); - auto maxValue = rangeValue(valuesBounds.second->maxValue()); - - graphWidget->setYRange(SqpRange{minValue, maxValue}); - } - dataSeries->unlock(); - } + graphWidget->setYRange(variable); return graphWidget; }