]> Shamusworld >> Repos - architektonas/blobdiff - src/line.cpp
Added layer attribute to load/save code.
[architektonas] / src / line.cpp
index a3d745aa3da32908a53b3f45c47d6076af07ef24..7085308f9fe12eb2e3687f3469e23fde2b2971fb 100644 (file)
@@ -75,49 +75,41 @@ Line::~Line()
                Vector current(point2 - point1);
                Vector v = current.Unit() * length;
                Vector v2 = point1 + v;
-//             painter->DrawLine((int)point1.x, (int)point1.y, (int)v2.x, (int)v2.y);
                painter->DrawLine(point1, v2);
 
                if (current.Magnitude() > length)
                {
                        painter->SetPen(QPen(QColor(128, 0, 0), 1.0, Qt::DashLine));
-//                     painter->DrawLine((int)v2.x, (int)v2.y, (int)point2.x, (int)point2.y);
                        painter->DrawLine(v2, point2);
                }
        }
-// Problem: when drawing at large zoom levels, this throws away precision thus
-//          causing the line to rendered too short. !!! FIX !!! [DONE]
        else
-//             painter->DrawLine((int)position.x, (int)position.y, (int)endpoint.x, (int)endpoint.y);
                painter->DrawLine(position, endpoint);
 
-       // If we're rotating or setting the span, draw an information panel
-       // showing both absolute and relative angles being set.
+       // If we're dragging an endpoint, draw an information panel showing both
+       // the length and angle being set.
        if (draggingHandle1 || draggingHandle2)
        {
                double absAngle = (Vector(endpoint - position).Angle()) * RADIANS_TO_DEGREES;
-//             double relAngle = (startAngle >= oldAngle ? startAngle - oldAngle :
-//                     startAngle - oldAngle + (2.0 * PI)) * RADIANS_TO_DEGREES;
                double absLength = Vector(position - endpoint).Magnitude();
 
-               QString text;
-
-               text = QObject::tr("Length: %1 in.\n") + QChar(0x2221) + QObject::tr(": %2");
+               QString text = QObject::tr("Length: %1 in.\n") + QChar(0x2221) + QObject::tr(": %2");
                text = text.arg(absLength).arg(absAngle);
-
+#if 0
                QPen pen = QPen(QColor(0x00, 0xFF, 0x00), 1.0, Qt::SolidLine);
                painter->SetPen(pen);
                painter->SetBrush(QBrush(QColor(0x40, 0xFF, 0x40, 0x9F)));
-               QRectF textRect(10.0, 10.0, 270.0, 70.0);       // x, y, w, h
+               QRectF textRect(10.0, 10.0, 270.0, 70.0);       // x, y, w, h (in Qt coords)
                painter->DrawRoundedRect(textRect, 7.0, 7.0);
 
                textRect.setLeft(textRect.left() + 14);
                painter->SetFont(*Object::font);
-//                     pen = QPen(QColor(0xDF, 0x5F, 0x00), 1.0, Qt::SolidLine);
                pen = QPen(QColor(0x00, 0x5F, 0xDF));
                painter->SetPen(pen);
                painter->DrawText(textRect, Qt::AlignVCenter, text);
-//             painter->SetPen(QPen(QColor(0xDF, 0x5F, 0x00)));
+#else
+               painter->DrawInformativeText(text);
+#endif
        }
 }
 
@@ -132,11 +124,15 @@ Line::~Line()
 {
        // We can assume this, since this is a mouse down event here.
        objectWasDragged = false;
-       SaveState();
        HitTest(point);
-//     return StateChanged();
+
+       // Now that we've done our hit testing on the non-snapped point, snap it if
+       // necessary...
+       if (snapToGrid)
+               point = SnapPointToGrid(point);
 
 // this is shite. this should be checked for in the Container, not here!
+#warning "!!! This should be checked for in Container, not here !!!"
        // If we're part of a non-top-level container, send this signal to it
        if (parent->type == OTContainer && !((Container *)parent)->isTopLevelContainer
                && (hitLine || hitPoint1 || hitPoint2))
@@ -218,28 +214,26 @@ a dimension only) Draw() function... :-/
                }
        }
 
