diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2015-07-26 10:56:37 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2015-07-26 10:57:53 +0200 |
commit | ce7965303dec1500389fb688c1161f43624a1918 (patch) | |
tree | c24c4f802a343930aa269eaa6338b12f1f7151a1 /qfunctionconfigurator | |
parent | c648c6a6851c567fb461e7b82e3521459dbfd62d (diff) |
qfc: disallow placing new points if too close to existing ones
Diffstat (limited to 'qfunctionconfigurator')
-rw-r--r-- | qfunctionconfigurator/qfunctionconfigurator.cpp | 37 | ||||
-rw-r--r-- | qfunctionconfigurator/qfunctionconfigurator.h | 1 |
2 files changed, 27 insertions, 11 deletions
diff --git a/qfunctionconfigurator/qfunctionconfigurator.cpp b/qfunctionconfigurator/qfunctionconfigurator.cpp index 03d1ab57..31b5023b 100644 --- a/qfunctionconfigurator/qfunctionconfigurator.cpp +++ b/qfunctionconfigurator/qfunctionconfigurator.cpp @@ -218,7 +218,22 @@ void QFunctionConfigurator::mousePressEvent(QMouseEvent *e) } } if (!bTouchingPoint) { - _config->addPoint(pixel_coord_to_point(e->pos())); + bool too_close = false; + const auto pos = e->pos(); + + for (int i = 0; i < points.size(); i++) + { + const QPointF pt = point_to_pixel(points[i]); + const float x = pt.x() - pos.x(); + if (point_closeness_limit * point_closeness_limit >= x * x) + { + too_close = true; + break; + } + } + + if (!too_close) + _config->addPoint(pixel_coord_to_point(e->pos())); } } } @@ -258,8 +273,6 @@ void QFunctionConfigurator::mouseMoveEvent(QMouseEvent *e) QPoint pix = e->pos(); QPointF new_pt = pixel_coord_to_point(pix); - static constexpr int limit = 16; - for (int i = 0; i < 2; i++) { bool bad = false; @@ -267,10 +280,10 @@ void QFunctionConfigurator::mouseMoveEvent(QMouseEvent *e) { auto other = points[moving_control_point_idx+1]; auto other_pix = point_to_pixel(other); - bad = pix.x() + limit > other_pix.x(); + bad = pix.x() + point_closeness_limit > other_pix.x(); if (i == 0 && bad) { - pix.setX(other_pix.x() - limit - 1); + pix.setX(other_pix.x() - point_closeness_limit - 1); new_pt = pixel_coord_to_point(pix); } else @@ -280,10 +293,10 @@ void QFunctionConfigurator::mouseMoveEvent(QMouseEvent *e) { auto other = points[moving_control_point_idx-1]; auto other_pix = point_to_pixel(other); - bad = pix.x() - limit < other_pix.x(); + bad = pix.x() - point_closeness_limit < other_pix.x(); if (i == 0 && bad) { - pix.setX(other_pix.x() + limit + 1); + pix.setX(other_pix.x() + point_closeness_limit + 1); new_pt = pixel_coord_to_point(pix); } else @@ -302,14 +315,16 @@ void QFunctionConfigurator::mouseMoveEvent(QMouseEvent *e) } } else { - bool bTouchingPoint = false; + bool is_on_point = false; for (int i = 0; i < points.size(); i++) { - if ( point_within_pixel(points[i], e->pos() ) ) { - bTouchingPoint = true; + const QPoint pos = e->pos(); + if (point_within_pixel(points[i], pos)) { + is_on_point = true; + break; } } - if ( bTouchingPoint ) { + if (is_on_point) { setCursor(Qt::OpenHandCursor); } else { diff --git a/qfunctionconfigurator/qfunctionconfigurator.h b/qfunctionconfigurator/qfunctionconfigurator.h index 5b75d84d..59c8ffeb 100644 --- a/qfunctionconfigurator/qfunctionconfigurator.h +++ b/qfunctionconfigurator/qfunctionconfigurator.h @@ -49,6 +49,7 @@ protected: void resizeEvent(QResizeEvent *) override; private: void update_range(); + static constexpr int point_closeness_limit = 12; QPointF pixel_coord_to_point (const QPointF& point); QPointF point_to_pixel (const QPointF& point); |