X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Feditwindow.cpp;h=85a8ca8d313017942dfba72e0e07eeedb6388563;hb=cf3ec188764cdf34ff3472ee9806aba3a772d2df;hp=f3cc70fdebc03d551e9186fc9efa898b92217202;hpb=0cdf0ebfb4b788156b8eb2c2acadd5f95fe5be26;p=ttedit diff --git a/src/editwindow.cpp b/src/editwindow.cpp index f3cc70f..85a8ca8 100755 --- a/src/editwindow.cpp +++ b/src/editwindow.cpp @@ -34,17 +34,18 @@ #define DEBUGTP // Toolpalette debugging... #include "editwindow.h" -//#include -#include "graphicprimitives.h" -#include "debug.h" -#include "vector.h" #include "charwindow.h" +#include "debug.h" +#include "graphicprimitives.h" +#include "mainwindow.h" #include "ttedit.h" +#include "vector.h" + EditWindow::EditWindow(QWidget * parent/*= NULL*/): QWidget(parent), scale(1.0), offsetX(-10), offsetY(-10), tool(TOOLSelect), ptHighlight(-1), oldPtHighlight(-1), ptNextHighlight(-1), oldPtNextHighlight(-1), - polyFirstPoint(true) + polyFirstPoint(true), showRotationCenter(false), haveZeroPoint(false) { setBackgroundRole(QPalette::Base); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -55,22 +56,25 @@ EditWindow::EditWindow(QWidget * parent/*= NULL*/): QWidget(parent), setMouseTracking(true); } + QSize EditWindow::minimumSizeHint() const { return QSize(50, 50); } + QSize EditWindow::sizeHint() const { return QSize(400, 400); } + void EditWindow::CreateCursors(void) { - int hotx[8] = { 1, 1, 11, 15, 1, 1, 1, 1 }; - int hoty[8] = { 1, 1, 11, 13, 1, 1, 1, 1 }; + int hotx[9] = { 1, 1, 11, 15, 1, 1, 1, 1, 1 }; + int hoty[9] = { 1, 1, 11, 13, 1, 1, 1, 1, 1 }; - for(int i=0; i<8; i++) + for(int i=0; i<9; i++) { QString s; s.sprintf(":/res/cursor%u.png", i+1); @@ -79,6 +83,7 @@ void EditWindow::CreateCursors(void) } } + QPoint EditWindow::GetAdjustedMousePosition(QMouseEvent * event) { QSize winSize = size(); @@ -88,6 +93,7 @@ QPoint EditWindow::GetAdjustedMousePosition(QMouseEvent * event) return QPoint(offsetX + event->x(), offsetY + (winSize.height() - event->y())); } + QPoint EditWindow::GetAdjustedClientPosition(int x, int y) { QSize winSize = size(); @@ -96,6 +102,7 @@ QPoint EditWindow::GetAdjustedClientPosition(int x, int y) return QPoint(-offsetX + x, (winSize.height() - (-offsetY + y)) * +1.0); } + /* TODO: o Different colors for polys on selected points @@ -133,13 +140,22 @@ void EditWindow::paintEvent(QPaintEvent * /*event*/) //// dc.DrawLine(0, 0, 10, 10); p.setPen(QPen(Qt::blue, 1.0, Qt::DotLine)); - // Draw coordinate axes + // Draw coordinate axes // dc.CrossHair(0, 0); p.drawLine(0, -16384, 0, 16384); p.drawLine(-16384, 0, 16384, 0); - // Draw points + // Draw rotation center (if active) + + if (showRotationCenter) + { + p.setPen(QPen(Qt::red, 2.0, Qt::SolidLine)); + p.drawLine(rotationCenter.x() + 7, rotationCenter.y(), rotationCenter.x() - 7, rotationCenter.y()); + p.drawLine(rotationCenter.x(), rotationCenter.y() + 7, rotationCenter.x(), rotationCenter.y() - 7); + } + + // Draw points for(int i=0; i 2) + { + // Initial move... + // If it's not on curve, then move to it, otherwise move to last point... + + int x, y; + + if (rotated.GetOnCurve(poly, rotated.GetNumPoints(poly) - 1)) + x = (int)rotated.GetX(poly, rotated.GetNumPoints(poly) - 1), y = (int)rotated.GetY(poly, rotated.GetNumPoints(poly) - 1); + else + x = (int)rotated.GetX(poly, 0), y = (int)rotated.GetY(poly, 0); + + for(int i=0; i 2) + { + // Initial move... + // If it's not on curve, then move to it, otherwise move to last point... + + int x, y; + + if (glyph.GetOnCurve(poly, glyph.GetNumPoints(poly) - 1)) + x = (int)glyph.GetX(poly, glyph.GetNumPoints(poly) - 1), y = (int)glyph.GetY(poly, glyph.GetNumPoints(poly) - 1); + else + x = (int)glyph.GetX(poly, 0), y = (int)glyph.GetY(poly, 0); + + for(int i=0; ibutton() == Qt::RightButton) @@ -336,11 +459,24 @@ WriteLogMsg(" --> [# polys: %u, # points: %u]\n", pts.GetNumPolys(), pts.GetNumP update(); } } + else if (tool == TOOLRotate) + { + // I think what's needed here is to keep the initial mouse click, + // paint the rotation center, then use the 1st mouse move event to establish + // the rotation "zero line", which becomes the line of reference to all + // subsequent mouse moves. + rotationCenter = GetAdjustedMousePosition(event); + showRotationCenter = true; + haveZeroPoint = false; + rotationAngle = 0; + update(); + } } event->accept(); } + void EditWindow::mouseMoveEvent(QMouseEvent * event) { if (event->buttons() == Qt::RightButton) @@ -368,57 +504,58 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event) } 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 || tool == TOOLAddPoly || tool == TOOLSelect) + { + if (tool != TOOLAddPt || pts.GetNumPoints() > 0)//yecch. { - 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(); + QPoint pt2 = GetAdjustedMousePosition(event); + pts.SetXY(ptHighlight, pt2.x(), pt2.y()); + update(); #endif - } } - else if (tool == TOOLPolySelect) + } + else if (tool == TOOLPolySelect) + { + if (pts.GetNumPoints() > 0) { - if (pts.GetNumPoints() > 0) - { - QPoint pt2 = GetAdjustedMousePosition(event); - // Should also set onCurve here as well, depending on keystate + 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(); + pts.OffsetPoly(pts.GetPoly(ptHighlight), pt2.x() - pts.GetX(ptHighlight), pt2.y() - pts.GetY(ptHighlight)); + update(); + } + } + else if (tool == TOOLRotate) + { + if (pts.GetNumPoints() > 0) + { + if (!haveZeroPoint) + { + rotationZeroPoint = GetAdjustedMousePosition(event); + haveZeroPoint = true; + } + else + { + // Figure out the angle between the "zero" vector and the current one, + // then rotate all points relative to the "zero" vector (done by paint()) + QPoint currentPoint = GetAdjustedMousePosition(event); + Vector v1(rotationZeroPoint.x(), rotationZeroPoint.y(), 0, + rotationCenter.x(), rotationCenter.y(), 0); + Vector v2(currentPoint.x(), currentPoint.y(), 0, + rotationCenter.x(), rotationCenter.y(), 0); +// rotationAngle = v1.Angle(v2); + rotationAngle = v2.Angle(v1); + + QString s; + s.sprintf("%.3f degrees", rotationAngle * 180.0 / 3.14159265358979323); + ((TTEdit *)qApp)->mainWindow->statusBar()->showMessage(s); } + + update(); } + } } else if (event->buttons() == Qt::NoButton) { @@ -463,20 +600,20 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event) int32 p1x = pts.GetX(i), p1y = pts.GetY(i), p2x = pts.GetX(pts.GetNext(i)), p2y = pts.GetY(pts.GetNext(i)); - vector ls(p2x, p2y, 0, p1x, p1y, 0), v1(pt2.x(), pt2.y(), 0, p1x, p1y, 0), + Vector ls(p2x, p2y, 0, p1x, p1y, 0), v1(pt2.x(), pt2.y(), 0, p1x, p1y, 0), v2(pt2.x(), pt2.y(), 0, p2x, p2y, 0); - double pp = ls.dot(v1) / ls.length(), dist; + double pp = ls.Dot(v1) / ls.Magnitude(), dist; // Geometric interpretation: // pp is the paremeterized point on the vector ls where the perpendicular intersects ls. // If pp < 0, then the perpendicular lies beyond the 1st endpoint. If pp > length of ls, // then the perpendicular lies beyond the 2nd endpoint. if (pp < 0.0) - dist = v1.length(); - else if (pp > ls.length()) - dist = v2.length(); + dist = v1.Magnitude(); + else if (pp > ls.Magnitude()) + dist = v2.Magnitude(); else // distance = ?Det?(ls, v1) / |ls| - dist = fabs((ls.x * v1.y - v1.x * ls.y) / ls.length()); + dist = fabs((ls.x * v1.y - v1.x * ls.y) / ls.Magnitude()); //The answer to the above looks like it might be found here: // @@ -520,6 +657,7 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event) event->accept(); } + void EditWindow::mouseReleaseEvent(QMouseEvent * event) { if (event->button() == Qt::RightButton) @@ -550,11 +688,21 @@ void EditWindow::mouseReleaseEvent(QMouseEvent * event) } else if (event->button() == Qt::LeftButton) { + if (showRotationCenter) + { + showRotationCenter = false; + haveZeroPoint = false; + pts.RotatePoints(rotationAngle, IPoint(rotationCenter.x(), rotationCenter.y())); + update(); + ((TTEdit *)qApp)->mainWindow->statusBar()->showMessage(""); + } + // if (tool == TOOLScroll || tool == TOOLZoom) // ReleaseMouse(); //this is prolly too much ((TTEdit *)qApp)->charWnd->MakePathFromPoints(&pts); ((TTEdit *)qApp)->charWnd->update(); + } event->accept();