-
        if (state == OSInactive)
        {
-//printf("Line: pp = %lf, length = %lf, distance = %lf\n", parameterizedPoint, lineSegment.Magnitude(), distance);
-//printf("      v1.Magnitude = %lf, v2.Magnitude = %lf\n", v1.Magnitude(), v2.Magnitude());
-//printf("      point = %lf,%lf,%lf; p1 = %lf,%lf,%lf; p2 = %lf,%lf,%lf\n", point.x, point.y, point.z, position.x, position.y, position.z, endpoint.x, endpoint.y, endpoint.z);
-//printf("      \n", );
 //How to translate this into pixels from Document space???
-//Maybe we need to pass a scaling factor in here from the caller? That would make sense, as
-//the caller knows about the zoom factor and all that good kinda crap
-//I think what's needed is an Object class variable/method that can be changed by the TLC and
-//called in derived classes to properly scale the location to the current zoom level. That *should* work.
-
-// ALSO: Need to code a global (read: Object class) variable that tells use whether a modifier
-//       key was pressed in addition to the mouse click, so we can do stuff like, say, hold
-//       down CTRL and be able to do multiple selecting of objects (in that case, we would
-//       keep the Object state from changing).
+//Maybe we need to pass a scaling factor in here from the caller? That would
+//make sense, as the caller knows about the zoom factor and all that good kinda
+//crap
+//I think what's needed is an Object class variable/method that can be changed
+//by the TLC and called in derived classes to properly scale the location to
+//the current zoom level. That *should* work.
+
+// ALSO: Need to code a global (read: Object class) variable that tells use
+//       whether a modifier key was pressed in addition to the mouse click, so
+//       we can do stuff like, say, hold down CTRL and be able to do multiple
+//       selecting of objects (in that case, we would keep the Object state
+//       from changing).
                if (hitPoint1)
                {
                        oldState = state;
                        state = OSSelected;
-                       oldPoint = position; //maybe "position"?
+                       oldPoint = position;
                        draggingHandle1 = true;
                        return true;
                }
@@ -247,7 +241,7 @@ a dimension only) Draw() function... :-/
                {
                        oldState = state;
                        state = OSSelected;
-                       oldPoint = endpoint; //maybe "position"?
+                       oldPoint = endpoint;
                        draggingHandle2 = true;
                        return true;
                }
@@ -262,12 +256,6 @@ a dimension only) Draw() function... :-/
        }
        else if (state == OSSelected)
        {
-               // Here we test for collision with handles as well! (SOON!) [I think it works...NOPE]
-/*
-Like so:
-               if (v1.Magnitude() < 2.0) // Handle #1
-               else if (v2.Magnitude() < 2.0) // Handle #2
-*/
                if (hitLine)
                {
                        oldState = state;
@@ -317,9 +305,9 @@ Like so:
 
        // 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)
-       SaveState();
+       SaveHitState();
        HitTest(point);
-       needUpdate = StateChanged();
+       needUpdate = HitStateChanged();
 
        objectWasDragged = (draggingLine | draggingHandle1 | draggingHandle2);
 
@@ -451,7 +439,7 @@ the horizontal line or vertical line that intersects from the current mouse posi
 
 /*virtual*/ bool Line::HitTest(Point point)
 {
-//     SaveState();
+//     SaveHitState();
 
        hitPoint1 = hitPoint2 = hitLine = false;
        Vector lineSegment = endpoint - position;
@@ -501,8 +489,8 @@ the horizontal line or vertical line that intersects from the current mouse posi
        else if ((distance * Painter::zoom) < 5.0)
                hitLine = true;
 
-       return (hitPoint1 | hitPoint2 | hitLine ? true : false);
-//     return StateChanged();
+       return (hitPoint1 || hitPoint2 || hitLine ? true : false);
+//     return HitStateChanged();
 }
 
 
@@ -521,7 +509,7 @@ the horizontal line or vertical line that intersects from the current mouse posi
 
 /*virtual*/ void Line::Enumerate(FILE * file)
 {
-       fprintf(file, "LINE (%lf,%lf) (%lf,%lf)\n", position.x, position.y, endpoint.x, endpoint.y);
+       fprintf(file, "LINE %i (%lf,%lf) (%lf,%lf)\n", layer, position.x, position.y, endpoint.x, endpoint.y);
 }
 
 
@@ -640,7 +628,7 @@ Object * Line::FindAttachedDimension(void)
 }
 
 
-void Line::SaveState(void)
+void Line::SaveHitState(void)
 {
        oldHitPoint1 = hitPoint1;
        oldHitPoint2 = hitPoint2;
@@ -648,7 +636,7 @@ void Line::SaveState(void)
 }
 
 
-bool Line::StateChanged(void)
+bool Line::HitStateChanged(void)
 {
        if ((hitPoint1 != oldHitPoint1) || (hitPoint2 != oldHitPoint2) || (hitLine != oldHitLine))
                return true;