]> Shamusworld >> Repos - ttedit/blobdiff - src/editwindow.cpp
First stab at showing effect of added points on a given poly.
[ttedit] / src / editwindow.cpp
index 4a3d43f50fc8def35436ee526b222036a837cda0..e4f7d7b81dd47f2e691ff2548042861845573cbf 100644 (file)
@@ -269,46 +269,68 @@ void EditWindow::DrawGlyph(Painter & p, GlyphPoints & glyph)
 }
 
 
+/*
+So, to make it draw the point the pointer is pointing at, we need to do something. Either patch the GlyphPoints to handle it, or insert the point into the GlyphPoints and delete it if the user changes tools. Either way, need
+to change the color of the line(s) drawn to the point to signal to the user
+that it isn't finalized until they click the button.
+*/
 void EditWindow::DrawGlyphPoly(Painter & p, GlyphPoints & glyph, uint16_t poly)
 {
        // Sanity check
        if (glyph.GetNumPoints(poly) < 3)
                return;
 
-       // Initial move: If our start point is on curve, then go to it. Otherwise,
-       // check previous point. If it's on curve, go to it otherwise go the
-       // midpoint between start point and previous (since it's between two curve
-       // control points).
-       IPoint pt = (glyph.GetOnCurve(poly, 0)
-               ? glyph.GetPoint(poly, 0) : (glyph.GetPrevOnCurve(poly, 0)
-                       ? glyph.GetPrevPoint(poly, 0) : glyph.GetMidpointToPrev(poly, 0)));
+       IPoint p1 = glyph.GetPrevPoint(poly, 0);
+       IPoint p2 = glyph.GetPoint(poly, 0);
+
+       // Inject the new poly point into the current polygon
+       if ((tool == TOOLAddPoly) && (poly == (glyph.GetNumPolys() - 1)))
+       {
+               p1 = IPoint(addPoint.x, addPoint.y, addPointOnCurve);
+       }
 
        for(int i=0; i<glyph.GetNumPoints(poly); i++)
        {
-               // If this point and then next are both on curve, we have a line...
-               if (glyph.GetOnCurve(poly, i) && glyph.GetNextOnCurve(poly, i))
-               {
-                       IPoint pt2 = glyph.GetNextPoint(poly, i);
-                       p.DrawLine(pt.x, pt.y, pt2.x, pt2.y);
-                       pt = pt2;
-               }
-               else
+               IPoint p3 = glyph.GetNextPoint(poly, i);
+
+               if ((tool == TOOLAddPoly) && (poly == (glyph.GetNumPolys() - 1))
+                       && (i == (glyph.GetNumPoints(poly) - 1)))
                {
-                       // Skip point if it's on curve (start of curve--it's already
-                       // been plotted so we don't need to handle it...)
-                       if (glyph.GetOnCurve(poly, i))
-                               continue;
-
-                       // We are now guaranteed that we are sitting on a curve control
-                       // point (off curve). Figure the extent of the curve: If the
-                       // following is a curve control point, then use the midpoint to it
-                       // otherwise go to the next point since it's on curve.
-                       IPoint pt2 = (glyph.GetNextOnCurve(poly, i)
-                               ? glyph.GetNextPoint(poly, i) : glyph.GetMidpointToNext(poly, i));
-
-                       p.DrawBezier(pt, glyph.GetPoint(poly, i), pt2);
-                       pt = pt2;
+                       p3 = IPoint(addPoint.x, addPoint.y, addPointOnCurve);
+                       p.SetPen(QPen(Qt::green, 1.0, Qt::SolidLine));
+                       DrawGlyphSegment(p, p1, p2, p3);
+                       p1 = p2;
+                       p2 = p3;
+                       p3 = glyph.GetNextPoint(poly, i);
                }
+
+               DrawGlyphSegment(p, p1, p2, p3);
+
+               p1 = p2;
+               p2 = p3;
+       }
+}
+
+
+//
+// Draw a glyph segment given 3 points
+//
+void EditWindow::DrawGlyphSegment(Painter & p, IPoint p1, IPoint p2, IPoint p3)
+{
+       if (p2.onCurve)
+       {
+               // Skip drawing if the middle point is on curve and the last is off
+               if (p3.onCurve)
+                       p.DrawLine(p2, p3);
+       }
+       else
+       {
+               // The middle point is off curve, and so we need to draw a Bezier curve.
+               // Also, depending on whether or not the previous or follow points are
+               // off curve, we need to draw to the midpoints if so.
+               IPoint mid12 = IPoint((p1.x + p2.x) / 2, (p1.y + p2.y) / 2);
+               IPoint mid23 = IPoint((p2.x + p3.x) / 2, (p2.y + p3.y) / 2);
+               p.DrawBezier((p1.onCurve ? p1 : mid12), p2, (p3.onCurve ? p3 : mid23));
        }
 }
 
@@ -499,7 +521,16 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event)
 
 //                     QPoint pt2 = GetAdjustedMousePosition(event);
                        Vector pt2 = Painter::QtToCartesianCoords(Vector(event->x(), event->y()));
-                       pts.SetXY(ptHighlight, pt2.x, pt2.y);
+
+                       if (tool != TOOLSelect)
+                       {
+                               addPoint = pt2;
+                               // Prolly should move this to the key handlers below...
+                               addPointOnCurve = ((event->modifiers() == Qt::ShiftModifier) || (event->modifiers() == Qt::ControlModifier) ? false : true);
+                       }
+                       else
+                               pts.SetXY(ptHighlight, pt2.x, pt2.y);
+
                        update();
                }
                else if (tool == TOOLPolySelect)
@@ -667,6 +698,11 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event)
                }
 
                ptPrevious = Vector(event->x(), event->y());
+               addPoint = Painter::QtToCartesianCoords(Vector(event->x(), event->y()));
+//             addPointOnCurve = ((event->modifiers() == Qt::ShiftModifier) || (event->modifiers() == Qt::ControlModifier) ? false : true);
+
+               if (tool == TOOLAddPoly)
+                       update();
        }
 
        event->accept();
@@ -753,17 +789,29 @@ void EditWindow::keyPressEvent(QKeyEvent * event)
                pts.SetXY(ptHighlight, pts.GetX(ptHighlight) + 1, pts.GetY(ptHighlight));
        else if (event->key() == Qt::Key_Left)
                pts.SetXY(ptHighlight, pts.GetX(ptHighlight) - 1, pts.GetY(ptHighlight));
+       else if ((event->key() == Qt::Key_Shift) || (event->key() == Qt::Key_Control))
+       {
+               addPointOnCurve = false;
+       }
        else
                return;
 
-       event->accept();
+//     event->accept();
        update();
        ((TTEdit *)qApp)->charWnd->MakePathFromPoints(&pts);
        ((TTEdit *)qApp)->charWnd->update();
 }
 
 
-void EditWindow::keyReleaseEvent(QKeyEvent * /*event*/)
+void EditWindow::keyReleaseEvent(QKeyEvent * event)
 {
+       if ((event->key() == Qt::Key_Shift) || (event->key() == Qt::Key_Control))
+       {
+               addPointOnCurve = true;
+       }
+       else
+               return;
+
+       update();
 }