diff --git a/scalepicker.cpp b/scalepicker.cpp --- a/scalepicker.cpp +++ b/scalepicker.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "scalepicker.h" @@ -29,6 +30,8 @@ // minimum size for pick (in pixels) #define MIN_PICK_SIZE (2) +#define SNAP_DISTANCE (5) + class PlotOverlay : public QwtWidgetOverlay { public: @@ -94,9 +97,22 @@ bool ScalePicker::eventFilter(QObject* o event->type() == QEvent::MouseButtonRelease || event->type() == QEvent::MouseMove) { + updateSnapPoints(); + QMouseEvent* mouseEvent = (QMouseEvent*) event; - double pos = this->position(mouseEvent); double posPx = this->positionPx(mouseEvent); + + // do snapping + for (double sp : snapPoints) + { + if (fabs(posPx-sp) <= SNAP_DISTANCE) + { + posPx = sp; + break; + } + } + + double pos = this->position(posPx); currentPosPx = posPx; if (event->type() == QEvent::MouseButtonPress && @@ -204,13 +220,10 @@ void ScalePicker::setPen(QPen pen) _pen = pen; } -double ScalePicker::position(QMouseEvent* mouseEvent) +// convert the position of the click to the plot coordinates +double ScalePicker::position(double posPx) { - double pos; - pos = positionPx(mouseEvent); - // convert the position of the click to the plot coordinates - pos = _scaleWidget->scaleDraw()->scaleMap().invTransform(pos); - return pos; + return _scaleWidget->scaleDraw()->scaleMap().invTransform(posPx); } double ScalePicker::positionPx(QMouseEvent* mouseEvent) @@ -248,3 +261,16 @@ double ScalePicker::posCanvasPx(double p } return pos; } + +void ScalePicker::updateSnapPoints() +{ + auto allTicks = _scaleWidget->scaleDraw()->scaleDiv().ticks(QwtScaleDiv::MajorTick) + + _scaleWidget->scaleDraw()->scaleDiv().ticks(QwtScaleDiv::MediumTick) + + _scaleWidget->scaleDraw()->scaleDiv().ticks(QwtScaleDiv::MinorTick); + + snapPoints.clear(); + for(auto t : allTicks) + { + snapPoints << _scaleWidget->scaleDraw()->scaleMap().transform(t); + } +}