X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Farc.cpp;h=f5078694d9a27a425b93ab98aca044997cf4248d;hb=7f3a6b11585376eecd80979ec3da2346c5314d88;hp=36245b43dc70a2f3cdf160ca80155384bfcddfe2;hpb=4d6ba8a6eb781dbee818b6a55d21df7b52468936;p=architektonas diff --git a/src/arc.cpp b/src/arc.cpp index 36245b4..f507869 100644 --- a/src/arc.cpp +++ b/src/arc.cpp @@ -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. @@ -216,7 +219,7 @@ so let's do like this: } -/*virtual*/ void Arc::PointerMoved(Vector point) +/*virtual*/ bool Arc::PointerMoved(Vector point) { // one other thing to check here for is if a modifier key is being held as well, // to allow for multi-selection @@ -229,7 +232,7 @@ so let's do like this: else state = OSInactive; - return; + return false; } // The TLC will send these messages if the object is selected but not clicked on. @@ -239,8 +242,15 @@ so let's do like this: // objectWasDragged = true; // needUpdate = false; SaveHitState(); - HitTest(point); + bool hovered = HitTest(point); needUpdate = HitStateChanged(); + + if (snapToGrid) + point = SnapPointToGrid(point); + + if (snapPointIsValid) + point = snapPoint; + objectWasDragged = (draggingCenter | draggingEdge | draggingRotate | draggingSpan); if (objectWasDragged) @@ -271,6 +281,7 @@ so let's do like this: // Why save this? For rendering code? oldPoint = point; // needUpdate = true; + return hovered; } @@ -323,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); @@ -465,7 +488,7 @@ same reference number. Point c2 = Geometry::RotatePointAroundPoint(angleStartPoint, point, angle); position = c1; - startAngle = Vector(c2, c1).Angle(); + startAngle = Vector(c1, c2).Angle(); }