-
-//// 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;
- update();
-#ifdef DEBUGFOO
-WriteLogMsg(" --> [# polys: %u, # points: %u]\n", pts.GetNumPolys(), pts.GetNumPoints());
-#endif
- }
- else if (tool == TOOLSelect || tool == TOOLPolySelect)
- {
- if (pts.GetNumPoints() > 0)
- {
- pt = GetAdjustedClientPosition(pts.GetX(ptHighlight), pts.GetY(ptHighlight));
-//printf("GetAdjustedClientPosition = %i, %i\n", pt.x(), pt.y());
-// WarpPointer(pt.x, pt.y);
- QCursor::setPos(mapToGlobal(pt));
-
- if (event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier)
- {
- pts.SetOnCurve(ptHighlight, !pts.GetOnCurve(ptHighlight));
- update();
- }
- }
- }
- else if (tool == TOOLDelPt)
- {
- if (pts.GetNumPoints() > 0)
-//Or could use:
-// if (ptHighlight != -1)
- {
-//This assumes that WM_MOUSEMOVE happens before this!
-//The above commented out line should take care of this contingency... !!! FIX !!!
- pts.DeletePoint(ptHighlight);
- update();
- }
- }
- }
-
- event->accept();
-}
-
-void DrawingView::mouseMoveEvent(QMouseEvent * event)
-{
- if (event->buttons() == Qt::RightButton)
- {
- ToolType newTool = toolPalette->FindSelectedTool();
-
- if (newTool != toolPalette->prevTool)
- {
- toolPalette->prevTool = newTool;
- toolPalette->repaint();
- }
- }
- else if (event->buttons() == Qt::MidButton)
- {
- // Calc offset from previous point
- pt = event->pos();
- ptOffset = QPoint(pt.x() - ptPrevious.x(), pt.y() - ptPrevious.y());
-
-// Then multiply it by the scaling factor. Whee!
- // This looks wacky because we're using screen coords for the offset...
- // Otherwise, we would subtract both offsets!
- offsetX -= ptOffset.x(), offsetY += ptOffset.y();
- update();
- ptPrevious = pt;
- }
- else if (event->buttons() == Qt::LeftButton)
- {
-#if 0
- if (tool == TOOLScroll)
- {
- // Extract current point from lParam/calc offset from previous point
-
- pt = e.GetPosition();
- ptOffset.x = pt.x - ptPrevious.x,
- ptOffset.y = pt.y - ptPrevious.y;
-
- // NOTE: OffsetViewportOrg operates in DEVICE UNITS...
-
-//Seems there's no equivalent for this in wxWidgets...!
-//!!! FIX !!!
-// hdc = GetDC(hWnd);
-// OffsetViewportOrgEx(hdc, ptOffset.x, ptOffset.y, NULL);
-// ReleaseDC(hWnd, hdc);
-
-// this shows that it works, so the logic above must be faulty...
-// And it is. It should convert the coords first, then do the subtraction to figure the offset...
-// Above: DONE
-// Then multiply it by the scaling factor. Whee!
- // This looks wacky because we're using screen coords for the offset...
- // Otherwise, we would subtract both offsets!
- offsetX -= ptOffset.x, offsetY += ptOffset.y;
- Refresh();
- }
- else
-#endif
- if (tool == TOOLAddPt || tool == TOOLAddPoly || tool == TOOLSelect)
- {
- if (tool != TOOLAddPt || pts.GetNumPoints() > 0)//yecch.
- {
-//temporary, for testing. BTW, Select drag bug is here...!
-#if 1
- QPoint pt2 = GetAdjustedMousePosition(event);
- pts.SetXY(ptHighlight, pt2.x(), pt2.y());
- update();
-#endif
- }
- }
- else if (tool == TOOLPolySelect)
- {
- if (pts.GetNumPoints() > 0)
- {
- QPoint pt2 = GetAdjustedMousePosition(event);
- // Should also set onCurve here as well, depending on keystate
-//Or should we?
- pts.OffsetPoly(pts.GetPoly(ptHighlight), pt2.x() - pts.GetX(ptHighlight), pt2.y() - pts.GetY(ptHighlight));
- update();
- }
- }
- }
- else if (event->buttons() == Qt::NoButton)