]> Shamusworld >> Repos - architektonas/blobdiff - src/dimension.cpp
Fixed missing edge cases in line to line intersection function.
[architektonas] / src / dimension.cpp
index c9777e50bd673688bc5d06dee646c6a4753cd19d..27823b39135fb8f7f7ed87f4d482476672a42b19 100644 (file)
@@ -20,7 +20,7 @@
 #include "painter.h"
 
 
-Dimension::Dimension(Vector p1, Vector p2, DimensionType dt/*= DTLinear*/ ,Object * p/*= NULL*/):
+Dimension::Dimension(Vector p1, Vector p2, DimensionType dt/*= DTLinear*/Object * p/*= NULL*/):
        Object(p1, p), endpoint(p2),
        dragging(false), draggingHandle1(false), draggingHandle2(false),
        length(p2.Magnitude()), dimensionType(dt), size(0.25), point1(NULL), point2(NULL)
@@ -31,7 +31,7 @@ Dimension::Dimension(Vector p1, Vector p2, DimensionType dt/*= DTLinear*/ ,Objec
 
 
 // This is bad, p1 & p2 could be NULL, causing much consternation...
-Dimension::Dimension(Connection p1, Connection p2, DimensionType dt/*= DTLinear*/ , Object * p/*= NULL*/):
+Dimension::Dimension(Connection p1, Connection p2, DimensionType dt/*= DTLinear*/, Object * p/*= NULL*/):
        dragging(false), draggingHandle1(false), draggingHandle2(false),
        length(0), dimensionType(dt), size(0.25), point1(p1), point2(p2)
 {
@@ -61,6 +61,7 @@ all objects move as a unified whole.
 
 /*virtual*/ void Dimension::Draw(Painter * painter)
 {
+#if 0
        // If there are valid Vector pointers in here, use them to update the internal
        // positions. Otherwise, we just use the internal positions by default.
        if (point1.object)
@@ -68,6 +69,7 @@ all objects move as a unified whole.
 
        if (point2.object)
                endpoint = point2.object->GetPointAtParameter(point2.t);
+#endif
 
        painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DotLine));
 
@@ -76,9 +78,9 @@ all objects move as a unified whole.
 
        if ((state == OSSelected) || ((state == OSInactive) && hitPoint2))
                painter->DrawHandle(endpoint);
-#if 0
+#if 1
        if (state == OSSelected)
-               painter->SetPen(QPen(Qt::red, 2.0, Qt::DotLine));
+               painter->SetPen(QPen(Qt::cyan, 1.0 * Painter::zoom * size, Qt::SolidLine));
        else
 //             painter->SetPen(QPen(Qt::blue, 1.0, Qt::SolidLine));
 #endif
@@ -217,44 +219,18 @@ I believe they are pixels.
 
 /*virtual*/ void Dimension::PointerMoved(Vector point)
 {
-#if 0
-       // We know this is true because mouse move messages don't come here unless
-       // the object was actually clicked on--therefore we *know* we're being
-       // dragged...
-       objectWasDragged = true;
-
-/*     if (dragging)
-       {
-               // Here we need to check whether or not we're dragging a handle or the object itself...
-               Vector delta = point - oldPoint;
-
-               position += delta;
-               endpoint += delta;
-
-               oldPoint = point;
-               needUpdate = true;
-       }
-       else*/ if (draggingHandle1)
+       if (selectionInProgress)
        {
-               Vector delta = point - oldPoint;
-
-               position += delta;
+               // Check for whether or not the rect contains this line
+               if (selection.contains(position.x, position.y)
+                       && selection.contains(endpoint.x, endpoint.y))
+                       state = OSSelected;
+               else
+                       state = OSInactive;
 
-               oldPoint = point;
-               needUpdate = true;
+               return;
        }
-       else if (draggingHandle2)
-       {
-               Vector delta = point - oldPoint;
-
-               endpoint += delta;
 
-               oldPoint = point;
-               needUpdate = true;
-       }
-       else
-               needUpdate = false;
-#else
        // Hit test tells us what we hit (if anything) through boolean variables. (It
        // also tells us whether or not the state changed. --not any more)
        SaveHitState();
@@ -276,7 +252,6 @@ I believe they are pixels.
                oldPoint = point;
                needUpdate = true;
        }
-#endif
 }
 
 
@@ -402,6 +377,17 @@ same reference number.
 }
 
 
+/*virtual*/ void Dimension::MovePointAtParameter(double parameter, Vector v)
+{
+       if (parameter == 0)
+               position += v;
+       else if (parameter == 1.0)
+               endpoint += v;
+       else
+               {} // Not sure how to handle this case :-P
+}
+
+
 /*virtual*/ void Dimension::Connect(Object * obj, double param)
 {
        // There are four possibilities here...