X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmirroraction.cpp;h=6bc5b59f207c844f9ea5709a1e8af5670aee9bd9;hb=dbfab6256efe6b03e9750e33081d9dcdcdfc1c34;hp=720692ed85130725ac3c2170206fa2ec251463ea;hpb=4b37ccbdf263a4798e53a62e33d869a728ace283;p=architektonas diff --git a/src/mirroraction.cpp b/src/mirroraction.cpp index 720692e..6bc5b59 100644 --- a/src/mirroraction.cpp +++ b/src/mirroraction.cpp @@ -27,8 +27,11 @@ enum { FIRST_POINT, NEXT_POINT }; MirrorAction::MirrorAction(): state(FIRST_POINT), line(NULL), - shiftWasPressedOnNextPoint(false), mirror(new Container(Vector())) + shiftWasPressedOnNextPoint(false), ctrlWasPressed(false), + mirror(new Container(Vector())) { + ApplicationWindow::drawing->document.CopySelectedContentsTo(mirror); + mirror->Save(); } @@ -49,19 +52,28 @@ MirrorAction::~MirrorAction() } else { - painter->DrawLine(p1, p2); - painter->DrawHandle(p2); + Vector reflectedP2 = -(p2 - p1); + Point newP2 = p1 + reflectedP2; + painter->DrawLine(newP2, p2); + painter->DrawHandle(p1); double absAngle = (Vector(p2 - p1).Angle()) * RADIANS_TO_DEGREES; -// double absLength = Vector(position - endpoint).Magnitude(); + + // Keep the angle between 0 and 180 degrees + if (absAngle > 180.0) + absAngle -= 180.0; QString text = QChar(0x2221) + QObject::tr(": %1"); text = text.arg(absAngle); -// QString text = tr("Length: %1 in."); -// text = text.arg(Vector::Magnitude(p1, p2)); + + if (ctrlWasPressed) + text += " (Copy)"; + painter->DrawInformativeText(text); - mirror->Draw(painter); + // Draw the mirror only if there's been a line to mirror around + if (p1 != p2) + mirror->Draw(painter); } } @@ -85,19 +97,8 @@ MirrorAction::~MirrorAction() else { p2 = point; - - mirror->Clear(); - int itemsSelected = ApplicationWindow::drawing->document.ItemsSelected(); - - if (itemsSelected == 0) - return; - - for(int i=0; idocument.SelectedItem(i); - Object * mirrored = object->Mirror(p1, p2); - mirror->Add(mirrored); - } + mirror->Restore(); + mirror->Mirror(p1, p2); } } @@ -111,19 +112,25 @@ MirrorAction::~MirrorAction() } else if (state == NEXT_POINT) { - // We create the new object here, and then pass it off to the - // DrawingView which stuffs it into the document. -// line = new Line(p1, p2); - // We don't need no stinkin' sentinels, when we have signals & slots! -// emit ObjectReady(line); + if (!ctrlWasPressed) + { + state = FIRST_POINT; + ApplicationWindow::drawing->document.MirrorSelected(p1, p2); - p1 = p2; - state = NEXT_POINT; + mirror->Clear(); + ApplicationWindow::drawing->document.CopySelectedContentsTo(mirror); + mirror->Save(); + } + else + { + mirror->CopyContentsTo(&(ApplicationWindow::drawing->document)); +// mirror->CopyContentsTo(&(DrawingView.document)); + } } } -/*virtual*/ bool MirrorAction::KeyDown(int key) +/*virtual*/ void MirrorAction::KeyDown(int key) { if ((key == Qt::Key_Shift) && (state == NEXT_POINT)) { @@ -131,14 +138,17 @@ MirrorAction::~MirrorAction() p1Save = p1; p1 = p2; state = FIRST_POINT; - return true; + emit(NeedRefresh()); + } + else if (key == Qt::Key_Control) + { + ctrlWasPressed = true; + emit(NeedRefresh()); } - - return false; } -/*virtual*/ bool MirrorAction::KeyReleased(int key) +/*virtual*/ void MirrorAction::KeyReleased(int key) { if ((key == Qt::Key_Shift) && shiftWasPressedOnNextPoint) { @@ -146,9 +156,12 @@ MirrorAction::~MirrorAction() p2 = p1; p1 = p1Save; state = NEXT_POINT; - return true; + emit(NeedRefresh()); + } + else if (key == Qt::Key_Control) + { + ctrlWasPressed = false; + emit(NeedRefresh()); } - - return false; }