##// END OF EJS Templates
Removes title and close button from graph widget...
Removes title and close button from graph widget Title and button will be added directly as items in plot overlay

File last commit:

r578:4cbf5bf3dd44
r724:6a98c66c04c4
Show More
VisualizationGraphRenderingDelegate.cpp
105 lines | 3.6 KiB | text/x-c | CppLexer
/ gui / src / Visualization / VisualizationGraphRenderingDelegate.cpp
Alexandre Leroux
Creates a delegate offering methods for rendering a graph
r480 #include "Visualization/VisualizationGraphRenderingDelegate.h"
#include "Visualization/qcustomplot.h"
Alexandre Leroux
Uses the same time spec (UTC) as axis for tooltips on graph
r490 #include <Common/DateUtils.h>
Alexandre Leroux
Inits tracers and timer...
r482 namespace {
Alexandre Leroux
Show tracers method (1)...
r483 const auto DATETIME_FORMAT = QStringLiteral("yyyy/MM/dd hh:mm:ss:zzz");
Alexandre Leroux
Uses Qt tooltips instead of QCPTextItem...
r576 const auto TOOLTIP_FORMAT = QStringLiteral("key: %1\nvalue: %2");
Alexandre Leroux
Show tracers method (1)...
r483
Alexandre Leroux
Shifts tooltip to mouse
r578 /// Offset used to shift the tooltip of the mouse
const auto TOOLTIP_OFFSET = QPoint{20, 20};
Alexandre Leroux
Uses Qt tooltips instead of QCPTextItem...
r576 /// Tooltip display rectangle (the tooltip is hidden when the mouse leaves this rectangle)
const auto TOOLTIP_RECT = QRect{10, 10, 10, 10};
/// Timeout after which the tooltip is displayed
const auto TOOLTIP_TIMEOUT = 500;
Alexandre Leroux
Inits tracers and timer...
r482
Alexandre Leroux
Show tracers method (1)...
r483 /// Formats a data value according to the axis on which it is present
QString formatValue(double value, const QCPAxis &axis)
{
// If the axis is a time axis, formats the value as a date
Alexandre Leroux
Uses the same time spec (UTC) as axis for tooltips on graph
r490 if (auto axisTicker = qSharedPointerDynamicCast<QCPAxisTickerDateTime>(axis.ticker())) {
return DateUtils::dateTime(value, axisTicker->dateTimeSpec()).toString(DATETIME_FORMAT);
}
else {
return QString::number(value);
}
Alexandre Leroux
Show tracers method (1)...
r483 }
Alexandre Leroux
Sets tracers' styles
r485
void initPointTracerStyle(QCPItemTracer &tracer) noexcept
{
tracer.setInterpolating(false);
Alexandre Leroux
Replaces "Plus" cursor by "Circle" cursor
r577 tracer.setStyle(QCPItemTracer::tsCircle);
tracer.setSize(3);
Alexandre Leroux
Sets tracers' styles
r485 tracer.setPen(QPen(Qt::black));
tracer.setBrush(Qt::black);
}
Alexandre Leroux
Inits tracers and timer...
r482 } // namespace
Alexandre Leroux
Creates a delegate offering methods for rendering a graph
r480 struct VisualizationGraphRenderingDelegate::VisualizationGraphRenderingDelegatePrivate {
Alexandre Leroux
Inits tracers and timer...
r482 explicit VisualizationGraphRenderingDelegatePrivate(QCustomPlot &plot)
Alexandre Leroux
Uses Qt tooltips instead of QCPTextItem...
r576 : m_Plot{plot}, m_PointTracer{new QCPItemTracer{&plot}}, m_TracerTimer{}
Alexandre Leroux
Inits tracers and timer...
r482 {
Alexandre Leroux
Sets tracers' styles
r485 initPointTracerStyle(*m_PointTracer);
Alexandre Leroux
Inits tracers and timer...
r482
Alexandre Leroux
Uses Qt tooltips instead of QCPTextItem...
r576 m_TracerTimer.setInterval(TOOLTIP_TIMEOUT);
Alexandre Leroux
Inits tracers and timer...
r482 m_TracerTimer.setSingleShot(true);
}
Alexandre Leroux
Creates a delegate offering methods for rendering a graph
r480
QCustomPlot &m_Plot;
Alexandre Leroux
Inits tracers and timer...
r482 QCPItemTracer *m_PointTracer;
QTimer m_TracerTimer;
Alexandre Leroux
Creates a delegate offering methods for rendering a graph
r480 };
VisualizationGraphRenderingDelegate::VisualizationGraphRenderingDelegate(QCustomPlot &plot)
: impl{spimpl::make_unique_impl<VisualizationGraphRenderingDelegatePrivate>(plot)}
{
}
Alexandre Leroux
Creates method that will display a tooltip and a tracer with data point information after a while
r481
void VisualizationGraphRenderingDelegate::onMouseMove(QMouseEvent *event) noexcept
{
Alexandre Leroux
Inits tracers and timer...
r482 // Cancels pending refresh
impl->m_TracerTimer.disconnect();
Alexandre Leroux
Uses Qt tooltips instead of QCPTextItem...
r576 // Reinits tracers
impl->m_PointTracer->setGraph(nullptr);
impl->m_PointTracer->setVisible(false);
impl->m_Plot.replot();
// Gets the graph under the mouse position
auto eventPos = event->pos();
if (auto graph = qobject_cast<QCPGraph *>(impl->m_Plot.plottableAt(eventPos))) {
auto mouseKey = graph->keyAxis()->pixelToCoord(eventPos.x());
auto graphData = graph->data();
// Gets the closest data point to the mouse
auto graphDataIt = graphData->findBegin(mouseKey);
if (graphDataIt != graphData->constEnd()) {
auto key = formatValue(graphDataIt->key, *graph->keyAxis());
auto value = formatValue(graphDataIt->value, *graph->valueAxis());
// Displays point tracer
impl->m_PointTracer->setGraph(graph);
impl->m_PointTracer->setGraphKey(graphDataIt->key);
impl->m_PointTracer->setLayer(
impl->m_Plot.layer("main")); // Tracer is set on top of the plot's main layer
impl->m_PointTracer->setVisible(true);
Alexandre Leroux
Show tracers method (2)...
r484 impl->m_Plot.replot();
Alexandre Leroux
Inits tracers and timer...
r482
Alexandre Leroux
Uses Qt tooltips instead of QCPTextItem...
r576 // Starts timer to show tooltip after timeout
auto showTooltip = [ tooltip = TOOLTIP_FORMAT.arg(key, value), eventPos, this ]()
{
Alexandre Leroux
Shifts tooltip to mouse
r578 QToolTip::showText(impl->m_Plot.mapToGlobal(eventPos) + TOOLTIP_OFFSET, tooltip,
&impl->m_Plot, TOOLTIP_RECT);
Alexandre Leroux
Uses Qt tooltips instead of QCPTextItem...
r576 };
QObject::connect(&impl->m_TracerTimer, &QTimer::timeout, showTooltip);
impl->m_TracerTimer.start();
}
}
Alexandre Leroux
Creates method that will display a tooltip and a tracer with data point information after a while
r481 }