From bd7fbfda2f77d3966993790b5c5f7160d790c0e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Mon, 19 Oct 2020 19:39:16 +0200 Subject: [PATCH] Fix: drag markers on bodeplot working on windows --- .../PC_Application/Traces/tracebodeplot.cpp | 93 +++++++++---------- .../PC_Application/Traces/tracebodeplot.h | 21 +++++ 2 files changed, 64 insertions(+), 50 deletions(-) diff --git a/Software/PC_Application/Traces/tracebodeplot.cpp b/Software/PC_Application/Traces/tracebodeplot.cpp index 2efb766..b899339 100644 --- a/Software/PC_Application/Traces/tracebodeplot.cpp +++ b/Software/PC_Application/Traces/tracebodeplot.cpp @@ -11,7 +11,6 @@ #include #include "tracemarker.h" #include -#include #include #include "bodeplotaxisdialog.h" @@ -54,19 +53,6 @@ private: Trace &t; }; -// Derived plotpicker, exposing transformation functions -class BodeplotPicker : public QwtPlotPicker { -public: - BodeplotPicker(int xAxis, int yAxis, RubberBand rubberBand, DisplayMode trackerMode, QWidget *w) - : QwtPlotPicker(xAxis, yAxis, rubberBand, trackerMode, w) {}; - QPoint plotToPixel(const QPointF &pos) { - return transform(pos); - } - QPointF pixelToPlot(const QPoint &pos) { - return invTransform(pos); - } -}; - TraceBodePlot::TraceBodePlot(TraceModel &model, QWidget *parent) : TracePlot(parent), selectedMarker(nullptr) @@ -86,47 +72,14 @@ TraceBodePlot::TraceBodePlot(TraceModel &model, QWidget *parent) auto selectPicker = new BodeplotPicker(plot->xBottom, plot->yLeft, QwtPicker::NoRubberBand, QwtPicker::ActiveOnly, plot->canvas()); selectPicker->setStateMachine(new QwtPickerClickPointMachine); - auto drawPicker = new BodeplotPicker(plot->xBottom, plot->yLeft, QwtPicker::NoRubberBand, QwtPicker::ActiveOnly, plot->canvas()); + drawPicker = new BodeplotPicker(plot->xBottom, plot->yLeft, QwtPicker::NoRubberBand, QwtPicker::ActiveOnly, plot->canvas()); drawPicker->setStateMachine(new QwtPickerDragPointMachine); drawPicker->setTrackerPen(QPen(Qt::white)); // Marker selection - connect(selectPicker, qOverload(&QwtPlotPicker::selected), [=](const QPointF pos) { - auto clickPoint = drawPicker->plotToPixel(pos); - unsigned int closestDistance = numeric_limits::max(); - TraceMarker *closestMarker = nullptr; - for(auto m : markers) { - auto markerPoint = drawPicker->plotToPixel(m.second->value()); - auto yDiff = abs(markerPoint.y() - clickPoint.y()); - auto xDiff = abs(markerPoint.x() - clickPoint.x()); - unsigned int distance = xDiff * xDiff + yDiff * yDiff; - if(distance < closestDistance) { - closestDistance = distance; - closestMarker = m.first; - } - } - if(closestDistance <= 400) { - selectedMarker = closestMarker; - selectedCurve = curves[0][selectedMarker->trace()].curve; - } else { - selectedMarker = nullptr; - selectedCurve = nullptr; - } - }); + connect(selectPicker, SIGNAL(selected(QPointF)), this, SLOT(clicked(QPointF)));; // Marker movement - connect(drawPicker, qOverload(&QwtPlotPicker::moved), [=](const QPointF pos) { - if(!selectedMarker || !selectedCurve) { - return; - } -// int index = selectedCurve->closestPoint(pos.toPoint()); -// qDebug() << index; -// if(index < 0) { -// // unable to find closest point -// return; -// } -// selectedMarker->setFrequency(selectedCurve->sample(index).x()); - selectedMarker->setFrequency(pos.x()); - }); + connect(drawPicker, SIGNAL(moved(QPointF)), this, SLOT(moved(QPointF))); QwtPlotGrid *grid = new QwtPlotGrid(); grid->setMajorPen(QPen(Divisions, 1.0, Qt::DotLine)); @@ -157,6 +110,7 @@ TraceBodePlot::~TraceBodePlot() delete pd.second.curve; } } + delete drawPicker; } void TraceBodePlot::setXAxis(double min, double max) @@ -487,3 +441,42 @@ void TraceBodePlot::markerDataChanged(TraceMarker *m) triggerReplot(); } +void TraceBodePlot::clicked(const QPointF pos) +{ + auto clickPoint = drawPicker->plotToPixel(pos); + unsigned int closestDistance = numeric_limits::max(); + TraceMarker *closestMarker = nullptr; + for(auto m : markers) { + auto markerPoint = drawPicker->plotToPixel(m.second->value()); + auto yDiff = abs(markerPoint.y() - clickPoint.y()); + auto xDiff = abs(markerPoint.x() - clickPoint.x()); + unsigned int distance = xDiff * xDiff + yDiff * yDiff; + if(distance < closestDistance) { + closestDistance = distance; + closestMarker = m.first; + } + } + if(closestDistance <= 400) { + selectedMarker = closestMarker; + selectedCurve = curves[0][selectedMarker->trace()].curve; + } else { + selectedMarker = nullptr; + selectedCurve = nullptr; + } +} + +void TraceBodePlot::moved(const QPointF pos) +{ + if(!selectedMarker || !selectedCurve) { + return; + } +// int index = selectedCurve->closestPoint(pos.toPoint()); +// qDebug() << index; +// if(index < 0) { +// // unable to find closest point +// return; +// } +// selectedMarker->setFrequency(selectedCurve->sample(index).x()); + selectedMarker->setFrequency(pos.x()); +} + diff --git a/Software/PC_Application/Traces/tracebodeplot.h b/Software/PC_Application/Traces/tracebodeplot.h index 64be9e5..889846c 100644 --- a/Software/PC_Application/Traces/tracebodeplot.h +++ b/Software/PC_Application/Traces/tracebodeplot.h @@ -8,6 +8,22 @@ #include #include +#include + +// Derived plotpicker, exposing transformation functions +class BodeplotPicker : public QwtPlotPicker { + Q_OBJECT +public: + BodeplotPicker(int xAxis, int yAxis, RubberBand rubberBand, DisplayMode trackerMode, QWidget *w) + : QwtPlotPicker(xAxis, yAxis, rubberBand, trackerMode, w) {}; + QPoint plotToPixel(const QPointF &pos) { + return transform(pos); + } + QPointF pixelToPlot(const QPoint &pos) { + return invTransform(pos); + } +}; + class TraceBodePlot : public TracePlot { friend class BodeplotAxisDialog; @@ -39,6 +55,9 @@ private slots: void markerAdded(TraceMarker *m) override; void markerRemoved(TraceMarker *m) override; void markerDataChanged(TraceMarker *m); + + void clicked(const QPointF pos); + void moved(const QPointF pos); private: QString AxisTypeToName(YAxisType type); void enableTraceAxis(Trace *t, int axis, bool enabled); @@ -71,6 +90,8 @@ private: QwtPlot *plot; TraceMarker *selectedMarker; QwtPlotCurve *selectedCurve; + + BodeplotPicker *drawPicker; }; #endif // TRACEBODEPLOT_H