1 // actiondrawspline.cpp
3 // Part of the Architektonas Project
4 // Originally part of QCad Community Edition by Andrew Mustun
5 // Extensively rewritten and refactored by James L. Hammons
6 // (C) 2010 Underground Software
8 // JLH = James L. Hammons <jlhamm@acm.org>
11 // --- ---------- -----------------------------------------------------------
12 // JLH 06/04/2010 Added this text. :-)
15 #include "actiondrawspline.h"
17 #include "rs_commandevent.h"
19 #include "rs_dialogfactory.h"
20 #include "graphicview.h"
21 #include "rs_preview.h"
23 ActionDrawSpline::ActionDrawSpline(RS_EntityContainer & container, GraphicView & graphicView):
24 ActionInterface("Draw splines", container, graphicView)
27 #warning "!!! Need to port setAutoDelete() behaviour from Qt3 to Qt4 !!!"
28 // history.setAutoDelete(true);
29 data = RS_SplineData(3, false);
30 //bHistory.setAutoDelete(true);
33 ActionDrawSpline::~ActionDrawSpline()
37 /*virtual*/ RS2::ActionType ActionDrawSpline::rtti()
39 return RS2::ActionDrawSpline;
42 void ActionDrawSpline::reset()
45 //start = Vector(false);
50 void ActionDrawSpline::init(int status)
52 ActionInterface::init(status);
57 void ActionDrawSpline::trigger()
59 ActionInterface::trigger();
65 spline->setLayerToActive();
66 spline->setPenToActive();
68 container->addEntity(spline);
73 document->startUndoCycle();
74 document->addUndoable(spline);
75 document->endUndoCycle();
80 Vector r = graphicView->getRelativeZero();
81 graphicView->moveRelativeZero(Vector(0.0, 0.0));
82 graphicView->drawEntity(spline);
83 graphicView->moveRelativeZero(r);
85 RS_DEBUG->print("ActionDrawSpline::trigger(): spline added: %d", spline->getId());
91 void ActionDrawSpline::mouseMoveEvent(QMouseEvent * e)
93 RS_DEBUG->print("ActionDrawSpline::mouseMoveEvent begin");
95 Vector mouse = snapPoint(e);
97 if (getStatus() == SetNextPoint && spline)
102 RS_Spline * tmpSpline = (RS_Spline *)spline->clone();
103 tmpSpline->addControlPoint(mouse);
105 // preview->addEntity(tmpSpline);
107 QList<Vector> cpts = tmpSpline->getControlPoints();
108 QList<Vector>::iterator it;
110 // for(it=cpts.begin(); it!=cpts.end(); it+)
111 // preview->addEntity(new RS_Point(preview, RS_PointData(*it)));
116 RS_DEBUG->print("ActionDrawSpline::mouseMoveEvent end");
119 void ActionDrawSpline::mouseReleaseEvent(QMouseEvent * e)
121 if (e->button() == Qt::LeftButton)
123 Vector ce(snapPoint(e));
124 coordinateEvent(&ce);
126 else if (e->button() == Qt::RightButton)
128 if (getStatus() == SetNextPoint)
134 init(getStatus() - 1);
138 void ActionDrawSpline::coordinateEvent(Vector * e)
149 history.append(new Vector(mouse));
153 spline = new RS_Spline(container, data);
154 spline->addControlPoint(mouse);
157 setStatus(SetNextPoint);
158 graphicView->moveRelativeZero(mouse);
159 updateMouseButtonHints();
163 graphicView->moveRelativeZero(mouse);
164 history.append(new Vector(mouse));
168 spline->addControlPoint(mouse);
175 updateMouseButtonHints();
183 void ActionDrawSpline::commandEvent(RS_CommandEvent * e)
185 QString c = e->getCommand().toLower();
190 if (checkCommand("help", c))
192 RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
193 + getAvailableCommands().join(", "));
200 if (checkCommand("undo", c))
203 updateMouseButtonHints();
214 QStringList ActionDrawSpline::getAvailableCommands()
224 if (history.count() >= 2)
225 cmd += command("undo");
227 if (history.count() >= 3)
228 cmd += command("close");
239 void ActionDrawSpline::updateMouseButtonHints()
244 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify first control point"),
252 if (history.count() >= 3)
254 msg += RS_COMMANDS->command("close");
258 if (history.count() >= 2)
259 msg += RS_COMMANDS->command("undo");
261 if (history.count() >= 2)
262 RS_DIALOGFACTORY->updateMouseWidget(
263 tr("Specify next control point or [%1]").arg(msg),
266 RS_DIALOGFACTORY->updateMouseWidget(
267 tr("Specify next control point"),
273 RS_DIALOGFACTORY->updateMouseWidget("", "");
278 void ActionDrawSpline::showOptions()
280 ActionInterface::showOptions();
281 RS_DIALOGFACTORY->requestOptions(this, true);
284 void ActionDrawSpline::hideOptions()
286 ActionInterface::hideOptions();
287 RS_DIALOGFACTORY->requestOptions(this, false);
290 void ActionDrawSpline::updateMouseCursor()
292 graphicView->setMouseCursor(RS2::CadCursor);
295 void ActionDrawSpline::updateToolBar()
298 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
300 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarMain);
303 void ActionDrawSpline::undo()
305 if (history.count() > 1)
307 history.removeLast();
313 //point = *history.last();
318 spline->removeLastControlPoint();
319 Vector * v = history.last();
322 graphicView->moveRelativeZero(*v);
324 graphicView->redraw();
328 RS_DIALOGFACTORY->commandMessage(
329 tr("Cannot undo: Not enough entities defined yet."));
332 void ActionDrawSpline::setDegree(int deg)
337 spline->setDegree(deg);
340 int ActionDrawSpline::getDegree()
345 void ActionDrawSpline::setClosed(bool c)
350 spline->setClosed(c);
353 bool ActionDrawSpline::isClosed()