customtracker.cpp
Go to the documentation of this file.
1 /*
2  * This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
5  */
6 
7 #include "customtracker.h"
8 #include "qwt_series_data.h"
9 #include "qwt_plot.h"
10 #include "qwt_plot_curve.h"
11 #include "qwt_event_pattern.h"
12 #include "qwt_scale_map.h"
13 #include "qwt_symbol.h"
14 #include "qwt_graphic.h"
15 #include "qwt_text.h"
16 #include <qevent.h>
17 #include <QFontDatabase>
18 #include <QSettings>
19 
20 struct compareX
21 {
22  inline bool operator()(const double x, const QPointF& pos) const
23  {
24  return (x < pos.x());
25  }
26 };
27 
28 CurveTracker::CurveTracker(QwtPlot* plot) : QObject(plot), _plot(plot), _param(VALUE)
29 {
31 
32  _line_marker->setLinePen(QPen(Qt::red));
34  _line_marker->setValue(0, 0);
35  _line_marker->attach(plot);
36 
38  _text_marker->attach(plot);
39 
40  _visible = true;
41 }
42 
44 {
45 }
46 
48 {
49  return _prev_trackerpoint;
50 }
51 
53 {
54  bool changed = _param != par;
55  _param = par;
56 
57  if (changed)
58  {
60  }
61 }
62 
64 {
65  _visible = enable;
68 
69  for (int i = 0; i < _marker.size(); i++)
70  {
71  _marker[i]->setVisible(enable);
72  }
73 }
74 
76 {
77  return _visible;
78 }
79 
80 void CurveTracker::setPosition(const QPointF& position)
81 {
83 
84  _line_marker->setValue(position);
85 
86  QRectF rect;
87  rect.setBottom(_plot->canvasMap(QwtPlot::yLeft).s1());
88  rect.setTop(_plot->canvasMap(QwtPlot::yLeft).s2());
89  rect.setLeft(_plot->canvasMap(QwtPlot::xBottom).s1());
90  rect.setRight(_plot->canvasMap(QwtPlot::xBottom).s2());
91 
92  double min_Y = std::numeric_limits<double>::max();
93  double max_Y = -min_Y;
94  int visible_points = 0;
95 
96  while (_marker.size() > curves.size())
97  {
98  _marker.back()->detach();
99  _marker.pop_back();
100  }
101 
102  for (int i = _marker.size(); i < curves.size(); i++)
103  {
104  _marker.push_back(new QwtPlotMarker);
105  _marker[i]->attach(_plot);
106  }
107 
108  double text_X_offset = 0;
109 
110  std::multimap<double, QString> text_lines;
111 
112  for (int i = 0; i < curves.size(); i++)
113  {
114  QwtPlotCurve* curve = static_cast<QwtPlotCurve*>(curves[i]);
115  _marker[i]->setVisible(curve->isVisible());
116 
117  if (curve->isVisible() == false)
118  {
119  continue;
120  }
121  QColor color = curve->pen().color();
122 
123  text_X_offset = rect.width() * 0.02;
124 
125  if (!_marker[i]->symbol() || _marker[i]->symbol()->brush().color() != color)
126  {
127  QwtSymbol* sym =
128  new QwtSymbol(QwtSymbol::Ellipse, color, QPen(Qt::black), QSize(5, 5));
129  _marker[i]->setSymbol(sym);
130  }
131 
132  const QLineF line = curveLineAt(curve, position.x());
133 
134  if (line.isNull())
135  {
136  continue;
137  }
138 
139  QPointF point;
140  double middle_X = (line.p1().x() + line.p2().x()) / 2.0;
141 
142  if (position.x() < middle_X)
143  point = line.p1();
144  else
145  point = line.p2();
146 
147  _marker[i]->setValue(point);
148 
149  if (rect.contains(point) && _visible)
150  {
151  min_Y = std::min(min_Y, point.y());
152  max_Y = std::max(max_Y, point.y());
153 
154  visible_points++;
155  double val = point.y();
156 
157  QString line;
158 
159  QSettings settings;
160  int prec = settings.value("Preferences::precision", 3).toInt();
161 
162  if (_param == VALUE)
163  {
164  line = QString("<font color=%1>%2</font>").arg(color.name()).arg(val);
165  }
166  else if (_param == VALUE_NAME)
167  {
168  QString value = QString::number(val, 'f', prec);
169  int whitespaces = 8 - value.length();
170  while (whitespaces-- > 0)
171  value.prepend("&nbsp;");
172 
173  line = QString("<font color=%1>%2 : %3</font>")
174  .arg(color.name())
175  .arg(value)
176  .arg(curve->title().text());
177  }
178 
179  text_lines.insert(std::make_pair(val, line));
180  _marker[i]->setVisible(true);
181  }
182  else
183  {
184  _marker[i]->setVisible(false);
185  }
186  _marker[i]->setValue(point);
187  }
188 
189  QwtText mark_text;
190 
191  QString text_marker_info;
192 
193  int count = 0;
194  for (auto it = text_lines.rbegin(); it != text_lines.rend(); it++)
195  {
196  text_marker_info += it->second;
197  if (count++ < text_lines.size() - 1)
198  {
199  text_marker_info += "<br>";
200  }
201  }
202  mark_text.setBorderPen(QColor(Qt::transparent));
203 
204  QColor background_color = _plot->palette().background().color();
205  background_color.setAlpha(180);
206  mark_text.setBackgroundBrush(background_color);
207  mark_text.setText(text_marker_info);
208 
209  QFont font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
210  font.setPointSize(9);
211 
212  mark_text.setFont(font);
213  mark_text.setRenderFlags(_param == VALUE ? Qt::AlignCenter : Qt::AlignLeft);
214 
215  _text_marker->setLabel(mark_text);
216  _text_marker->setLabelAlignment(Qt::AlignRight);
217 
218  _text_marker->setXValue(position.x() + text_X_offset);
219 
220  if (visible_points > 0)
221  {
222  _text_marker->setYValue(0.5 * (max_Y + min_Y));
223  }
224 
225  double canvas_ratio = rect.width() / double(_plot->width());
226  double text_width = mark_text.textSize().width() * canvas_ratio;
227  bool exceed_right = (_text_marker->boundingRect().right() + text_width) > rect.right();
228 
229  if (exceed_right)
230  {
231  _text_marker->setXValue(position.x() - text_X_offset - text_width);
232  }
233 
234  _text_marker->setVisible(visible_points > 0 && _visible && _param != LINE_ONLY);
235 
236  _prev_trackerpoint = position;
237 }
238 
239 QLineF CurveTracker::curveLineAt(const QwtPlotCurve* curve, double x) const
240 {
241  QLineF line;
242 
243  if (curve->dataSize() >= 2)
244  {
245  int index = qwtUpperSampleIndex<QPointF>(*curve->data(), x, compareX());
246 
247  if (index > 0)
248  {
249  line.setP1(curve->sample(index - 1));
250  line.setP2(curve->sample(index));
251  }
252  }
253  return line;
254 }
QwtPlotDict::itemList
const QwtPlotItemList & itemList() const
A QwtPlotItemList of all attached plot items.
Definition: qwt_plot_dict.cpp:166
color
color
Definition: color.h:16
qwt_graphic.h
QwtText::setBorderPen
void setBorderPen(const QPen &)
Definition: qwt_text.cpp:420
QwtText::setText
void setText(const QString &, QwtText::TextFormat textFormat=AutoText)
Definition: qwt_text.cpp:277
QwtSeriesStore::sample
T sample(int index) const
Definition: qwt_series_store.h:158
CurveTracker::VALUE_NAME
@ VALUE_NAME
Definition: customtracker.h:32
CurveTracker::VALUE
@ VALUE
Definition: customtracker.h:31
QwtPlot
A 2-D plotting widget.
Definition: qwt_plot.h:78
QwtScaleMap::s2
double s2() const
Definition: qwt_scale_map.h:91
mqtt_test_proto.x
x
Definition: mqtt_test_proto.py:34
QwtScaleMap::s1
double s1() const
Definition: qwt_scale_map.h:83
QwtText::setRenderFlags
void setRenderFlags(int)
Change the render flags.
Definition: qwt_text.cpp:304
QList< QwtPlotItem * >
qwt_symbol.h
CurveTracker::_param
Parameter _param
Definition: customtracker.h:62
QwtPlotMarker::setXValue
void setXValue(double)
Set X Value.
Definition: qwt_plot_marker.cpp:123
CurveTracker::isEnabled
bool isEnabled() const
Definition: customtracker.cpp:75
detail::count
constexpr auto count() -> size_t
Definition: core.h:1222
QwtText::textSize
QSizeF textSize() const
Definition: qwt_text.cpp:570
QwtPlotItem::isVisible
bool isVisible() const
Definition: qwt_plot_item.cpp:470
QwtPlotMarker::VLine
@ VLine
A vertical line.
Definition: qwt_plot_marker.h:62
qwt_scale_map.h
QwtText
A class representing a text.
Definition: qwt_text.h:51
QwtSymbol
A class for drawing symbols.
Definition: qwt_symbol.h:31
CurveTracker::setEnabled
void setEnabled(bool enable)
Definition: customtracker.cpp:63
QwtPlotMarker::setLinePen
void setLinePen(const QColor &, qreal width=0.0, Qt::PenStyle=Qt::SolidLine)
Definition: qwt_plot_marker.cpp:541
CurveTracker::_marker
std::vector< QwtPlotMarker * > _marker
Definition: customtracker.h:58
qwt_event_pattern.h
QwtSymbol::Ellipse
@ Ellipse
Ellipse or circle.
Definition: qwt_symbol.h:44
QwtPlotMarker::boundingRect
virtual QRectF boundingRect() const QWT_OVERRIDE
Definition: qwt_plot_marker.cpp:572
CurveTracker::LINE_ONLY
@ LINE_ONLY
Definition: customtracker.h:30
sol::meta::enable
std::enable_if_t< all< Args... >::value, enable_t > enable
Definition: sol.hpp:2244
QwtText::text
QString text() const
Definition: qwt_text.cpp:289
QwtPlotCurve::pen
const QPen & pen() const
Definition: qwt_plot_curve.cpp:330
QwtText::setBackgroundBrush
void setBackgroundBrush(const QBrush &)
Definition: qwt_text.cpp:441
QwtSeriesStore::data
QwtSeriesData< T > * data()
Definition: qwt_series_store.h:146
QwtText::setFont
void setFont(const QFont &)
Definition: qwt_text.cpp:329
QwtSeriesStore::dataSize
virtual size_t dataSize() const QWT_OVERRIDE
Definition: qwt_series_store.h:175
CurveTracker::setPosition
void setPosition(const QPointF &pos)
Definition: customtracker.cpp:80
QwtPlot::yLeft
@ yLeft
Definition: qwt_plot.h:240
compareX
Definition: customtracker.cpp:20
QwtPlotMarker::setLabel
void setLabel(const QwtText &)
Set the label.
Definition: qwt_plot_marker.cpp:420
compareX::operator()
bool operator()(const double x, const QPointF &pos) const
Definition: customtracker.cpp:22
CurveTracker::_line_marker
QwtPlotMarker * _line_marker
Definition: customtracker.h:59
CurveTracker::~CurveTracker
~CurveTracker()
Definition: customtracker.cpp:43
CurveTracker::setParameter
void setParameter(Parameter par)
Definition: customtracker.cpp:52
CurveTracker::curveLineAt
QLineF curveLineAt(const QwtPlotCurve *, double x) const
Definition: customtracker.cpp:239
QwtPlotMarker::setYValue
void setYValue(double)
Set Y Value.
Definition: qwt_plot_marker.cpp:129
CurveTracker::_visible
bool _visible
Definition: customtracker.h:63
customtracker.h
CurveTracker::actualPosition
QPointF actualPosition() const
Definition: customtracker.cpp:47
qwt_plot_curve.h
CurveTracker::_prev_trackerpoint
QPointF _prev_trackerpoint
Definition: customtracker.h:57
QwtPlotMarker
A class for drawing markers.
Definition: qwt_plot_marker.h:45
QwtPlot::xBottom
@ xBottom
Definition: qwt_plot.h:242
CurveTracker::_text_marker
QwtPlotMarker * _text_marker
Definition: customtracker.h:60
QwtPlotItem::setVisible
virtual void setVisible(bool)
Definition: qwt_plot_item.cpp:457
CurveTracker::CurveTracker
CurveTracker(QwtPlot *)
Definition: customtracker.cpp:28
CurveTracker::Parameter
Parameter
Definition: customtracker.h:28
QwtPlotItem::attach
void attach(QwtPlot *plot)
Attach the item to a plot.
Definition: qwt_plot_item.cpp:98
qwt_text.h
QwtPlotMarker::setLabelAlignment
void setLabelAlignment(Qt::Alignment)
Set the alignment of the label.
Definition: qwt_plot_marker.cpp:452
QwtPlot::canvasMap
virtual QwtScaleMap canvasMap(QwtAxisId) const
Definition: qwt_plot.cpp:800
QwtPlotItem::Rtti_PlotCurve
@ Rtti_PlotCurve
For QwtPlotCurve.
Definition: qwt_plot_item.h:93
CurveTracker::_plot
QwtPlot * _plot
Definition: customtracker.h:61
QwtPlotMarker::setLineStyle
void setLineStyle(LineStyle)
Set the line style.
Definition: qwt_plot_marker.cpp:366
QwtPlotItem::title
const QwtText & title() const
Definition: qwt_plot_item.cpp:215
QwtPlotCurve
A plot item, that represents a series of points.
Definition: qwt_plot_curve.h:56
qwt_plot.h
qwt_series_data.h
QwtPlotMarker::setValue
void setValue(double, double)
Set Value.
Definition: qwt_plot_marker.cpp:112


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Jan 26 2025 03:23:23