]> Shamusworld >> Repos - architektonas/blobdiff - src/arc.cpp
Added new triangulation tool, ability to snap to endpoints/intersections.
[architektonas] / src / arc.cpp
index d4d747b7df80d1a3a7dd7cb8c4e1010609e82b7a..f5078694d9a27a425b93ab98aca044997cf4248d 100644 (file)
@@ -168,6 +168,9 @@ Also: should put the snap logic into the Object base class (as a static method).
        if (snapToGrid)
                point = SnapPointToGrid(point);
 
+       if (snapPointIsValid)
+               point = snapPoint;
+
 /*
 State Management:
 We want the arc to go into OSSelected mode if we click on it but don't drag.
@@ -241,6 +244,13 @@ so let's do like this:
        SaveHitState();
        bool hovered = HitTest(point);
        needUpdate = HitStateChanged();
+
+       if (snapToGrid)
+               point = SnapPointToGrid(point);
+
+       if (snapPointIsValid)
+               point = snapPoint;
+
        objectWasDragged = (draggingCenter | draggingEdge | draggingRotate | draggingSpan);
 
        if (objectWasDragged)
@@ -324,14 +334,26 @@ point (to get the correct position).
                hitArc = true;
 #else
        if ((length * Painter::zoom) < 8.0)
+       {
                hitCenter = true;
+               snapPoint = position;
+               snapPointIsValid = true;
+       }
        else if (((fabs(length - radius) * Painter::zoom) < 2.0)
                && AngleInArcSpan(pointerAngle))
                hitArc = true;
        else if ((Vector::Magnitude(handle2, point) * Painter::zoom) < 8.0)
+       {
                hitRotate = true;
+               snapPoint = handle2;
+               snapPointIsValid = true;
+       }
        else if ((Vector::Magnitude(handle3, point) * Painter::zoom) < 8.0)
+       {
                hitSpan = true;
+               snapPoint = handle3;
+               snapPointIsValid = true;
+       }
 #endif
 
        return (hitCenter || hitArc || hitRotate || hitSpan ? true : false);