##// END OF EJS Templates
Tooltip for spectrograms (3)...
Alexandre Leroux -
r1067:1737b9de3921
parent child
Show More
@@ -1,277 +1,325
1 #include "Visualization/VisualizationGraphRenderingDelegate.h"
1 #include "Visualization/VisualizationGraphRenderingDelegate.h"
2 #include "Visualization/AxisRenderingUtils.h"
2 #include "Visualization/AxisRenderingUtils.h"
3 #include "Visualization/ColorScaleEditor.h"
3 #include "Visualization/ColorScaleEditor.h"
4 #include "Visualization/PlottablesRenderingUtils.h"
4 #include "Visualization/PlottablesRenderingUtils.h"
5 #include "Visualization/SqpColorScale.h"
5 #include "Visualization/SqpColorScale.h"
6 #include "Visualization/VisualizationGraphWidget.h"
6 #include "Visualization/VisualizationGraphWidget.h"
7 #include "Visualization/qcustomplot.h"
7 #include "Visualization/qcustomplot.h"
8
8
9 #include <Common/DateUtils.h>
9 #include <Common/DateUtils.h>
10
10
11 #include <Data/IDataSeries.h>
11 #include <Data/IDataSeries.h>
12
12
13 #include <SqpApplication.h>
13 #include <SqpApplication.h>
14
14
15 namespace {
15 namespace {
16
16
17 /// Name of the axes layer in QCustomPlot
17 /// Name of the axes layer in QCustomPlot
18 const auto AXES_LAYER = QStringLiteral("axes");
18 const auto AXES_LAYER = QStringLiteral("axes");
19
19
20 /// Icon used to show x-axis properties
20 /// Icon used to show x-axis properties
21 const auto HIDE_AXIS_ICON_PATH = QStringLiteral(":/icones/down.png");
21 const auto HIDE_AXIS_ICON_PATH = QStringLiteral(":/icones/down.png");
22
22
23 /// Name of the overlay layer in QCustomPlot
23 /// Name of the overlay layer in QCustomPlot
24 const auto OVERLAY_LAYER = QStringLiteral("overlay");
24 const auto OVERLAY_LAYER = QStringLiteral("overlay");
25
25
26 /// Pixmap used to show x-axis properties
26 /// Pixmap used to show x-axis properties
27 const auto SHOW_AXIS_ICON_PATH = QStringLiteral(":/icones/up.png");
27 const auto SHOW_AXIS_ICON_PATH = QStringLiteral(":/icones/up.png");
28
28
29 /// Tooltip format for graphs
29 /// Tooltip format for graphs
30 const auto GRAPH_TOOLTIP_FORMAT = QStringLiteral("key: %1\nvalue: %2");
30 const auto GRAPH_TOOLTIP_FORMAT = QStringLiteral("key: %1\nvalue: %2");
31
31
32
32
33 /// Offset used to shift the tooltip of the mouse
33 /// Offset used to shift the tooltip of the mouse
34 const auto TOOLTIP_OFFSET = QPoint{20, 20};
34 const auto TOOLTIP_OFFSET = QPoint{20, 20};
35
35
36 /// Tooltip display rectangle (the tooltip is hidden when the mouse leaves this rectangle)
36 /// Tooltip display rectangle (the tooltip is hidden when the mouse leaves this rectangle)
37 const auto TOOLTIP_RECT = QRect{10, 10, 10, 10};
37 const auto TOOLTIP_RECT = QRect{10, 10, 10, 10};
38
38
39 /// Timeout after which the tooltip is displayed
39 /// Timeout after which the tooltip is displayed
40 const auto TOOLTIP_TIMEOUT = 500;
40 const auto TOOLTIP_TIMEOUT = 500;
41
41
42 void initPointTracerStyle(QCPItemTracer &tracer) noexcept
42 void initPointTracerStyle(QCPItemTracer &tracer) noexcept
43 {
43 {
44 tracer.setInterpolating(false);
44 tracer.setInterpolating(false);
45 tracer.setStyle(QCPItemTracer::tsCircle);
45 tracer.setStyle(QCPItemTracer::tsCircle);
46 tracer.setSize(3);
46 tracer.setSize(3);
47 tracer.setPen(QPen(Qt::black));
47 tracer.setPen(QPen(Qt::black));
48 tracer.setBrush(Qt::black);
48 tracer.setBrush(Qt::black);
49 }
49 }
50
50
51 QPixmap pixmap(const QString &iconPath) noexcept
51 QPixmap pixmap(const QString &iconPath) noexcept
52 {
52 {
53 return QIcon{iconPath}.pixmap(QSize{16, 16});
53 return QIcon{iconPath}.pixmap(QSize{16, 16});
54 }
54 }
55
55
56 void initClosePixmapStyle(QCPItemPixmap &pixmap) noexcept
56 void initClosePixmapStyle(QCPItemPixmap &pixmap) noexcept
57 {
57 {
58 // Icon
58 // Icon
59 pixmap.setPixmap(
59 pixmap.setPixmap(
60 sqpApp->style()->standardIcon(QStyle::SP_TitleBarCloseButton).pixmap(QSize{16, 16}));
60 sqpApp->style()->standardIcon(QStyle::SP_TitleBarCloseButton).pixmap(QSize{16, 16}));
61
61
62 // Position
62 // Position
63 pixmap.topLeft->setType(QCPItemPosition::ptAxisRectRatio);
63 pixmap.topLeft->setType(QCPItemPosition::ptAxisRectRatio);
64 pixmap.topLeft->setCoords(1, 0);
64 pixmap.topLeft->setCoords(1, 0);
65 pixmap.setClipToAxisRect(false);
65 pixmap.setClipToAxisRect(false);
66
66
67 // Can be selected
67 // Can be selected
68 pixmap.setSelectable(true);
68 pixmap.setSelectable(true);
69 }
69 }
70
70
71 void initXAxisPixmapStyle(QCPItemPixmap &itemPixmap) noexcept
71 void initXAxisPixmapStyle(QCPItemPixmap &itemPixmap) noexcept
72 {
72 {
73 // Icon
73 // Icon
74 itemPixmap.setPixmap(pixmap(HIDE_AXIS_ICON_PATH));
74 itemPixmap.setPixmap(pixmap(HIDE_AXIS_ICON_PATH));
75
75
76 // Position
76 // Position
77 itemPixmap.topLeft->setType(QCPItemPosition::ptAxisRectRatio);
77 itemPixmap.topLeft->setType(QCPItemPosition::ptAxisRectRatio);
78 itemPixmap.topLeft->setCoords(0, 1);
78 itemPixmap.topLeft->setCoords(0, 1);
79 itemPixmap.setClipToAxisRect(false);
79 itemPixmap.setClipToAxisRect(false);
80
80
81 // Can be selected
81 // Can be selected
82 itemPixmap.setSelectable(true);
82 itemPixmap.setSelectable(true);
83 }
83 }
84
84
85 void initTitleTextStyle(QCPItemText &text) noexcept
85 void initTitleTextStyle(QCPItemText &text) noexcept
86 {
86 {
87 // Font and background styles
87 // Font and background styles
88 text.setColor(Qt::gray);
88 text.setColor(Qt::gray);
89 text.setBrush(Qt::white);
89 text.setBrush(Qt::white);
90
90
91 // Position
91 // Position
92 text.setPositionAlignment(Qt::AlignTop | Qt::AlignLeft);
92 text.setPositionAlignment(Qt::AlignTop | Qt::AlignLeft);
93 text.position->setType(QCPItemPosition::ptAxisRectRatio);
93 text.position->setType(QCPItemPosition::ptAxisRectRatio);
94 text.position->setCoords(0.5, 0);
94 text.position->setCoords(0.5, 0);
95 }
95 }
96
96
97 /**
98 * Returns the cell index (x or y) of a colormap according to the coordinate passed in parameter.
99 * This method handles the fact that a colormap axis can be logarithmic or linear.
100 * @param colormap the colormap for which to calculate the index
101 * @param coord the coord to convert to cell index
102 * @param xCoord calculates the x index if true, calculates y index if false
103 * @return the cell index
104 */
105 int colorMapCellIndex(const QCPColorMap &colormap, double coord, bool xCoord)
106 {
107 // Determines the axis of the colormap according to xCoord, and whether it is logarithmic or not
108 auto isLogarithmic = (xCoord ? colormap.keyAxis() : colormap.valueAxis())->scaleType()
109 == QCPAxis::stLogarithmic;
110
111 if (isLogarithmic) {
112 // For a logarithmic axis we can't use the conversion method of colormap, so we calculate
113 // the index manually based on the position of the coordinate on the axis
114
115 // Gets the axis range and the number of values between range bounds to calculate the step
116 // between each value of the range
117 auto range = xCoord ? colormap.data()->keyRange() : colormap.data()->valueRange();
118 auto nbValues = (xCoord ? colormap.data()->keySize() : colormap.data()->valueSize()) - 1;
119 auto valueStep
120 = (std::log10(range.upper) - std::log10(range.lower)) / static_cast<double>(nbValues);
121
122 // According to the coord position, calculates the closest index in the range
123 return std::round((std::log10(coord) - std::log10(range.lower)) / valueStep);
124 }
125 else {
126 // For a linear axis, we use the conversion method of colormap
127 int index;
128 if (xCoord) {
129 colormap.data()->coordToCell(coord, 0., &index, nullptr);
130 }
131 else {
132 colormap.data()->coordToCell(0., coord, nullptr, &index);
133 }
134
135 return index;
136 }
137 }
138
97 } // namespace
139 } // namespace
98
140
99 struct VisualizationGraphRenderingDelegate::VisualizationGraphRenderingDelegatePrivate {
141 struct VisualizationGraphRenderingDelegate::VisualizationGraphRenderingDelegatePrivate {
100 explicit VisualizationGraphRenderingDelegatePrivate(VisualizationGraphWidget &graphWidget)
142 explicit VisualizationGraphRenderingDelegatePrivate(VisualizationGraphWidget &graphWidget)
101 : m_Plot{graphWidget.plot()},
143 : m_Plot{graphWidget.plot()},
102 m_PointTracer{new QCPItemTracer{&m_Plot}},
144 m_PointTracer{new QCPItemTracer{&m_Plot}},
103 m_TracerTimer{},
145 m_TracerTimer{},
104 m_ClosePixmap{new QCPItemPixmap{&m_Plot}},
146 m_ClosePixmap{new QCPItemPixmap{&m_Plot}},
105 m_TitleText{new QCPItemText{&m_Plot}},
147 m_TitleText{new QCPItemText{&m_Plot}},
106 m_XAxisPixmap{new QCPItemPixmap{&m_Plot}},
148 m_XAxisPixmap{new QCPItemPixmap{&m_Plot}},
107 m_ShowXAxis{true},
149 m_ShowXAxis{true},
108 m_XAxisLabel{},
150 m_XAxisLabel{},
109 m_ColorScale{SqpColorScale{m_Plot}}
151 m_ColorScale{SqpColorScale{m_Plot}}
110 {
152 {
111 initPointTracerStyle(*m_PointTracer);
153 initPointTracerStyle(*m_PointTracer);
112
154
113 m_TracerTimer.setInterval(TOOLTIP_TIMEOUT);
155 m_TracerTimer.setInterval(TOOLTIP_TIMEOUT);
114 m_TracerTimer.setSingleShot(true);
156 m_TracerTimer.setSingleShot(true);
115
157
116 // Inits "close button" in plot overlay
158 // Inits "close button" in plot overlay
117 m_ClosePixmap->setLayer(OVERLAY_LAYER);
159 m_ClosePixmap->setLayer(OVERLAY_LAYER);
118 initClosePixmapStyle(*m_ClosePixmap);
160 initClosePixmapStyle(*m_ClosePixmap);
119
161
120 // Connects pixmap selection to graph widget closing
162 // Connects pixmap selection to graph widget closing
121 QObject::connect(m_ClosePixmap, &QCPItemPixmap::selectionChanged,
163 QObject::connect(m_ClosePixmap, &QCPItemPixmap::selectionChanged,
122 [&graphWidget](bool selected) {
164 [&graphWidget](bool selected) {
123 if (selected) {
165 if (selected) {
124 graphWidget.close();
166 graphWidget.close();
125 }
167 }
126 });
168 });
127
169
128 // Inits graph name in plot overlay
170 // Inits graph name in plot overlay
129 m_TitleText->setLayer(OVERLAY_LAYER);
171 m_TitleText->setLayer(OVERLAY_LAYER);
130 m_TitleText->setText(graphWidget.name());
172 m_TitleText->setText(graphWidget.name());
131 initTitleTextStyle(*m_TitleText);
173 initTitleTextStyle(*m_TitleText);
132
174
133 // Inits "show x-axis button" in plot overlay
175 // Inits "show x-axis button" in plot overlay
134 m_XAxisPixmap->setLayer(OVERLAY_LAYER);
176 m_XAxisPixmap->setLayer(OVERLAY_LAYER);
135 initXAxisPixmapStyle(*m_XAxisPixmap);
177 initXAxisPixmapStyle(*m_XAxisPixmap);
136
178
137 // Connects pixmap selection to graph x-axis showing/hiding
179 // Connects pixmap selection to graph x-axis showing/hiding
138 QObject::connect(m_XAxisPixmap, &QCPItemPixmap::selectionChanged, [this]() {
180 QObject::connect(m_XAxisPixmap, &QCPItemPixmap::selectionChanged, [this]() {
139 if (m_XAxisPixmap->selected()) {
181 if (m_XAxisPixmap->selected()) {
140 // Changes the selection state and refreshes the x-axis
182 // Changes the selection state and refreshes the x-axis
141 m_ShowXAxis = !m_ShowXAxis;
183 m_ShowXAxis = !m_ShowXAxis;
142 updateXAxisState();
184 updateXAxisState();
143 m_Plot.layer(AXES_LAYER)->replot();
185 m_Plot.layer(AXES_LAYER)->replot();
144
186
145 // Deselects the x-axis pixmap and updates icon
187 // Deselects the x-axis pixmap and updates icon
146 m_XAxisPixmap->setSelected(false);
188 m_XAxisPixmap->setSelected(false);
147 m_XAxisPixmap->setPixmap(
189 m_XAxisPixmap->setPixmap(
148 pixmap(m_ShowXAxis ? HIDE_AXIS_ICON_PATH : SHOW_AXIS_ICON_PATH));
190 pixmap(m_ShowXAxis ? HIDE_AXIS_ICON_PATH : SHOW_AXIS_ICON_PATH));
149 m_Plot.layer(OVERLAY_LAYER)->replot();
191 m_Plot.layer(OVERLAY_LAYER)->replot();
150 }
192 }
151 });
193 });
152 }
194 }
153
195
154 /// Updates state of x-axis according to the current selection of x-axis pixmap
196 /// Updates state of x-axis according to the current selection of x-axis pixmap
155 /// @remarks the method doesn't call plot refresh
197 /// @remarks the method doesn't call plot refresh
156 void updateXAxisState() noexcept
198 void updateXAxisState() noexcept
157 {
199 {
158 m_Plot.xAxis->setTickLabels(m_ShowXAxis);
200 m_Plot.xAxis->setTickLabels(m_ShowXAxis);
159 m_Plot.xAxis->setLabel(m_ShowXAxis ? m_XAxisLabel : QString{});
201 m_Plot.xAxis->setLabel(m_ShowXAxis ? m_XAxisLabel : QString{});
160 }
202 }
161
203
162 QCustomPlot &m_Plot;
204 QCustomPlot &m_Plot;
163 QCPItemTracer *m_PointTracer;
205 QCPItemTracer *m_PointTracer;
164 QTimer m_TracerTimer;
206 QTimer m_TracerTimer;
165 QCPItemPixmap *m_ClosePixmap; /// Graph's close button
207 QCPItemPixmap *m_ClosePixmap; /// Graph's close button
166 QCPItemText *m_TitleText; /// Graph's title
208 QCPItemText *m_TitleText; /// Graph's title
167 QCPItemPixmap *m_XAxisPixmap;
209 QCPItemPixmap *m_XAxisPixmap;
168 bool m_ShowXAxis; /// X-axis properties are shown or hidden
210 bool m_ShowXAxis; /// X-axis properties are shown or hidden
169 QString m_XAxisLabel;
211 QString m_XAxisLabel;
170 SqpColorScale m_ColorScale; /// Color scale used for some types of graphs (as spectrograms)
212 SqpColorScale m_ColorScale; /// Color scale used for some types of graphs (as spectrograms)
171 };
213 };
172
214
173 VisualizationGraphRenderingDelegate::VisualizationGraphRenderingDelegate(
215 VisualizationGraphRenderingDelegate::VisualizationGraphRenderingDelegate(
174 VisualizationGraphWidget &graphWidget)
216 VisualizationGraphWidget &graphWidget)
175 : impl{spimpl::make_unique_impl<VisualizationGraphRenderingDelegatePrivate>(graphWidget)}
217 : impl{spimpl::make_unique_impl<VisualizationGraphRenderingDelegatePrivate>(graphWidget)}
176 {
218 {
177 }
219 }
178
220
179 void VisualizationGraphRenderingDelegate::onMouseDoubleClick(QMouseEvent *event) noexcept
221 void VisualizationGraphRenderingDelegate::onMouseDoubleClick(QMouseEvent *event) noexcept
180 {
222 {
181 // Opens color scale editor if color scale is double clicked
223 // Opens color scale editor if color scale is double clicked
182 auto colorScale = dynamic_cast<QCPColorScale *>(impl->m_Plot.layoutElementAt(event->pos()));
224 auto colorScale = dynamic_cast<QCPColorScale *>(impl->m_Plot.layoutElementAt(event->pos()));
183 if (impl->m_ColorScale.m_Scale == colorScale) {
225 if (impl->m_ColorScale.m_Scale == colorScale) {
184 if (ColorScaleEditor{impl->m_ColorScale}.exec() == QDialog::Accepted) {
226 if (ColorScaleEditor{impl->m_ColorScale}.exec() == QDialog::Accepted) {
185 impl->m_Plot.replot();
227 impl->m_Plot.replot();
186 }
228 }
187 }
229 }
188 }
230 }
189
231
190 void VisualizationGraphRenderingDelegate::onMouseMove(QMouseEvent *event) noexcept
232 void VisualizationGraphRenderingDelegate::onMouseMove(QMouseEvent *event) noexcept
191 {
233 {
192 // Cancels pending refresh
234 // Cancels pending refresh
193 impl->m_TracerTimer.disconnect();
235 impl->m_TracerTimer.disconnect();
194
236
195 // Reinits tracers
237 // Reinits tracers
196 impl->m_PointTracer->setGraph(nullptr);
238 impl->m_PointTracer->setGraph(nullptr);
197 impl->m_PointTracer->setVisible(false);
239 impl->m_PointTracer->setVisible(false);
198 impl->m_Plot.replot();
240 impl->m_Plot.replot();
199
241
200 QString tooltip{};
242 QString tooltip{};
201
243
202 // Gets the graph under the mouse position
244 // Gets the graph under the mouse position
203 auto eventPos = event->pos();
245 auto eventPos = event->pos();
204 if (auto graph = qobject_cast<QCPGraph *>(impl->m_Plot.plottableAt(eventPos))) {
246 if (auto graph = qobject_cast<QCPGraph *>(impl->m_Plot.plottableAt(eventPos))) {
205 auto mouseKey = graph->keyAxis()->pixelToCoord(eventPos.x());
247 auto mouseKey = graph->keyAxis()->pixelToCoord(eventPos.x());
206 auto graphData = graph->data();
248 auto graphData = graph->data();
207
249
208 // Gets the closest data point to the mouse
250 // Gets the closest data point to the mouse
209 auto graphDataIt = graphData->findBegin(mouseKey);
251 auto graphDataIt = graphData->findBegin(mouseKey);
210 if (graphDataIt != graphData->constEnd()) {
252 if (graphDataIt != graphData->constEnd()) {
211 // Sets tooltip
253 // Sets tooltip
212 auto key = formatValue(graphDataIt->key, *graph->keyAxis());
254 auto key = formatValue(graphDataIt->key, *graph->keyAxis());
213 auto value = formatValue(graphDataIt->value, *graph->valueAxis());
255 auto value = formatValue(graphDataIt->value, *graph->valueAxis());
214 tooltip = GRAPH_TOOLTIP_FORMAT.arg(key, value);
256 tooltip = GRAPH_TOOLTIP_FORMAT.arg(key, value);
215
257
216 // Displays point tracer
258 // Displays point tracer
217 impl->m_PointTracer->setGraph(graph);
259 impl->m_PointTracer->setGraph(graph);
218 impl->m_PointTracer->setGraphKey(graphDataIt->key);
260 impl->m_PointTracer->setGraphKey(graphDataIt->key);
219 impl->m_PointTracer->setLayer(
261 impl->m_PointTracer->setLayer(
220 impl->m_Plot.layer("main")); // Tracer is set on top of the plot's main layer
262 impl->m_Plot.layer("main")); // Tracer is set on top of the plot's main layer
221 impl->m_PointTracer->setVisible(true);
263 impl->m_PointTracer->setVisible(true);
222 impl->m_Plot.replot();
264 impl->m_Plot.replot();
223 }
265 }
224 }
266 }
225 else if (auto colorMap = qobject_cast<QCPColorMap *>(impl->m_Plot.plottableAt(eventPos))) {
267 else if (auto colorMap = qobject_cast<QCPColorMap *>(impl->m_Plot.plottableAt(eventPos))) {
226 // Gets x and y coords
268 // Gets x and y coords
227 auto x = colorMap->keyAxis()->pixelToCoord(eventPos.x());
269 auto x = colorMap->keyAxis()->pixelToCoord(eventPos.x());
228 auto y = colorMap->valueAxis()->pixelToCoord(eventPos.y());
270 auto y = colorMap->valueAxis()->pixelToCoord(eventPos.y());
271
272 // Calculates x and y cell indexes, and retrieves the underlying value
273 auto xCellIndex = colorMapCellIndex(*colorMap, x, true);
274 auto yCellIndex = colorMapCellIndex(*colorMap, y, false);
275 auto value = colorMap->data()->cell(xCellIndex, yCellIndex);
276
229 }
277 }
230
278
231 if (!tooltip.isEmpty()) {
279 if (!tooltip.isEmpty()) {
232 // Starts timer to show tooltip after timeout
280 // Starts timer to show tooltip after timeout
233 auto showTooltip = [tooltip, eventPos, this]() {
281 auto showTooltip = [tooltip, eventPos, this]() {
234 QToolTip::showText(impl->m_Plot.mapToGlobal(eventPos) + TOOLTIP_OFFSET, tooltip,
282 QToolTip::showText(impl->m_Plot.mapToGlobal(eventPos) + TOOLTIP_OFFSET, tooltip,
235 &impl->m_Plot, TOOLTIP_RECT);
283 &impl->m_Plot, TOOLTIP_RECT);
236 };
284 };
237
285
238 QObject::connect(&impl->m_TracerTimer, &QTimer::timeout, showTooltip);
286 QObject::connect(&impl->m_TracerTimer, &QTimer::timeout, showTooltip);
239 impl->m_TracerTimer.start();
287 impl->m_TracerTimer.start();
240 }
288 }
241 }
289 }
242
290
243 void VisualizationGraphRenderingDelegate::onPlotUpdated() noexcept
291 void VisualizationGraphRenderingDelegate::onPlotUpdated() noexcept
244 {
292 {
245 // Updates color scale bounds
293 // Updates color scale bounds
246 impl->m_ColorScale.updateDataRange();
294 impl->m_ColorScale.updateDataRange();
247 impl->m_Plot.replot();
295 impl->m_Plot.replot();
248 }
296 }
249
297
250 void VisualizationGraphRenderingDelegate::setAxesProperties(
298 void VisualizationGraphRenderingDelegate::setAxesProperties(
251 std::shared_ptr<IDataSeries> dataSeries) noexcept
299 std::shared_ptr<IDataSeries> dataSeries) noexcept
252 {
300 {
253 // Stores x-axis label to be able to retrieve it when x-axis pixmap is unselected
301 // Stores x-axis label to be able to retrieve it when x-axis pixmap is unselected
254 impl->m_XAxisLabel = dataSeries->xAxisUnit().m_Name;
302 impl->m_XAxisLabel = dataSeries->xAxisUnit().m_Name;
255
303
256 auto axisHelper = IAxisHelperFactory::create(dataSeries);
304 auto axisHelper = IAxisHelperFactory::create(dataSeries);
257 axisHelper->setProperties(impl->m_Plot, impl->m_ColorScale);
305 axisHelper->setProperties(impl->m_Plot, impl->m_ColorScale);
258
306
259 // Updates x-axis state
307 // Updates x-axis state
260 impl->updateXAxisState();
308 impl->updateXAxisState();
261
309
262 impl->m_Plot.layer(AXES_LAYER)->replot();
310 impl->m_Plot.layer(AXES_LAYER)->replot();
263 }
311 }
264
312
265 void VisualizationGraphRenderingDelegate::setPlottablesProperties(
313 void VisualizationGraphRenderingDelegate::setPlottablesProperties(
266 std::shared_ptr<IDataSeries> dataSeries, PlottablesMap &plottables) noexcept
314 std::shared_ptr<IDataSeries> dataSeries, PlottablesMap &plottables) noexcept
267 {
315 {
268 auto plottablesHelper = IPlottablesHelperFactory::create(dataSeries);
316 auto plottablesHelper = IPlottablesHelperFactory::create(dataSeries);
269 plottablesHelper->setProperties(plottables);
317 plottablesHelper->setProperties(plottables);
270 }
318 }
271
319
272 void VisualizationGraphRenderingDelegate::showGraphOverlay(bool show) noexcept
320 void VisualizationGraphRenderingDelegate::showGraphOverlay(bool show) noexcept
273 {
321 {
274 auto overlay = impl->m_Plot.layer(OVERLAY_LAYER);
322 auto overlay = impl->m_Plot.layer(OVERLAY_LAYER);
275 overlay->setVisible(show);
323 overlay->setVisible(show);
276 overlay->replot();
324 overlay->replot();
277 }
325 }
General Comments 0
You need to be logged in to leave comments. Login now