]> Shamusworld >> Repos - architektonas/blobdiff - src/actions/rs_actiondrawellipseaxis.cpp
Major refactoring of actions: Moved implementation from header files
[architektonas] / src / actions / rs_actiondrawellipseaxis.cpp
index 35c3bb4b6fcb37f3ae47f6b8b3542a6c735371cc..a262fa12482efedac4e2050ac51d4d21520865a0 100644 (file)
 //
 
 #include "rs_actiondrawellipseaxis.h"
-#include "rs_snapper.h"
+
+#include "rs_dialogfactory.h"
+#include "rs_graphicview.h"
+#include "rs_preview.h"
 
 /**
  * Constructor.
  * @param isArc true if this action will produce an ellipse arc.
  *              false if it will produce a full ellipse.
  */
-RS_ActionDrawEllipseAxis::RS_ActionDrawEllipseAxis(
-    RS_EntityContainer& container,
-    RS_GraphicView& graphicView,
-    bool isArc)
-        :RS_PreviewActionInterface("Draw ellipse with axis",
-                           container, graphicView) {
-
-    this->isArc = isArc;
-    center = Vector(false);
-    major = Vector(false);
-    ratio = 0.5;
-    angle1 = 0.0;
-    angle2 = 2*M_PI;
+RS_ActionDrawEllipseAxis::RS_ActionDrawEllipseAxis(RS_EntityContainer & container, RS_GraphicView & graphicView, bool isArc): RS_PreviewActionInterface("Draw ellipse with axis",
+               container, graphicView)
+{
+       this->isArc = isArc;
+       center = Vector(false);
+       major = Vector(false);
+       ratio = 0.5;
+       angle1 = 0.0;
+       angle2 = 2 * M_PI;
 }
 
 RS_ActionDrawEllipseAxis::~RS_ActionDrawEllipseAxis()
 {
 }
 
-QAction * RS_ActionDrawEllipseAxis::createGUIAction(RS2::ActionType type, QObject * /*parent*/)
+void RS_ActionDrawEllipseAxis::init(int status)
 {
-       QAction * action;
+       RS_PreviewActionInterface::init(status);
 
-       if (type==RS2::ActionDrawEllipseArcAxis)
-       {
-               action = new QAction(tr("&Ellipse Arc (Axis)"), 0);
-//             action = new QAction(tr("Ellipse Arc with Axis"),
-//                                                             tr("&Ellipse Arc (Axis)"), QKeySequence(), NULL);
-               action->setStatusTip(tr("Draw Ellipse Arcs"));
-       }
-       else
-       {
-               action = new QAction(tr("&Ellipse (Axis)"), 0);
-//             action = new QAction(tr("Ellipse with Axis"),
-//                                                             tr("&Ellipse (Axis)"), QKeySequence(), NULL);
-               action->setStatusTip(tr("Draw Ellipses"));
-       }
-       return action;
-}
+       if (status == SetCenter)
+               center = Vector(false);
 
-void RS_ActionDrawEllipseAxis::init(int status)
-{
-    RS_PreviewActionInterface::init(status);
+       if (status <= SetMajor)
+               major = Vector(false);
 
-    if (status==SetCenter)
-       {
-        center = Vector(false);
-    }
-    if (status<=SetMajor)
-       {
-        major = Vector(false);
-    }
-    if (status<=SetMinor)
-       {
-        ratio = 0.5;
-    }
-    if (status<=SetAngle1)
-       {
-        angle1 = 0.0;
-    }
-    if (status<=SetAngle2)
-       {
-        angle2 = 2*M_PI;
-    }
-}
+       if (status <= SetMinor)
+               ratio = 0.5;
 
+       if (status <= SetAngle1)
+               angle1 = 0.0;
 
+       if (status <= SetAngle2)
+               angle2 = 2 * M_PI;
+}
 
