]> Shamusworld >> Repos - architektonas/commitdiff
Added ability to create Circles.
authorShamus Hammons <jlhamm@acm.org>
Sat, 9 May 2015 14:26:43 +0000 (09:26 -0500)
committerShamus Hammons <jlhamm@acm.org>
Sat, 9 May 2015 14:26:43 +0000 (09:26 -0500)
src/drawingview.cpp
src/drawingview.h

index f253bd9064ee17367a95b87b8e74991a7bbcf984..16280d6e9802e1d5132d931164e908d76b6a517a 100644 (file)
@@ -308,9 +308,6 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/)
        // Do object rendering...
        RenderObjects(&painter, document.objects);
 
-       if (!informativeText.isEmpty())
-               painter.DrawInformativeText(informativeText);
-
        // Do tool rendering, if any...
        if (Global::tool)
        {
@@ -326,6 +323,9 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/)
                painter.SetBrush(QBrush(QColor(255, 127, 0, 100)));
                painter.DrawRect(Global::selection);
        }
+
+       if (!informativeText.isEmpty())
+               painter.DrawInformativeText(informativeText);
 }
 
 
@@ -569,6 +569,8 @@ void DrawingView::ToolHandler(int mode, Point p)
 {
        if (Global::tool == TTLine)
                LineHandler(mode, p);
+       else if (Global::tool == TTCircle)
+               CircleHandler(mode, p);
        else if (Global::tool == TTRotate)
                RotateHandler(mode, p);
 }
@@ -595,8 +597,28 @@ void DrawingView::ToolDraw(Painter * painter)
                        double absAngle = v.Angle() * RADIANS_TO_DEGREES;
                        double absLength = v.Magnitude();
                        QString text = tr("Length: %1 in.\n") + QChar(0x2221) + tr(": %2");
-                       text = text.arg(absLength).arg(absAngle);
-                       painter->DrawInformativeText(text);
+                       informativeText = text.arg(absLength).arg(absAngle);
+               }
+       }
+       else if (Global::tool == TTCircle)
+       {
+               if (Global::toolState == TSNone)
+               {
+                       painter->DrawHandle(toolPoint[0]);
+               }
+               else if ((Global::toolState == TSPoint2) && shiftDown)
+               {
+                       painter->DrawHandle(toolPoint[1]);
+               }
+               else
+               {
+                       double length = Vector::Magnitude(toolPoint[0], toolPoint[1]);
+//                     painter->DrawLine(toolPoint[0], toolPoint[1]);
+//                     painter->DrawHandle(toolPoint[1]);
+                       painter->SetBrush(QBrush(Qt::NoBrush));
+                       painter->DrawEllipse(toolPoint[0], length, length);
+                       QString text = tr("Radius: %1 in.");//\n") + QChar(0x2221) + tr(": %2");
+                       informativeText = text.arg(length);//.arg(absAngle);
                }
        }
        else if (Global::tool == TTRotate)
@@ -626,12 +648,12 @@ void DrawingView::ToolDraw(Painter * painter)
                        double absAngle = (Vector(toolPoint[1] - toolPoint[0]).Angle()) * RADIANS_TO_DEGREES;
 
                        QString text = QChar(0x2221) + QObject::tr(": %1");
-                       text = text.arg(absAngle);
+                       informativeText = text.arg(absAngle);
 
                        if (ctrlDown)
-                               text += " (Copy)";
+                               informativeText += " (Copy)";
 
-                       painter->DrawInformativeText(text);
+//                     painter->DrawInformativeText(text);
                }
        }
 }
@@ -678,6 +700,49 @@ void DrawingView::LineHandler(int mode, Point p)
 }
 
 
+void DrawingView::CircleHandler(int mode, Point p)
+{
+       switch (mode)
+       {
+       case ToolMouseDown:
+               if (Global::toolState == TSNone)
+                       toolPoint[0] = p;
+               else
+                       toolPoint[1] = p;
+
+               break;
+       case ToolMouseMove:
+               if (Global::toolState == TSNone)
+                       toolPoint[0] = p;
+               else
+                       toolPoint[1] = p;
+
+               break;
+       case ToolMouseUp:
+               if (Global::toolState == TSNone)
+               {
+                       Global::toolState = TSPoint2;
+                       // Prevent spurious line from drawing...
+                       toolPoint[1] = toolPoint[0];
+               }
+               else if ((Global::toolState == TSPoint2) && shiftDown)
+               {
+                       // Key override is telling us to make a new line, not continue the
+                       // previous one.
+                       toolPoint[0] = toolPoint[1];
+               }
+               else
+               {
+                       double length = Vector::Magnitude(toolPoint[0], toolPoint[1]);
+                       Circle * c = new Circle(toolPoint[0], length);
+                       document.objects.push_back(c);
+                       toolPoint[0] = toolPoint[1];
+                       Global::toolState = TSNone;
+               }
+       }
+}
+
+
 void DrawingView::RotateHandler(int mode, Point p)
 {
        switch (mode)
@@ -940,9 +1005,8 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event)
                                select.push_back(*i);
 
 //hmm, this is no good, too late to do any good :-P
-//                             if ((*i)->hovered)
-//                                     hover.push_back(*i);
-//                     }
+//                     if ((*i)->hovered)
+//                             hover.push_back(*i);
                }
        }
        else if (event->button() == Qt::MiddleButton)
index 162e9686b416d330eeaafe745b7043bb519c316b..c8e46ff627fe6fb70be0d860bbca4efa2c910ce8 100644 (file)
@@ -27,6 +27,7 @@ class DrawingView: public QWidget
                void ToolHandler(int, Point);
                void ToolDraw(Painter *);
                void LineHandler(int, Point);
+               void CircleHandler(int, Point);
                void RotateHandler(int, Point);
                void CheckObjectBounds(void);
                bool HitTestObjects(Point);