Fix: drag markers on bodeplot working on windows
This commit is contained in:
parent
c813f1c193
commit
bd7fbfda2f
@ -11,7 +11,6 @@
|
|||||||
#include <qwt_plot_layout.h>
|
#include <qwt_plot_layout.h>
|
||||||
#include "tracemarker.h"
|
#include "tracemarker.h"
|
||||||
#include <qwt_symbol.h>
|
#include <qwt_symbol.h>
|
||||||
#include <qwt_plot_picker.h>
|
|
||||||
#include <qwt_picker_machine.h>
|
#include <qwt_picker_machine.h>
|
||||||
#include "bodeplotaxisdialog.h"
|
#include "bodeplotaxisdialog.h"
|
||||||
|
|
||||||
@ -54,19 +53,6 @@ private:
|
|||||||
Trace &t;
|
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)
|
TraceBodePlot::TraceBodePlot(TraceModel &model, QWidget *parent)
|
||||||
: TracePlot(parent),
|
: TracePlot(parent),
|
||||||
selectedMarker(nullptr)
|
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());
|
auto selectPicker = new BodeplotPicker(plot->xBottom, plot->yLeft, QwtPicker::NoRubberBand, QwtPicker::ActiveOnly, plot->canvas());
|
||||||
selectPicker->setStateMachine(new QwtPickerClickPointMachine);
|
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->setStateMachine(new QwtPickerDragPointMachine);
|
||||||
drawPicker->setTrackerPen(QPen(Qt::white));
|
drawPicker->setTrackerPen(QPen(Qt::white));
|
||||||
|
|
||||||
// Marker selection
|
// Marker selection
|
||||||
connect(selectPicker, qOverload<const QPointF&>(&QwtPlotPicker::selected), [=](const QPointF pos) {
|
connect(selectPicker, SIGNAL(selected(QPointF)), this, SLOT(clicked(QPointF)));;
|
||||||
auto clickPoint = drawPicker->plotToPixel(pos);
|
|
||||||
unsigned int closestDistance = numeric_limits<unsigned int>::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;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Marker movement
|
// Marker movement
|
||||||
connect(drawPicker, qOverload<const QPointF&>(&QwtPlotPicker::moved), [=](const QPointF pos) {
|
connect(drawPicker, SIGNAL(moved(QPointF)), this, SLOT(moved(QPointF)));
|
||||||
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());
|
|
||||||
});
|
|
||||||
|
|
||||||
QwtPlotGrid *grid = new QwtPlotGrid();
|
QwtPlotGrid *grid = new QwtPlotGrid();
|
||||||
grid->setMajorPen(QPen(Divisions, 1.0, Qt::DotLine));
|
grid->setMajorPen(QPen(Divisions, 1.0, Qt::DotLine));
|
||||||
@ -157,6 +110,7 @@ TraceBodePlot::~TraceBodePlot()
|
|||||||
delete pd.second.curve;
|
delete pd.second.curve;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete drawPicker;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TraceBodePlot::setXAxis(double min, double max)
|
void TraceBodePlot::setXAxis(double min, double max)
|
||||||
@ -487,3 +441,42 @@ void TraceBodePlot::markerDataChanged(TraceMarker *m)
|
|||||||
triggerReplot();
|
triggerReplot();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TraceBodePlot::clicked(const QPointF pos)
|
||||||
|
{
|
||||||
|
auto clickPoint = drawPicker->plotToPixel(pos);
|
||||||
|
unsigned int closestDistance = numeric_limits<unsigned int>::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());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,22 @@
|
|||||||
#include <qwt_series_data.h>
|
#include <qwt_series_data.h>
|
||||||
#include <qwt_plot_marker.h>
|
#include <qwt_plot_marker.h>
|
||||||
|
|
||||||
|
#include <qwt_plot_picker.h>
|
||||||
|
|
||||||
|
// 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
|
class TraceBodePlot : public TracePlot
|
||||||
{
|
{
|
||||||
friend class BodeplotAxisDialog;
|
friend class BodeplotAxisDialog;
|
||||||
@ -39,6 +55,9 @@ private slots:
|
|||||||
void markerAdded(TraceMarker *m) override;
|
void markerAdded(TraceMarker *m) override;
|
||||||
void markerRemoved(TraceMarker *m) override;
|
void markerRemoved(TraceMarker *m) override;
|
||||||
void markerDataChanged(TraceMarker *m);
|
void markerDataChanged(TraceMarker *m);
|
||||||
|
|
||||||
|
void clicked(const QPointF pos);
|
||||||
|
void moved(const QPointF pos);
|
||||||
private:
|
private:
|
||||||
QString AxisTypeToName(YAxisType type);
|
QString AxisTypeToName(YAxisType type);
|
||||||
void enableTraceAxis(Trace *t, int axis, bool enabled);
|
void enableTraceAxis(Trace *t, int axis, bool enabled);
|
||||||
@ -71,6 +90,8 @@ private:
|
|||||||
QwtPlot *plot;
|
QwtPlot *plot;
|
||||||
TraceMarker *selectedMarker;
|
TraceMarker *selectedMarker;
|
||||||
QwtPlotCurve *selectedCurve;
|
QwtPlotCurve *selectedCurve;
|
||||||
|
|
||||||
|
BodeplotPicker *drawPicker;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TRACEBODEPLOT_H
|
#endif // TRACEBODEPLOT_H
|
||||||
|
Loading…
Reference in New Issue
Block a user