diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2018-06-23 02:33:32 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2018-06-26 23:03:32 +0200 | 
| commit | d37ce65ef1c224317b26664e0211aa2f82c18099 (patch) | |
| tree | 9ffa0908915befd2707625ef55e8216d1f607914 | |
| parent | c26eeb45c905d985aba199e631651e69fcc10083 (diff) | |
spline/widget: fix drag-too-close handling
Dragging toward adjacent point makes sure it's as close
as allowed.
Work against any remaining cases where points "merged".
| -rw-r--r-- | spline/spline-widget.cpp | 38 | ||||
| -rw-r--r-- | spline/spline.cpp | 1 | 
2 files changed, 19 insertions, 20 deletions
diff --git a/spline/spline-widget.cpp b/spline/spline-widget.cpp index b0300b1a..de8a6fd3 100644 --- a/spline/spline-widget.cpp +++ b/spline/spline-widget.cpp @@ -184,7 +184,7 @@ void spline_widget::drawFunction()  //#define DEBUG_SPLINE  #ifndef DEBUG_SPLINE -    constexpr double step_ = 5; +    constexpr double step_ = 3;      const double maxx = _config->max_input();      const double step = std::fmax(1e-4, step_ / c.x()); @@ -415,36 +415,36 @@ void spline_widget::mouseMoveEvent(QMouseEvent *e)          const double point_closeness_limit = get_closeness_limit();          QPointF new_pt = pixel_to_point(e->localPos());          const QPointF pix = point_to_pixel(new_pt); -        //bool overlap = false; +          const bool has_prev = i > 0, has_next = i + 1 < points.size();          auto check_next = [&] { -            return !has_next || points[i+1].x() - new_pt.x() < point_closeness_limit; +            return points[i+1].x() - new_pt.x() >= point_closeness_limit;          };          auto check_prev = [&] { -            return !has_prev || new_pt.x() - points[i-1].x() < point_closeness_limit; +            return new_pt.x() - points[i-1].x() >= point_closeness_limit;          }; -        const bool status_next = !has_next || !check_next(); -        const bool status_prev = !has_prev || !check_prev(); - -        if (!status_prev) -            new_pt = { points[i-1].x() + point_closeness_limit, new_pt.y() }; - -        if (!status_next) -            new_pt = { points[i+1].x() - point_closeness_limit, new_pt.y() }; - -        if (check_prev() && check_next()) -            new_pt = { points[i].x(), new_pt.y() }; - -        _config->move_point(i, new_pt); +        if (has_prev && !check_prev()) +        { +            new_pt.rx() = points[i-1].x() + point_closeness_limit + 1e-4; +        } -        _draw_function = true; -        repaint(); +        if (has_next && !check_next()) +        { +            new_pt.rx() = points[i+1].x() - point_closeness_limit - 1e-4; +        }          setCursor(Qt::ClosedHandCursor);          show_tooltip(pix.toPoint(), new_pt); + +        if ((!has_prev || check_prev()) && (!has_next || check_next())) +        { +            _config->move_point(i, new_pt); +            _draw_function = true; +            repaint(); +        }      }      else if (sz)      { diff --git a/spline/spline.cpp b/spline/spline.cpp index cb2d5deb..6c3a88bf 100644 --- a/spline/spline.cpp +++ b/spline/spline.cpp @@ -286,7 +286,6 @@ void spline::move_point(int idx, QPointF pt)      if (idx >= 0 && idx < sz)      {          points[idx] = pt; -        // we don't allow points to be reordered, but sort due to possible caller logic error          std::stable_sort(points.begin(), points.end(), sort_fn);          s->points = points;          validp = false;  | 
