]> Shamusworld >> Repos - architektonas/blobdiff - src/actions/rs_actiondrawspline.cpp
Major refactoring of actions: Moved implementation from header files
[architektonas] / src / actions / rs_actiondrawspline.cpp
index f62a25260cd498f3e1c99561c4de81a8918618ff..ba4e6811fef276d981bcd1578f5f77a70d53b548 100644 (file)
@@ -1,36 +1,25 @@
-/****************************************************************************
-** $Id: rs_actiondrawspline.cpp 1140 2004-07-24 23:14:15Z andrew $
-**
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-** This file is part of the qcadlib Library project.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** Licensees holding valid qcadlib Professional Edition licenses may use
-** this file in accordance with the qcadlib Commercial License
-** Agreement provided with the Software.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.ribbonsoft.com for further details.
-**
-** Contact info@ribbonsoft.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
+// rs_actiondrawspline.cpp
+//
+// Part of the Architektonas Project
+// Originally part of QCad Community Edition by Andrew Mustun
+// Extensively rewritten and refactored by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -----------------------------------------------------------
+// JLH  06/04/2010  Added this text. :-)
+//
 
 #include "rs_actiondrawspline.h"
 
-#include "rs_actioneditundo.h"
-#include "rs_snapper.h"
+#include "commands.h"
+#include "rs_dialogfactory.h"
+#include "rs_graphicview.h"
+#include "rs_preview.h"
 
-RS_ActionDrawSpline::RS_ActionDrawSpline(RS_EntityContainer & container,
-       RS_GraphicView & graphicView):
+RS_ActionDrawSpline::RS_ActionDrawSpline(RS_EntityContainer & container, RS_GraphicView & graphicView):
        RS_PreviewActionInterface("Draw splines", container, graphicView)
 {
        reset();
@@ -49,65 +38,54 @@ RS_ActionDrawSpline::~RS_ActionDrawSpline()
        return RS2::ActionDrawSpline;
 }
 
-QAction * RS_ActionDrawSpline::createGUIAction(RS2::ActionType /*type*/, QObject * /*parent*/)
-{
-       QAction * action = new QAction(tr("&Spline"), 0);
-//     QAction* action = new QAction(tr("Spline"), tr("&Spline"),
-//                                                                     QKeySequence(), NULL);
-       action->setStatusTip(tr("Draw splines"));
-       return action;
-}
-
 void RS_ActionDrawSpline::reset()
 {
        spline = NULL;
-    //start = Vector(false);
-    history.clear();
-    //bHistory.clear();
+       //start = Vector(false);
+       history.clear();
+       //bHistory.clear();
 }
 
+void RS_ActionDrawSpline::init(int status)
+{
+       RS_PreviewActionInterface::init(status);
 
-
-void RS_ActionDrawSpline::init(int status) {
-    RS_PreviewActionInterface::init(status);
-
-    reset();
+       reset();
 }
 
+void RS_ActionDrawSpline::trigger()
+{
+       RS_PreviewActionInterface::trigger();
 
-
-void RS_ActionDrawSpline::trigger() {
-    RS_PreviewActionInterface::trigger();
-
-       if (spline==NULL) {
+       if (spline == NULL)
                return;
-       }
 
        // add the entity
-    //RS_Spline* spline = new RS_Spline(container, data);
-    spline->setLayerToActive();
-    spline->setPenToActive();
+       //RS_Spline* spline = new RS_Spline(container, data);
+       spline->setLayerToActive();
+       spline->setPenToActive();
        spline->update();
-    container->addEntity(spline);
+       container->addEntity(spline);
 
-    // upd. undo list:
-    if (document!=NULL) {
-        document->startUndoCycle();
-        document->addUndoable(spline);
-        document->endUndoCycle();
-    }
+       // upd. undo list:
+       if (document != NULL)
+       {
+               document->startUndoCycle();
+               document->addUndoable(spline);
+               document->endUndoCycle();
+       }
 
        // upd view
-    deleteSnapper();
+       deleteSnapper();
        Vector r = graphicView->getRelativeZero();
-    graphicView->moveRelativeZero(Vector(0.0,0.0));
-    graphicView->drawEntity(spline);
-    graphicView->moveRelativeZero(r);
-    drawSnapper();
-    RS_DEBUG->print("RS_ActionDrawSpline::trigger(): spline added: %d", spline->getId());
+       graphicView->moveRelativeZero(Vector(0.0, 0.0));
+       graphicView->drawEntity(spline);
+       graphicView->moveRelativeZero(r);
+       drawSnapper();
+       RS_DEBUG->print("RS_ActionDrawSpline::trigger(): spline added: %d", spline->getId());
 
        spline = NULL;
-    //history.clear();
+       //history.clear();
 }
 
 void RS_ActionDrawSpline::mouseMoveEvent(QMouseEvent * e)
@@ -131,7 +109,7 @@ void RS_ActionDrawSpline::mouseMoveEvent(QMouseEvent * e)
                QList<Vector> cpts = tmpSpline->getControlPoints();
                QList<Vector>::iterator it;
 
-               for(it=cpts.begin(); it!=cpts.end(); ++it)
+               for (it = cpts.begin(); it != cpts.end(); ++it)
                        preview->addEntity(new RS_Point(preview, RS_PointData(*it)));
 
                drawPreview();
@@ -142,64 +120,66 @@ void RS_ActionDrawSpline::mouseMoveEvent(QMouseEvent * e)
 
 void RS_ActionDrawSpline::mouseReleaseEvent(QMouseEvent * e)
 {
-    if (RS2::qtToRsButtonState(e->button()) == RS2::LeftButton)
+       if (RS2::qtToRsButtonState(e->button()) == RS2::LeftButton)
        {
-        RS_CoordinateEvent ce(snapPoint(e));
-        coordinateEvent(&ce);
-    }
-    else if (RS2::qtToRsButtonState(e->button()) == RS2::RightButton)
+               Vector ce(snapPoint(e));
+               coordinateEvent(&ce);
+       }
+       else if (RS2::qtToRsButtonState(e->button()) == RS2::RightButton)
        {
                if (getStatus() == SetNextPoint)
-               {
                        trigger();
-               }
-        deletePreview();
-        clearPreview();
-        deleteSnapper();
-        init(getStatus()-1);
-    }
+               deletePreview();
+               clearPreview();
+               deleteSnapper();
+               init(getStatus() - 1);
+       }
 }
 