-void RS_ActionDrawEllipseAxis::trigger() {
-    RS_PreviewActionInterface::trigger();
+void RS_ActionDrawEllipseAxis::trigger()
+{
+       RS_PreviewActionInterface::trigger();
 
-    RS_EllipseData ellipseData(center, major,
-                               ratio,
-                               angle1, angle2,
-                               false);
-    RS_Ellipse* ellipse = new RS_Ellipse(container, ellipseData);
-    ellipse->setLayerToActive();
-    ellipse->setPenToActive();
+       RS_EllipseData ellipseData(center, major, ratio, angle1, angle2, false);
+       RS_Ellipse * ellipse = new RS_Ellipse(container, ellipseData);
+       ellipse->setLayerToActive();
+       ellipse->setPenToActive();
 
-    container->addEntity(ellipse);
+       container->addEntity(ellipse);
 
-    // upd. undo list:
-    if (document!=NULL) {
-        document->startUndoCycle();
-        document->addUndoable(ellipse);
-        document->endUndoCycle();
-    }
+       // upd. undo list:
+       if (document != NULL)
+       {
+               document->startUndoCycle();
+               document->addUndoable(ellipse);
+               document->endUndoCycle();
+       }
 
-    deleteSnapper();
-    Vector rz = graphicView->getRelativeZero();
-    graphicView->moveRelativeZero(Vector(0.0,0.0));
-    graphicView->drawEntity(ellipse);
-    graphicView->moveRelativeZero(rz);
-    drawSnapper();
+       deleteSnapper();
+       Vector rz = graphicView->getRelativeZero();
+       graphicView->moveRelativeZero(Vector(0.0, 0.0));
+       graphicView->drawEntity(ellipse);
+       graphicView->moveRelativeZero(rz);
+       drawSnapper();
 
-    setStatus(SetCenter);
+       setStatus(SetCenter);
 
-    RS_DEBUG->print("RS_ActionDrawEllipseAxis::trigger():"
-                    " entity added: %d", ellipse->getId());
+       RS_DEBUG->print("RS_ActionDrawEllipseAxis::trigger():"
+               " entity added: %d", ellipse->getId());
 }
 
+void RS_ActionDrawEllipseAxis::mouseMoveEvent(QMouseEvent * e)
+{
+       RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent begin");
 
+       Vector mouse = snapPoint(e);
 
-void RS_ActionDrawEllipseAxis::mouseMoveEvent(QMouseEvent* e) {
-    RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent begin");
-
-    Vector mouse = snapPoint(e);
-
-    switch (getStatus()) {
-    case SetCenter:
-        break;
-
-    case SetMajor:
-        if (center.valid) {
-            deletePreview();
-            clearPreview();
-            RS_EllipseData ed(center, mouse-center,
-                              0.5,
-                              0.0, 2*M_PI,
-                              false);
-            preview->addEntity(new RS_Ellipse(preview, ed));
-            drawPreview();
-        }
-        break;
-
-    case SetMinor:
-        if (center.valid && major.valid) {
-            deletePreview();
-            clearPreview();
-            RS_Line line(NULL, RS_LineData(center-major, center+major));
-            double d = line.getDistanceToPoint(mouse);
-            ratio = d/(line.getLength()/2);
-            RS_EllipseData ed(center, major,
-                              ratio,
-                              0.0, 2*M_PI,
-                              false);
-            preview->addEntity(new RS_Ellipse(preview, ed));
-            drawPreview();
-        }
-        break;
-
-    case SetAngle1:
-        if (center.valid && major.valid) {
-            deletePreview();
-            clearPreview();
-
-            //angle1 = center.angleTo(mouse);
+       switch (getStatus())
+       {
+       case SetCenter:
+               break;
+
+       case SetMajor:
+
+               if (center.valid)
+               {
+                       deletePreview();
+                       clearPreview();
+                       RS_EllipseData ed(center, mouse - center, 0.5, 0.0, 2 * M_PI, false);
+                       preview->addEntity(new RS_Ellipse(preview, ed));
+                       drawPreview();
+               }
+               break;
+
+       case SetMinor:
+
+               if (center.valid && major.valid)
+               {
+                       deletePreview();
+                       clearPreview();
+                       RS_Line line(NULL, RS_LineData(center - major, center + major));
+                       double d = line.getDistanceToPoint(mouse);
+                       ratio = d / (line.getLength() / 2);
+                       RS_EllipseData ed(center, major, ratio, 0.0, 2 * M_PI, false);
+                       preview->addEntity(new RS_Ellipse(preview, ed));
+                       drawPreview();
+               }
+               break;
+
+       case SetAngle1:
+
+               if (center.valid && major.valid)
+               {
+                       deletePreview();
+                       clearPreview();
+
+                       //angle1 = center.angleTo(mouse);
 
                        Vector m = mouse;
                        m.rotate(center, -major.angle());
-                       Vector v = m-center;
-                       v.scale(Vector(1.0, 1.0/ratio));
+                       Vector v = m - center;
+                       v.scale(Vector(1.0, 1.0 / ratio));
                        angle1 = v.angle(); // + major.angle();
 
-            preview->addEntity(new RS_Line(preview, RS_LineData(center, mouse)));
+                       preview->addEntity(new RS_Line(preview, RS_LineData(center, mouse)));
 
-            RS_EllipseData ed(center, major,
-                              ratio,
-                              angle1, angle1+1.0,
-                              false);
-            preview->addEntity(new RS_Ellipse(preview, ed));
-            drawPreview();
-        }
-        break;
+                       RS_EllipseData ed(center, major, ratio, angle1, angle1 + 1.0, false);
+                       preview->addEntity(new RS_Ellipse(preview, ed));
+                       drawPreview();
+               }
+               break;
 
-    case SetAngle2:
-        if (center.valid && major.valid) {
-            deletePreview();
-            clearPreview();
-            //angle2 = center.angleTo(mouse);
+       case SetAngle2:
+
+               if (center.valid && major.valid)
+               {
+                       deletePreview();
+                       clearPreview();
+                       //angle2 = center.angleTo(mouse);
 
                        Vector m = mouse;
                        m.rotate(center, -major.angle());
-                       Vector v = m-center;
-                       v.scale(Vector(1.0, 1.0/ratio));
+                       Vector v = m - center;
+                       v.scale(Vector(1.0, 1.0 / ratio));
                        angle2 = v.angle(); // + major.angle();
 
-            preview->addEntity(new RS_Line(preview, RS_LineData(center, mouse)));
+                       preview->addEntity(new RS_Line(preview, RS_LineData(center, mouse)));
 
-            RS_EllipseData ed(
-                center, major,
-                ratio,
-                angle1, angle2,
-                false);
-            preview->addEntity(new RS_Ellipse(preview, ed));
-            drawPreview();
-        }
+                       RS_EllipseData ed(
+                               center, major, ratio, angle1, angle2, false);
+                       preview->addEntity(new RS_Ellipse(preview, ed));
+                       drawPreview();
+               }
 
-    default:
-        break;
-    }
+       default:
+               break;
+       }
 
-    RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent end");
+       RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent end");
 }
 
+void RS_ActionDrawEllipseAxis::mouseReleaseEvent(QMouseEvent * e)
+{
+       // Proceed to next status
+//     if (RS2::qtToRsButtonState(e->button())==RS2::LeftButton)
+       if (e->button() == Qt::LeftButton)
+       {
+               Vector ce(snapPoint(e));
+               coordinateEvent(&ce);
+       }
+       // Return to last status:
+//     else if (RS2::qtToRsButtonState(e->button())==RS2::RightButton)
+       else if (e->button() == Qt::RightButton)
+       {
+               deletePreview();
+               deleteSnapper();
+               init(getStatus() - 1);
+       }
+}
 
+void RS_ActionDrawEllipseAxis::coordinateEvent(Vector * e)
+{
+       if (e == NULL)
+               return;
 
-void RS_ActionDrawEllipseAxis::mouseReleaseEvent(QMouseEvent* e) {
-    // Proceed to next status
-    if (RS2::qtToRsButtonState(e->button())==RS2::LeftButton) {
-        RS_CoordinateEvent ce(snapPoint(e));
-        coordinateEvent(&ce);
-    }
-
-    // Return to last status:
-    else if (RS2::qtToRsButtonState(e->button())==RS2::RightButton) {
-        deletePreview();
-        deleteSnapper();
-        init(getStatus()-1);
-    }
-}
+       Vector mouse = *e;
 
+       switch (getStatus())
+       {
+       case SetCenter:
+               center = mouse;
+               graphicView->moveRelativeZero(mouse);
+               setStatus(SetMajor);
+               break;
+
+       case SetMajor:
+               major = mouse - center;
+               setStatus(SetMinor);
+               break;
+
+       case SetMinor:
+       {
+               RS_Line line(NULL, RS_LineData(center - major, center + major));
+               double d = line.getDistanceToPoint(mouse);
+               ratio = d / (line.getLength() / 2);
+
+               if (!isArc)
+               {
+                       trigger();
+                       setStatus(SetCenter);
+               }
+               else
+                       setStatus(SetAngle1);
+       }
+       break;
 
-void RS_ActionDrawEllipseAxis::coordinateEvent(RS_CoordinateEvent* e) {
-    if (e==NULL) {
-        return;
-    }
-    Vector mouse = e->getCoordinate();
-
-    switch (getStatus()) {
-    case SetCenter:
-        center = mouse;
-        graphicView->moveRelativeZero(mouse);
-        setStatus(SetMajor);
-        break;
-
-    case SetMajor:
-        major = mouse-center;
-        setStatus(SetMinor);
-        break;
-
-    case SetMinor: {
-            RS_Line line(NULL, RS_LineData(center-major, center+major));
-            double d = line.getDistanceToPoint(mouse);
-            ratio = d/(line.getLength()/2);
-            if (!isArc) {
-                trigger();
-                setStatus(SetCenter);
-            } else {
-                setStatus(SetAngle1);
-            }
-        }
-        break;
-
-    case SetAngle1: {
-        //angle1 = center.angleTo(mouse);
+       case SetAngle1:
+       {
+               //angle1 = center.angleTo(mouse);
                Vector m = mouse;
                m.rotate(center, -major.angle());
-               Vector v = m-center;
-               v.scale(Vector(1.0, 1.0/ratio));
+               Vector v = m - center;
+               v.scale(Vector(1.0, 1.0 / ratio));
                angle1 = v.angle();
-        setStatus(SetAngle2);
-               } break;
+               setStatus(SetAngle2);
+       }
+       break;
 
-    case SetAngle2: {
-        //angle2 = center.angleTo(mouse);
+       case SetAngle2:
+       {
+               //angle2 = center.angleTo(mouse);
                Vector m = mouse;
                m.rotate(center, -major.angle());
-               Vector v = m-center;
-               v.scale(Vector(1.0, 1.0/ratio));
+               Vector v = m - center;
+               v.scale(Vector(1.0, 1.0 / ratio));
                angle2 = v.angle();
-        trigger();
-        } break;
+               trigger();
+       }
+       break;
 
-    default:
-        break;
-    }
+       default:
+               break;
+       }
 }
 
+void RS_ActionDrawEllipseAxis::commandEvent(RS_CommandEvent * e)
+{
+       QString c = e->getCommand().toLower();
 
+       if (checkCommand("help", c))
+       {
+               if (RS_DIALOGFACTORY != NULL)
+                       RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
+                               + getAvailableCommands().join(", "));
+               return;
+       }
 
-void RS_ActionDrawEllipseAxis::commandEvent(RS_CommandEvent* e) {
-    QString c = e->getCommand().toLower();
-
-    if (checkCommand("help", c)) {
-        if (RS_DIALOGFACTORY!=NULL) {
-            RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
-                                             + getAvailableCommands().join(", "));
-        }
-        return;
-    }
-
-    switch (getStatus()) {
-    case SetMinor: {
-            bool ok;
-            double m = RS_Math::eval(c, &ok);
-            if (ok==true) {
-                ratio = m / major.magnitude();
-                if (!isArc) {
-                    trigger();
-                } else {
-                    setStatus(SetAngle1);
-                }
-            } else {
-                if (RS_DIALOGFACTORY!=NULL) {
-                    RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
-                }
-            }
-        }
-        break;
-
-    case SetAngle1: {
-            bool ok;
-            double a = RS_Math::eval(c, &ok);
-            if (ok==true) {
-                angle1 = RS_Math::deg2rad(a);
-                setStatus(SetAngle2);
-            } else {
-                if (RS_DIALOGFACTORY!=NULL) {
-                    RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
-                }
-            }
-        }
-        break;
-
-    case SetAngle2: {
-            bool ok;
-            double a = RS_Math::eval(c, &ok);
-            if (ok==true) {
-                angle2 = RS_Math::deg2rad(a);
-                trigger();
-            } else {
-                if (RS_DIALOGFACTORY!=NULL) {
-                    RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
-                }
-            }
-        }
-        break;
-
-    default:
-        break;
-    }
-}
+       switch (getStatus())
+       {
+       case SetMinor: {
+               bool ok;
+               double m = RS_Math::eval(c, &ok);
+
+               if (ok == true)
+               {
+                       ratio = m / major.magnitude();
+
+                       if (!isArc)
+                               trigger();
+                       else
+                               setStatus(SetAngle1);
+               }
+               else if (RS_DIALOGFACTORY != NULL)
+                       RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
 
+       }
+       break;
 
+       case SetAngle1: {
+               bool ok;
+               double a = RS_Math::eval(c, &ok);
 
-QStringList RS_ActionDrawEllipseAxis::getAvailableCommands() {
-    QStringList cmd;
-    return cmd;
-}
+               if (ok == true)
+               {
+                       angle1 = RS_Math::deg2rad(a);
+                       setStatus(SetAngle2);
+               }
+               else if (RS_DIALOGFACTORY != NULL)
+                       RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
 
+       }
+       break;
 
+       case SetAngle2: {
+               bool ok;
+               double a = RS_Math::eval(c, &ok);
 
-void RS_ActionDrawEllipseAxis::updateMouseButtonHints() {
-    if (RS_DIALOGFACTORY!=NULL) {
-        switch (getStatus()) {
-        case SetCenter:
-            RS_DIALOGFACTORY->updateMouseWidget(tr("Specify ellipse center"),
-                                                tr("Cancel"));
-            break;
-
-        case SetMajor:
-            RS_DIALOGFACTORY->updateMouseWidget(tr("Specify endpoint of major axis"),
-                                                tr("Back"));
-            break;
-
-        case SetMinor:
-            RS_DIALOGFACTORY->updateMouseWidget(
-                tr("Specify endpoint or length of minor axis:"),
-                tr("Back"));
-            break;
-
-        case SetAngle1:
-            RS_DIALOGFACTORY->updateMouseWidget(tr("Specify start angle"),
-                                                tr("Back"));
-            break;
-
-        case SetAngle2:
-            RS_DIALOGFACTORY->updateMouseWidget(tr("Specify end angle"),
-                                                tr("Back"));
-            break;
-
-        default:
-            RS_DIALOGFACTORY->updateMouseWidget("", "");
-            break;
-        }
-    }
-}
+               if (ok == true)
+               {
+                       angle2 = RS_Math::deg2rad(a);
+                       trigger();
+               }
+               else if (RS_DIALOGFACTORY != NULL)
+                       RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
 
+       }
+       break;
 
+       default:
+               break;
+       }
+}
 
-void RS_ActionDrawEllipseAxis::updateMouseCursor() {
-    graphicView->setMouseCursor(RS2::CadCursor);
+QStringList RS_ActionDrawEllipseAxis::getAvailableCommands()
+{
+       QStringList cmd;
+       return cmd;
 }
 
+void RS_ActionDrawEllipseAxis::updateMouseButtonHints()
+{
+       if (RS_DIALOGFACTORY != NULL)
+       {
+               switch (getStatus())
+               {
+               case SetCenter:
+                       RS_DIALOGFACTORY->updateMouseWidget(tr("Specify ellipse center"),
+                               tr("Cancel"));
+                       break;
+
+               case SetMajor:
+                       RS_DIALOGFACTORY->updateMouseWidget(tr("Specify endpoint of major axis"),
+                               tr("Back"));
+                       break;
+
+               case SetMinor:
+                       RS_DIALOGFACTORY->updateMouseWidget(
+                               tr("Specify endpoint or length of minor axis:"),
+                               tr("Back"));
+                       break;
+
+               case SetAngle1:
+                       RS_DIALOGFACTORY->updateMouseWidget(tr("Specify start angle"),
+                               tr("Back"));
+                       break;
+
+               case SetAngle2:
+                       RS_DIALOGFACTORY->updateMouseWidget(tr("Specify end angle"),
+                               tr("Back"));
+                       break;
+
+               default:
+                       RS_DIALOGFACTORY->updateMouseWidget("", "");
+                       break;
+               }
+       }
+}
 
+void RS_ActionDrawEllipseAxis::updateMouseCursor()
+{
+       graphicView->setMouseCursor(RS2::CadCursor);
+}
 
-void RS_ActionDrawEllipseAxis::updateToolBar() {
-    if (RS_DIALOGFACTORY!=NULL) {
-        if (!isFinished()) {
-            RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
-        } else {
-            RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarEllipses);
-        }
-    }
+void RS_ActionDrawEllipseAxis::updateToolBar()
+{
+       if (RS_DIALOGFACTORY != NULL)
+       {
+               if (!isFinished())
+                       RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
+               else
+                       RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarEllipses);
+       }
 }
 
 // EOF