78 Multipoints_.clear ();
82 for (
const auto& set : variant.toList ())
84 const auto& map = set.toMap ();
86 const auto& colorVar = map [QStringLiteral (
"color")];
87 const auto&
color = colorVar.toString ();
89 throw UnsupportedType {
"`color` expected to be a QString", colorVar };
91 const auto& pointsVar = map [QStringLiteral (
"points")];
95 else if (pointsVar.canConvert<QVariantList> ())
97 [] (
const QVariant& var)
99 if (var.canConvert<QPointF> ())
100 return var.toPointF ();
102 throw UnsupportedType {
"point element expected to be a QPointF", var };
105 std::optional<QColor> brushColor;
106 if (
const auto& brushVar = map [QStringLiteral (
"brushColor")];
109 if (!brushVar.canConvert<QString> ())
110 throw UnsupportedType {
"`brush` expected to be a QString", brushVar };
111 brushColor = QColor { brushVar.toString () };
114 Multipoints_.append ({
color, brushColor,
points });
117 catch (
const UnsupportedType& ty)
119 qCritical () << Q_FUNC_INFO
120 <<
"invalid multipoints map: "
122 <<
" but got instead"
303 const auto& rect = contentsBoundingRect ().toRect ();
307 Plot_ = std::make_shared<QwtPlot> ();
308 Plot_->setFrameShape (QFrame::NoFrame);
309 Plot_->setFrameShadow (QFrame::Plain);
310 Plot_->setLineWidth (0);
311 Plot_->setMidLineWidth (0);
313 if (
const auto canvas = qobject_cast<QwtPlotCanvas*> (Plot_->canvas ()))
314 canvas->setBorderRadius (0);
318 plot.enableAxis (QwtPlot::yLeft, LeftAxisEnabled_);
319 plot.enableAxis (QwtPlot::xBottom, BottomAxisEnabled_);
320 plot.setAxisTitle (QwtPlot::yLeft, LeftAxisTitle_);
321 plot.setAxisTitle (QwtPlot::xBottom, BottomAxisTitle_);
323 if (plot.size () != rect.size ())
324 plot.resize (rect.size ());
326 auto setPaletteColor = [&plot] (
const QColor&
color, QPalette::ColorRole role)
328 if (!
color.isValid ())
331 auto pal = plot.palette ();
332 pal.setColor (role, {
color });
333 plot.setPalette (pal);
336 setPaletteColor (BackgroundColor_, QPalette::Window);
337 setPaletteColor (TextColor_, QPalette::WindowText);
338 setPaletteColor (TextColor_, QPalette::Text);
340 if (!PlotTitle_.isEmpty ())
341 plot.setTitle (QwtText { PlotTitle_ });
343 if (MinYValue_ < MaxYValue_)
345 plot.setAxisAutoScale (QwtPlot::yLeft,
false);
346 plot.setAxisScale (QwtPlot::yLeft, MinYValue_, MaxYValue_);
348 plot.setAutoFillBackground (
false);
349 plot.setCanvasBackground (Qt::transparent);
353 auto grid =
new QwtPlotGrid;
354 grid->enableYMin (YMinorGridEnabled_);
355 grid->enableX (
false);
356 grid->setMajorPen (QPen (GridLinesColor_, 1, Qt::SolidLine));
357 grid->setMinorPen (QPen (GridLinesColor_, 1, Qt::DashLine));
358 grid->attach (&plot);
361 auto items = Multipoints_;
362 if (items.isEmpty ())
363 items.push_back ({ Color_, {}, Points_ });
365 if (MinXValue_ < MaxXValue_)
366 plot.setAxisScale (QwtPlot::xBottom, MinXValue_, MaxXValue_);
367 else if (
const auto ptsCount = items.first ().Points_.size ())
368 plot.setAxisScale (QwtPlot::xBottom, 0, ptsCount - 1);
370 std::vector<std::unique_ptr<QwtPlotCurve>> curves;
371 for (
const auto& item : items)
373 curves.emplace_back (
new QwtPlotCurve);
374 const auto curve = curves.back ().get ();
376 curve->setPen (QPen (item.Color_));
378 if (item.BrushColor_)
379 curve->setBrush (*item.BrushColor_);
382 auto brushColor = item.Color_;
383 brushColor.setAlphaF (Alpha_);
384 curve->setBrush (brushColor);
387 curve->setRenderHint (QwtPlotItem::RenderAntialiased);
388 curve->attach (&plot);
390 curve->setSamples (item.Points_.toVector ());
395 QwtPlotRenderer {}.render (&plot, painter, rect);
397 const auto xExtent = CalcXExtent (plot);
398 const auto yExtent = CalcYExtent (plot);