]> Shamusworld >> Repos - architektonas/blobdiff - src/drawingview.cpp
Fixes for the Layer widget.
[architektonas] / src / drawingview.cpp
index fff56da8ef77bbd2e78a0f28a0278d82339fad4e..54e3b342daf6c26b45fd5214f72c92d3a1bcb8db 100644 (file)
@@ -49,8 +49,8 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent),
        useAntialiasing(true), numSelected(0), numHovered(0), shiftDown(false),
        ctrlDown(false),
        gridBackground(BACKGROUND_MAX_SIZE, BACKGROUND_MAX_SIZE),
-       scale(1.0), offsetX(-10), offsetY(-10),// document(Vector(0, 0)),
-       gridPixels(0), collided(false)//, toolAction(NULL)
+       scale(1.0), offsetX(-10), offsetY(-10),
+       gridPixels(0), collided(false), hoveringIntersection(false)
 {
 //     document.isTopLevelContainer = true;
 //wtf? doesn't work except in c++11??? document = { 0 };
@@ -324,6 +324,9 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/)
                painter.DrawRect(Global::selection);
        }
 
+       if (hoveringIntersection)
+               painter.DrawHandle(intersectionPoint);
+
        if (!informativeText.isEmpty())
                painter.DrawInformativeText(informativeText);
 }
@@ -689,7 +692,7 @@ void DrawingView::ToolDraw(Painter * painter)
                {
                        if (toolPoint[0] == toolPoint[1])
                                return;
-                       
+
                        painter->DrawLine(toolPoint[0], toolPoint[1]);
                        // Likely we need a tool container for this... (now we do!)
 #if 0
@@ -704,7 +707,6 @@ void DrawingView::ToolDraw(Painter * painter)
 #endif
 
                        double absAngle = (Vector(toolPoint[1] - toolPoint[0]).Angle()) * RADIANS_TO_DEGREES;
-
                        QString text = QChar(0x2221) + QObject::tr(": %1");
                        informativeText = text.arg(absAngle);
 
@@ -723,7 +725,9 @@ void DrawingView::ToolDraw(Painter * painter)
                        if (toolPoint[0] == toolPoint[1])
                                return;
                        
-                       painter->DrawLine(toolPoint[0], toolPoint[1]);
+                       Point mirrorPoint = toolPoint[0] + Vector(toolPoint[1], toolPoint[0]);
+//                     painter->DrawLine(toolPoint[0], toolPoint[1]);
+                       painter->DrawLine(mirrorPoint, toolPoint[1]);
                        // Likely we need a tool container for this... (now we do!)
 #if 0
                        if (ctrlDown)
@@ -738,6 +742,9 @@ void DrawingView::ToolDraw(Painter * painter)
 
                        double absAngle = (Vector(toolPoint[1] - toolPoint[0]).Angle()) * RADIANS_TO_DEGREES;
 
+                       if (absAngle > 180.0)
+                               absAngle -= 180.0;
+
                        QString text = QChar(0x2221) + QObject::tr(": %1");
                        informativeText = text.arg(absAngle);
 
@@ -1045,10 +1052,7 @@ void DrawingView::MirrorHandler(int mode, Point p)
 
                                if (obj.type == OTArc)
                                {
-#if 0
-                                       // This is WRONG for mirroring...
-                                       obj2->angle[0] = obj.angle[0] + angle;
-#endif
+                                       // This is 2*mirror angle - obj angle - obj span
                                        obj2->angle[0] = (2.0 * angle) - obj.angle[0] - obj.angle[1];
 
                                        if (obj2->angle[0] > PI_TIMES_2)
@@ -1173,6 +1177,7 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event)
        Global::selection.setBottomRight(QPointF(point.x, point.y));
        // Only needs to be done here, as mouse down is always preceded by movement
        Global::snapPointIsValid = false;
+       hoveringIntersection = false;
 
        // Scrolling...
        if (event->buttons() & Qt::MiddleButton)
@@ -1215,6 +1220,26 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event)
        // Do object hit testing...
        bool needUpdate = HitTestObjects(point);
 
+       // Check for multi-hover...
+       if (numHovered > 1)
+       {
+               GetHovered(hover);
+
+               double t, u;
+               int numIntersecting = Geometry::Intersects((Object *)hover[0], (Object *)hover[1], &t, &u);
+
+               if (numIntersecting > 0)
+               {
+                       Vector v1 = Geometry::GetPointForParameter((Object *)hover[0], t);
+                       Vector v2 = Geometry::GetPointForParameter((Object *)hover[1], u);
+                       QString text = tr("Intersection t=%1 (%3, %4), u=%2 (%5, %6)");
+                       informativeText = text.arg(t).arg(u).arg(v1.x).arg(v1.y).arg(v2.x).arg(v2.y);
+
+                       hoveringIntersection = true;
+                       intersectionPoint = v1;
+               }
+       }
+
        // Do tool handling, if any are active...
        if (Global::tool)
        {