]> Shamusworld >> Repos - architektonas/blobdiff - src/arc.cpp
Lines respond to mouse movement, added Text rendering.
[architektonas] / src / arc.cpp
index 36245b43dc70a2f3cdf160ca80155384bfcddfe2..6391eaecd0d813cfe14928996025081a9b28ae37 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.
@@ -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);
@@ -345,6 +368,7 @@ point (to get the correct position).
        QPointF p2(cos(end), sin(end));
        QRectF bounds(p1, p2);
 
+#if 0
        // Swap X/Y coordinates if they're backwards...
        if (bounds.left() > bounds.right())
        {
@@ -359,6 +383,9 @@ point (to get the correct position).
                bounds.setBottom(bounds.top());
                bounds.setTop(temp);
        }
+#else
+       bounds = bounds.normalized();
+#endif
 
        // If the end of the arc is before the beginning, add 360 degrees to it
        if (end < start)
@@ -465,7 +492,7 @@ same reference number.
        Point c2 = Geometry::RotatePointAroundPoint(angleStartPoint, point, angle);
 
        position = c1;
-       startAngle = Vector(c2, c1).Angle();
+       startAngle = Vector(c1, c2).Angle();
 }