-/*
-TODO:
- o Different colors for polys on selected points
- o Different colors for handles on non-selected polys
- o Line of sight (dashed, dotted) for off-curve points
- o Repaints for press/release of CTRL/SHIFT during point creation
-*/
-void DrawingView::paintEvent(QPaintEvent * /*event*/)
-{
- QPainter p(this);
-//hm, causes lockup
-// p.setRenderHint(QPainter::Antialiasing);
-//Doesn't do crap!
-//dc.SetBackground(*wxWHITE_BRUSH);
-
-// Due to the screwiness of wxWidgets coord system, the origin is ALWAYS
-// the upper left corner--regardless of axis orientation, etc...
-// int width, height;
-// dc.GetSize(&width, &height);
- QSize winSize = size();
-
-// dc.SetDeviceOrigin(-offsetX, height - (-offsetY));
-// dc.SetAxisOrientation(true, true);
- p.translate(QPoint(-offsetX, winSize.height() - (-offsetY)));
- p.scale(1.0, -1.0);
-
-// Scrolling can be done by using OffsetViewportOrgEx
-// Scaling can be done by adjusting SetWindowExtEx (it's denominator of txform)
-// you'd use: % = ViewportExt / WindowExt
-// But it makes the window look like crap: fuggetuboutit.
-// Instead, we have to scale EVERYTHING by hand. Crap!
-// It's not *that* bad, but not as convenient either...
-
-// dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0x00, 0xFF), 1, wxDOT)));
-//// dc.DrawLine(0, 0, 10, 10);
- p.setPen(QPen(Qt::blue, 1.0, Qt::DotLine));
-
- // Draw coordinate axes
-
-// dc.CrossHair(0, 0);
- p.drawLine(0, -16384, 0, 16384);
- p.drawLine(-16384, 0, 16384, 0);
-
- // Draw points
-
- for(int i=0; i<pts.GetNumPoints(); i++)
- {
- if (i == ptHighlight)
- {
-// dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0xFF, 0x00, 0x00), 1, wxSOLID)));
-//// SelectObject(hdc, hRedPen1);
- p.setPen(QPen(Qt::red, 1.0, Qt::SolidLine));
-
- if (pts.GetOnCurve(i))
- {
- DrawSquareDotN(p, pts.GetX(i), pts.GetY(i), 7);
- DrawSquareDotN(p, pts.GetX(i), pts.GetY(i), 9);
- }
- else
- {
- DrawRoundDotN(p, pts.GetX(i), pts.GetY(i), 7);
- DrawRoundDotN(p, pts.GetX(i), pts.GetY(i), 9);
- }
- }
- else if ((i == ptHighlight || i == ptNextHighlight) && tool == TOOLAddPt)
- {
-// dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0xAF, 0x00), 1, wxSOLID)));
-//// SelectObject(hdc, hGreenPen1);
- p.setPen(QPen(Qt::green, 1.0, Qt::SolidLine));
-
- if (pts.GetOnCurve(i))
- {
- DrawSquareDotN(p, pts.GetX(i), pts.GetY(i), 7);
- DrawSquareDotN(p, pts.GetX(i), pts.GetY(i), 9);
- }
- else
- {
- DrawRoundDotN(p, pts.GetX(i), pts.GetY(i), 7);
- DrawRoundDotN(p, pts.GetX(i), pts.GetY(i), 9);
- }
- }
- else
- {
-// dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0x00, 0x00), 1, wxSOLID)));
-//// SelectObject(hdc, hBlackPen1);
- p.setPen(QPen(Qt::black, 1.0, Qt::SolidLine));
-
- if (pts.GetOnCurve(i))
- DrawSquareDot(p, pts.GetX(i), pts.GetY(i));
- else
- DrawRoundDot(p, pts.GetX(i), pts.GetY(i));
- }
-
- if (tool == TOOLDelPt && i == ptHighlight)
- {
-#if 0
- dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0xFF, 0x00, 0x00), 1, wxSOLID)));
-// SelectObject(hdc, hRedPen1);
-// MoveToEx(hdc, pts.GetX(i) - 5, pts.GetY(i) - 5, NULL);
-// LineTo(hdc, pts.GetX(i) + 5, pts.GetY(i) + 5);
-// LineTo(hdc, pts.GetX(i) - 5, pts.GetY(i) - 5);//Lameness!
-// MoveToEx(hdc, pts.GetX(i) - 5, pts.GetY(i) + 5, NULL);
-// LineTo(hdc, pts.GetX(i) + 5, pts.GetY(i) - 5);
-// LineTo(hdc, pts.GetX(i) - 5, pts.GetY(i) + 5);//More lameness!!
-#endif
- p.setPen(QPen(Qt::red, 1.0, Qt::SolidLine));
- p.drawLine(pts.GetX(i) - 5, pts.GetY(i) - 5, pts.GetX(i) + 5, pts.GetY(i) + 5);
- p.drawLine(pts.GetX(i) + 5, pts.GetY(i) - 5, pts.GetX(i) - 5, pts.GetY(i) + 5);
- }
- }
-
-//// SelectObject(hdc, hBlackPen1);
-// dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0x00, 0x00), 1, wxSOLID)));
- p.setPen(QPen(Qt::black, 1.0, Qt::SolidLine));
-
- // Draw curve formed by points
-
- for(int poly=0; poly<pts.GetNumPolys(); poly++)
- {
- if (pts.GetNumPoints(poly) > 2)
- {
- // Initial move...
- // If it's not on curve, then move to it, otherwise move to last point...
-
- int x, y;
-
- if (pts.GetOnCurve(poly, pts.GetNumPoints(poly) - 1))
- x = (int)pts.GetX(poly, pts.GetNumPoints(poly) - 1), y = (int)pts.GetY(poly, pts.GetNumPoints(poly) - 1);
- else
- x = (int)pts.GetX(poly, 0), y = (int)pts.GetY(poly, 0);
-
- for(int i=0; i<pts.GetNumPoints(poly); i++)
- {
- if (pts.GetOnCurve(poly, i))
-// LineTo(hdc, pts.GetX(poly, i), pts.GetY(poly, i));
- {
- p.drawLine(x, y, pts.GetX(poly, i), pts.GetY(poly, i));
- x = (int)pts.GetX(poly, i), y = (int)pts.GetY(poly, i);
- }
- else
- {
- uint32 prev = pts.GetPrev(poly, i), next = pts.GetNext(poly, i);
- float px = pts.GetX(poly, prev), py = pts.GetY(poly, prev),
- nx = pts.GetX(poly, next), ny = pts.GetY(poly, next);
-
- if (!pts.GetOnCurve(poly, prev))
- px = (px + pts.GetX(poly, i)) / 2.0f,
- py = (py + pts.GetY(poly, i)) / 2.0f;
-
- if (!pts.GetOnCurve(poly, next))
- nx = (nx + pts.GetX(poly, i)) / 2.0f,
- ny = (ny + pts.GetY(poly, i)) / 2.0f;
-
- Bezier(p, point(px, py), point(pts.GetX(poly, i), pts.GetY(poly, i)), point(nx, ny));
- x = (int)nx, y = (int)ny;
-
- if (pts.GetOnCurve(poly, next))
- i++; // Following point is on curve, so move past it
- }
- }
- }
- }
-}
-
-void DrawingView::mousePressEvent(QMouseEvent * event)
-{
- if (event->button() == Qt::RightButton)
- {
- toolPalette->move(event->globalPos());
- toolPalette->setVisible(true);
- setCursor(cur[TOOLSelect]);
- toolPalette->prevTool = TOOLSelect;
- }
- else if (event->button() == Qt::MidButton)
- {
- setCursor(cur[2]); // Scrolling cursor
- }
- else if (event->button() == Qt::LeftButton)
- {
- if (tool == TOOLScroll || tool == TOOLZoom)
-;//meh CaptureMouse(); // Make sure we capture the mouse when in scroll/zoom mode
- else if (tool == TOOLAddPt) // "Add Point" tool
- {
- if (pts.GetNumPoints() > 0)
- {
- QPoint pt = GetAdjustedMousePosition(event);
- pts.InsertPoint(pts.GetNext(ptHighlight), pt.x(), pt.y(), ((event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier) ? false : true));
- ptHighlight = ptNextHighlight;
- update();
- }
- }
- else if (tool == TOOLAddPoly) // "Add Poly" tool
- {
-#ifdef DEBUGFOO
-WriteLogMsg("Adding point... # polys: %u, # points: %u", pts.GetNumPolys(), pts.GetNumPoints());
-#endif
- if (polyFirstPoint)
- {
- polyFirstPoint = false;
- pts.AddNewPolyAtEnd();
- }
-
- QPoint pt = GetAdjustedMousePosition(event);
-//printf("GetAdjustedMousePosition = %i, %i\n", pt.x(), pt.y());
- // Append a point to the end of the structure
- pts += IPoint(pt.x(), pt.y(), ((event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier) ? false : true));
- ptHighlight = pts.GetNumPoints() - 1;