]> Shamusworld >> Repos - architektonas/blobdiff - src/dimension.cpp
Added glue layer to Qt painting, to properly render cartesian coordinates.
[architektonas] / src / dimension.cpp
index b9fc97620d8708afa2cbdd08b1fc1fd38d98dc81..4ccd48e52352e97ad69938f3873b0090221fc11e 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <QtGui>
 #include "mathconstants.h"
+#include "painter.h"
 
 
 Dimension::Dimension(Vector p1, Vector p2, Object * p/*= NULL*/): Object(p1, p), endpoint(p2),
@@ -34,7 +35,7 @@ Dimension::~Dimension()
 {
 }
 
-/*virtual*/ void Dimension::Draw(QPainter * painter)
+/*virtual*/ void Dimension::Draw(Painter * painter)
 {
        // If there are valid Vector pointers in here, use them to update the internal
        // positions. Otherwise, we just use the internal positions by default.
@@ -45,9 +46,9 @@ Dimension::~Dimension()
                endpoint = *point2;
 
        if (state == OSSelected)
-               painter->setPen(QPen(Qt::red, 2.0, Qt::DotLine));
+               painter->SetPen(QPen(Qt::red, 2.0, Qt::DotLine));
        else
-               painter->setPen(QPen(Qt::blue, 1.0, Qt::SolidLine));
+               painter->SetPen(QPen(Qt::blue, 1.0, Qt::SolidLine));
 
        // Draw an aligned dimension line
        double angle = Vector(endpoint - position).Angle();
@@ -60,7 +61,7 @@ Dimension::~Dimension()
        Point p2 = endpoint + (orthogonal * 10.0);
 
        // Draw main dimension line
-       painter->drawLine(QPointF(p1.x, p1.y), QPointF(p2.x, p2.y));
+       painter->DrawLine(p1, p2);
 
        Point p3 = position + (orthogonal * 16.0);
        Point p4 = endpoint + (orthogonal * 16.0);
@@ -68,16 +69,18 @@ Dimension::~Dimension()
        Point p6 = endpoint + (orthogonal * 4.0);
 
        // Draw extension lines
-       painter->drawLine(QPointF(p3.x, p3.y), QPointF(p5.x, p5.y));
-       painter->drawLine(QPointF(p4.x, p4.y), QPointF(p6.x, p6.y));
+       painter->DrawLine(p3, p5);
+       painter->DrawLine(p4, p6);
 
        // Draw length of dimension line...
-       painter->setFont(QFont("Arial", 10));
+       painter->SetFont(QFont("Arial", 10));
        Vector v1((p1.x - p2.x) / 2.0, (p1.y - p2.y) / 2.0);
        Point ctr = p2 + v1;
+       // This is in pixels, which isn't even remotely correct... !!! FIX !!!
        QString dimText = QString("%1\"").arg(Vector(endpoint - position).Magnitude());
-       int textWidth = QFontMetrics(painter->font()).width(dimText);
-       int textHeight = QFontMetrics(painter->font()).height();
+//     int textWidth = QFontMetrics(painter->font()).width(dimText);
+//     int textHeight = QFontMetrics(painter->font()).height();
+#if 0
 //We have to do transformation voodoo to make the text come out readable and in correct orientation...
 //Some things to note here: if angle > 90 degrees, then we need to take the negative of the angle
 //for our text.
@@ -98,11 +101,17 @@ painter->scale(1.0, -1.0);
 //painter->translate(-textWidth / 2, -24);
 //     painter->drawText(0, 0, textWidth, 20, Qt::AlignCenter, dimText);
        // This version draws the y-coord from the baseline of the font
-       painter->drawText(-textWidth / 2, yOffset, dimText);
+       painter->DrawText(-textWidth / 2, yOffset, dimText);
 //painter->setPen(QPen(QColor(0xFF, 0x20, 0x20), 1.0, Qt::SolidLine));
 //painter->drawLine(20, 0, -20, 0);
 //painter->drawLine(0, 20, 0, -20);
 painter->restore();
+#else
+//     painter->DrawText(QRectF(QPointF(ctr.x, ctr.y), QPointF(ctr.x + textWidth, ctr.y + textHeight)), Qt::AlignVCenter, dimText);
+// Now that we've taken our own good advice, maybe we should have the painter class
+// do a nice abstracted text draw routine? :-)
+       painter->DrawAngledText(ctr, angle, dimText);
+#endif
 
 /*
 All of the preceeding makes me think that rather than try to compensate for Qt's unbelieveably