##// END OF EJS Templates
Adds "number of operations" and "number of variables" properties for the tests
Adds "number of operations" and "number of variables" properties for the tests

File last commit:

r1110:0e96e473601d
r1170:3da18e6983d5
Show More
AxisRenderingUtils.cpp
177 lines | 5.8 KiB | text/x-c | CppLexer
/ gui / src / Visualization / AxisRenderingUtils.cpp
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 #include "Visualization/AxisRenderingUtils.h"
#include <Data/ScalarSeries.h>
Alexandre Leroux
Handles axes properties for spectrograms...
r920 #include <Data/SpectrogramSeries.h>
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 #include <Data/VectorSeries.h>
Alexandre Leroux
Uses SciQlop color scale in graphs
r1009 #include <Visualization/SqpColorScale.h>
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 #include <Visualization/qcustomplot.h>
Alexandre Leroux
Adds logs to axe and plottable rendering utils
r928 Q_LOGGING_CATEGORY(LOG_AxisRenderingUtils, "AxisRenderingUtils")
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 namespace {
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916 const auto DATETIME_FORMAT = QStringLiteral("yyyy/MM/dd hh:mm:ss:zzz");
/// Format for datetimes on a axis
const auto DATETIME_TICKER_FORMAT = QStringLiteral("yyyy/MM/dd \nhh:mm:ss");
Alexandre Leroux
Tooltip for spectrograms (4)...
r1027 const auto NUMBER_FORMAT = 'g';
const auto NUMBER_PRECISION = 9;
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916 /// Generates the appropriate ticker for an axis, depending on whether the axis displays time or
/// non-time data
Alexandre Leroux
Handles log scales for y-axis and color scale
r929 QSharedPointer<QCPAxisTicker> axisTicker(bool isTimeAxis, QCPAxis::ScaleType scaleType)
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916 {
if (isTimeAxis) {
auto dateTicker = QSharedPointer<QCPAxisTickerDateTime>::create();
dateTicker->setDateTimeFormat(DATETIME_TICKER_FORMAT);
dateTicker->setDateTimeSpec(Qt::UTC);
return dateTicker;
}
Alexandre Leroux
Handles log scales for y-axis and color scale
r929 else if (scaleType == QCPAxis::stLogarithmic) {
return QSharedPointer<QCPAxisTickerLog>::create();
}
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916 else {
// default ticker
return QSharedPointer<QCPAxisTicker>::create();
}
}
/**
* Sets properties of the axis passed as parameter
* @param axis the axis to set
* @param unit the unit to set for the axis
* @param scaleType the scale type to set for the axis
*/
void setAxisProperties(QCPAxis &axis, const Unit &unit,
QCPAxis::ScaleType scaleType = QCPAxis::stLinear)
{
// label (unit name)
axis.setLabel(unit.m_Name);
// scale type
axis.setScaleType(scaleType);
Alexandre Leroux
Handles log scales for y-axis and color scale
r929 if (scaleType == QCPAxis::stLogarithmic) {
// Scientific notation
axis.setNumberPrecision(0);
axis.setNumberFormat("eb");
}
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916
// ticker (depending on the type of unit)
Alexandre Leroux
Handles log scales for y-axis and color scale
r929 axis.setTicker(axisTicker(unit.m_TimeUnit, scaleType));
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916 }
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 /**
* Delegate used to set axes properties
*/
template <typename T, typename Enabled = void>
struct AxisSetter {
Alexandre Leroux
Uses SciQlop color scale in graphs
r1009 static void setProperties(T &, QCustomPlot &, SqpColorScale &)
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 {
// Default implementation does nothing
Alexandre Leroux
Adds logs to axe and plottable rendering utils
r928 qCCritical(LOG_AxisRenderingUtils()) << "Can't set axis properties: unmanaged type of data";
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 }
};
/**
* Specialization of AxisSetter for scalars and vectors
* @sa ScalarSeries
* @sa VectorSeries
*/
template <typename T>
struct AxisSetter<T, typename std::enable_if_t<std::is_base_of<ScalarSeries, T>::value
or std::is_base_of<VectorSeries, T>::value> > {
Alexandre Leroux
Uses SciQlop color scale in graphs
r1009 static void setProperties(T &dataSeries, QCustomPlot &plot, SqpColorScale &)
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 {
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916 dataSeries.lockRead();
auto xAxisUnit = dataSeries.xAxisUnit();
auto valuesUnit = dataSeries.valuesUnit();
dataSeries.unlock();
setAxisProperties(*plot.xAxis, xAxisUnit);
setAxisProperties(*plot.yAxis, valuesUnit);
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 }
};
Alexandre Leroux
Handles axes properties for spectrograms...
r920 /**
* Specialization of AxisSetter for spectrograms
* @sa SpectrogramSeries
*/
template <typename T>
struct AxisSetter<T, typename std::enable_if_t<std::is_base_of<SpectrogramSeries, T>::value> > {
Alexandre Leroux
Uses SciQlop color scale in graphs
r1009 static void setProperties(T &dataSeries, QCustomPlot &plot, SqpColorScale &colorScale)
Alexandre Leroux
Handles axes properties for spectrograms...
r920 {
dataSeries.lockRead();
auto xAxisUnit = dataSeries.xAxisUnit();
Alexandre Leroux
Updates access to y-axis properties of the data series (1)...
r988 auto yAxisUnit = dataSeries.yAxisUnit();
Alexandre Leroux
Handles axes properties for spectrograms...
r920 auto valuesUnit = dataSeries.valuesUnit();
dataSeries.unlock();
setAxisProperties(*plot.xAxis, xAxisUnit);
Alexandre Leroux
Handles log scales for y-axis and color scale
r929 setAxisProperties(*plot.yAxis, yAxisUnit, QCPAxis::stLogarithmic);
Alexandre Leroux
Handles axes properties for spectrograms...
r920
// Displays color scale in plot
plot.plotLayout()->insertRow(0);
Alexandre Leroux
Uses SciQlop color scale in graphs
r1009 plot.plotLayout()->addElement(0, 0, colorScale.m_Scale);
colorScale.m_Scale->setType(QCPAxis::atTop);
colorScale.m_Scale->setMinimumMargins(QMargins{0, 0, 0, 0});
Alexandre Leroux
Handles axes properties for spectrograms...
r920
// Aligns color scale with axes
auto marginGroups = plot.axisRect()->marginGroups();
for (auto it = marginGroups.begin(), end = marginGroups.end(); it != end; ++it) {
Alexandre Leroux
Uses SciQlop color scale in graphs
r1009 colorScale.m_Scale->setMarginGroup(it.key(), it.value());
Alexandre Leroux
Handles axes properties for spectrograms...
r920 }
// Set color scale properties
Alexandre Leroux
Uses SciQlop color scale in graphs
r1009 setAxisProperties(*colorScale.m_Scale->axis(), valuesUnit, QCPAxis::stLogarithmic);
Alexandre Leroux
Minor fix...
r1110 colorScale.m_AutomaticThreshold = true;
Alexandre Leroux
Handles axes properties for spectrograms...
r920 }
};
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 /**
* Default implementation of IAxisHelper, which takes data series to set axes properties
* @tparam T the data series' type
*/
template <typename T>
struct AxisHelper : public IAxisHelper {
explicit AxisHelper(T &dataSeries) : m_DataSeries{dataSeries} {}
Alexandre Leroux
Uses SciQlop color scale in graphs
r1009 void setProperties(QCustomPlot &plot, SqpColorScale &colorScale) override
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 {
AxisSetter<T>::setProperties(m_DataSeries, plot, colorScale);
}
T &m_DataSeries;
};
} // namespace
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916 QString formatValue(double value, const QCPAxis &axis)
{
// If the axis is a time axis, formats the value as a date
if (auto axisTicker = qSharedPointerDynamicCast<QCPAxisTickerDateTime>(axis.ticker())) {
return DateUtils::dateTime(value, axisTicker->dateTimeSpec()).toString(DATETIME_FORMAT);
}
else {
Alexandre Leroux
Tooltip for spectrograms (4)...
r1027 return QString::number(value, NUMBER_FORMAT, NUMBER_PRECISION);
Alexandre Leroux
Refactoring handling of axes properties (2)...
r916 }
}
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 std::unique_ptr<IAxisHelper>
IAxisHelperFactory::create(std::shared_ptr<IDataSeries> dataSeries) noexcept
{
if (auto scalarSeries = std::dynamic_pointer_cast<ScalarSeries>(dataSeries)) {
return std::make_unique<AxisHelper<ScalarSeries> >(*scalarSeries);
}
Alexandre Leroux
Handles axes properties for spectrograms...
r920 else if (auto spectrogramSeries = std::dynamic_pointer_cast<SpectrogramSeries>(dataSeries)) {
return std::make_unique<AxisHelper<SpectrogramSeries> >(*spectrogramSeries);
}
Alexandre Leroux
Refactoring handling of axes properties (1)...
r915 else if (auto vectorSeries = std::dynamic_pointer_cast<VectorSeries>(dataSeries)) {
return std::make_unique<AxisHelper<VectorSeries> >(*vectorSeries);
}
else {
return std::make_unique<AxisHelper<IDataSeries> >(*dataSeries);
}
}