+void RS_ActionDrawSpline::coordinateEvent(Vector * e)
+{
+       if (e == NULL)
+               return;
 
+       Vector mouse = *e;
 
-void RS_ActionDrawSpline::coordinateEvent(RS_CoordinateEvent* e) {
-    if (e==NULL) {
-        return;
-    }
-
-    Vector mouse = e->getCoordinate();
-
-    switch (getStatus()) {
-    case SetStartpoint:
+       switch (getStatus())
+       {
+       case SetStartpoint:
                //data.startpoint = mouse;
-        //point = mouse;
-        history.clear();
-        history.append(new Vector(mouse));
-               if (spline==NULL) {
+               //point = mouse;
+               history.clear();
+               history.append(new Vector(mouse));
+
+               if (spline == NULL)
+               {
                        spline = new RS_Spline(container, data);
                        spline->addControlPoint(mouse);
                }
-        //bHistory.clear();
-        //bHistory.append(new double(0.0));
-        //start = mouse;
-        setStatus(SetNextPoint);
-        graphicView->moveRelativeZero(mouse);
-        updateMouseButtonHints();
-        break;
-
-    case SetNextPoint:
-       graphicView->moveRelativeZero(mouse);
-        //point = mouse;
-        history.append(new Vector(mouse));
-        //bHistory.append(new double(0.0));
-               if (spline!=NULL) {
+
+               //bHistory.clear();
+               //bHistory.append(new double(0.0));
+               //start = mouse;
+               setStatus(SetNextPoint);
+               graphicView->moveRelativeZero(mouse);
+               updateMouseButtonHints();
+               break;
+
+       case SetNextPoint:
+               graphicView->moveRelativeZero(mouse);
+               //point = mouse;
+               history.append(new Vector(mouse));
+               //bHistory.append(new double(0.0));
+
+               if (spline != NULL)
+               {
                        //graphicView->deleteEntity(spline);
                        spline->addControlPoint(mouse);
                        //spline->setEndpoint(mouse);
                        //if (spline->count()==1) {
-                       //spline->setLayerToActive();
-                       //spline->setPenToActive();
-                               //container->addEntity(spline);
+                       //spline->setLayerToActive();
+                       //spline->setPenToActive();
+                       //container->addEntity(spline);
                        //}
                        deletePreview();
                        clearPreview();
@@ -207,150 +187,156 @@ void RS_ActionDrawSpline::coordinateEvent(RS_CoordinateEvent* e) {
                        //graphicView->drawEntity(spline);
                        drawSnapper();
                }
-        //trigger();
-        //data.startpoint = data.endpoint;
-        updateMouseButtonHints();
-        //graphicView->moveRelativeZero(mouse);
-        break;
 
-    default:
-        break;
-    }
-}
+               //trigger();
+               //data.startpoint = data.endpoint;
+               updateMouseButtonHints();
+               //graphicView->moveRelativeZero(mouse);
+               break;
 
+       default:
+               break;
+       }
+}
 
+void RS_ActionDrawSpline::commandEvent(RS_CommandEvent * e)
+{
+       QString c = e->getCommand().toLower();
 
-void RS_ActionDrawSpline::commandEvent(RS_CommandEvent* e) {
-    QString c = e->getCommand().toLower();
+       switch (getStatus())
+       {
+       case SetStartpoint:
 
-    switch (getStatus()) {
-    case SetStartpoint:
-        if (checkCommand("help", c)) {
-            RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
-                                             + getAvailableCommands().join(", "));
-            return;
-        }
-        break;
+               if (checkCommand("help", c))
+               {
+                       RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
+                               + getAvailableCommands().join(", "));
+                       return;
+               }
+               break;
 
-    case SetNextPoint:
-        /*if (checkCommand("close", c)) {
-            close();
-            updateMouseButtonHints();
-            return;
-        }*/
+       case SetNextPoint:
+               /*if (checkCommand("close", c)) {
+                   close();
+                   updateMouseButtonHints();
+                   return;
+                  }*/
 
-        if (checkCommand("undo", c)) {
-            undo();
-            updateMouseButtonHints();
-            return;
-        }
-        break;
+               if (checkCommand("undo", c))
+               {
+                       undo();
+                       updateMouseButtonHints();
+                       return;
+               }
+               break;
 
-    default:
-        break;
-    }
+       default:
+               break;
+       }
 }
 
+QStringList RS_ActionDrawSpline::getAvailableCommands()
+{
+       QStringList cmd;
 
+       switch (getStatus())
+       {
+       case SetStartpoint:
+               break;
 
-QStringList RS_ActionDrawSpline::getAvailableCommands() {
-    QStringList cmd;
+       case SetNextPoint:
 
-    switch (getStatus()) {
-    case SetStartpoint:
-        break;
-    case SetNextPoint:
-        if (history.count()>=2) {
-            cmd += command("undo");
-        }
-        if (history.count()>=3) {
-            cmd += command("close");
-        }
-        break;
-    default:
-        break;
-    }
+               if (history.count() >= 2)
+                       cmd += command("undo");
 
-    return cmd;
-}
 
+               if (history.count() >= 3)
+                       cmd += command("close");
+               break;
 
+       default:
+               break;
+       }
 
-void RS_ActionDrawSpline::updateMouseButtonHints() {
-    switch (getStatus()) {
-    case SetStartpoint:
-        RS_DIALOGFACTORY->updateMouseWidget(tr("Specify first control point"),
-                                            tr("Cancel"));
-        break;
-    case SetNextPoint: {
-            QString msg = "";
-
-            if (history.count()>=3) {
-                msg += RS_COMMANDS->command("close");
-                msg += "/";
-            }
-            if (history.count()>=2) {
-                msg += RS_COMMANDS->command("undo");
-            }
-
-            if (history.count()>=2) {
-                RS_DIALOGFACTORY->updateMouseWidget(
-                    tr("Specify next control point or [%1]").arg(msg),
-                    tr("Back"));
-            } else {
-                RS_DIALOGFACTORY->updateMouseWidget(
-                    tr("Specify next control point"),
-                    tr("Back"));
-            }
-        }
-        break;
-    default:
-        RS_DIALOGFACTORY->updateMouseWidget("", "");
-        break;
-    }
+       return cmd;
 }
 
+void RS_ActionDrawSpline::updateMouseButtonHints()
+{
+       switch (getStatus())
+       {
+       case SetStartpoint:
+               RS_DIALOGFACTORY->updateMouseWidget(tr("Specify first control point"),
+                       tr("Cancel"));
+               break;
 
-void RS_ActionDrawSpline::showOptions() {
-    RS_ActionInterface::showOptions();
+       case SetNextPoint: {
+               QString msg = "";
 
-    RS_DIALOGFACTORY->requestOptions(this, true);
-}
+               if (history.count() >= 3)
+               {
+                       msg += RS_COMMANDS->command("close");
+                       msg += "/";
+               }
 
+               if (history.count() >= 2)
+                       msg += RS_COMMANDS->command("undo");
+
+               if (history.count() >= 2)
+                       RS_DIALOGFACTORY->updateMouseWidget(
+                               tr("Specify next control point or [%1]").arg(msg),
+                               tr("Back"));
+               else
+                       RS_DIALOGFACTORY->updateMouseWidget(
+                               tr("Specify next control point"),
+                               tr("Back"));
+       }
+       break;
 
+       default:
+               RS_DIALOGFACTORY->updateMouseWidget("", "");
+               break;
+       }
+}
 
-void RS_ActionDrawSpline::hideOptions() {
-    RS_ActionInterface::hideOptions();
+void RS_ActionDrawSpline::showOptions()
+{
+       RS_ActionInterface::showOptions();
 
-    RS_DIALOGFACTORY->requestOptions(this, false);
+       RS_DIALOGFACTORY->requestOptions(this, true);
 }
 
+void RS_ActionDrawSpline::hideOptions()
+{
+       RS_ActionInterface::hideOptions();
 
-void RS_ActionDrawSpline::updateMouseCursor() {
-    graphicView->setMouseCursor(RS2::CadCursor);
+       RS_DIALOGFACTORY->requestOptions(this, false);
 }
 
-
-void RS_ActionDrawSpline::updateToolBar() {
-    if (!isFinished()) {
-        RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
-    } else {
-        //RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSplines);
-        RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarMain);
-    }
+void RS_ActionDrawSpline::updateMouseCursor()
+{
+       graphicView->setMouseCursor(RS2::CadCursor);
 }
 
+void RS_ActionDrawSpline::updateToolBar()
+{
+       if (!isFinished())
+               RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
+       else
+               //RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSplines);
+               RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarMain);
+}
 
 /*
-void RS_ActionDrawSpline::close() {
+   void RS_ActionDrawSpline::close() {
     if (history.count()>2 && start.valid) {
         //data.endpoint = start;
         //trigger();
-               if (spline!=NULL) {
-                       RS_CoordinateEvent e(spline->getStartpoint());
-                       coordinateEvent(&e);
-               }
-               trigger();
+                if (spline!=NULL) {
+                        Vector e(spline->getStartpoint());
+                        coordinateEvent(&e);
+                }
+                trigger();
         setStatus(SetStartpoint);
         graphicView->moveRelativeZero(start);
     } else {
@@ -358,55 +344,64 @@ void RS_ActionDrawSpline::close() {
             tr("Cannot close sequence of lines: "
                "Not enough entities defined yet."));
     }
-}
-*/
-
-void RS_ActionDrawSpline::undo() {
-    if (history.count()>1) {
-        history.removeLast();
-        //bHistory.removeLast();
-        deletePreview();
-        clearPreview();
-        //graphicView->setCurrentAction(
-        //    new RS_ActionEditUndo(true, *container, *graphicView));
-               if (history.last()!=NULL) {
-               //point = *history.last();
+   }
+ */
+
+void RS_ActionDrawSpline::undo()
+{
+       if (history.count() > 1)
+       {
+               history.removeLast();
+               //bHistory.removeLast();
+               deletePreview();
+               clearPreview();
+
+               //graphicView->setCurrentAction(
+               //    new RS_ActionEditUndo(true, *container, *graphicView));
+               if (history.last() != NULL)
+               {
+                       //point = *history.last();
                }
-               if (spline!=NULL) {
+
+               if (spline != NULL)
+               {
                        spline->removeLastControlPoint();
-                       Vector* v = history.last();
-                       if (v!=NULL) {
-                       graphicView->moveRelativeZero(*v);
-                       }
+                       Vector * v = history.last();
+
+                       if (v != NULL)
+                               graphicView->moveRelativeZero(*v);
                        graphicView->redraw();
                }
-    } else {
-        RS_DIALOGFACTORY->commandMessage(
-            tr("Cannot undo: "
-               "Not enough entities defined yet."));
-    }
+       }
+       else
+               RS_DIALOGFACTORY->commandMessage(
+                       tr("Cannot undo: "
+                               "Not enough entities defined yet."));
 }
 
-
-void RS_ActionDrawSpline::setDegree(int deg) {
+void RS_ActionDrawSpline::setDegree(int deg)
+{
        data.degree = deg;
-       if (spline!=NULL) {
+
+       if (spline != NULL)
                spline->setDegree(deg);
-       }
 }
 
-int RS_ActionDrawSpline::getDegree() {
+int RS_ActionDrawSpline::getDegree()
+{
        return data.degree;
 }
 
-void RS_ActionDrawSpline::setClosed(bool c) {
+void RS_ActionDrawSpline::setClosed(bool c)
+{
        data.closed = c;
-       if (spline!=NULL) {
+
+       if (spline != NULL)
                spline->setClosed(c);
-       }
 }
 
-bool RS_ActionDrawSpline::isClosed() {
+bool RS_ActionDrawSpline::isClosed()
+{
        return data.closed;
 }