1 // rs_actiondrawcircle.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/03/2010 Added this text. :-)
15 #include "rs_actiondrawcircle.h"
17 #include "rs_commandevent.h"
18 #include "rs_dialogfactory.h"
19 #include "graphicview.h"
20 #include "rs_preview.h"
22 RS_ActionDrawCircle::RS_ActionDrawCircle(RS_EntityContainer & container, GraphicView & graphicView):
23 RS_PreviewActionInterface("Draw circles", container, graphicView)
28 RS_ActionDrawCircle::~RS_ActionDrawCircle()
32 /*virtual*/ RS2::ActionType RS_ActionDrawCircle::rtti()
34 return RS2::ActionDrawCircle;
37 void RS_ActionDrawCircle::reset()
39 data = RS_CircleData(Vector(false), 0.0);
42 void RS_ActionDrawCircle::init(int status)
44 RS_PreviewActionInterface::init(status);
49 void RS_ActionDrawCircle::trigger()
51 RS_PreviewActionInterface::trigger();
53 RS_Circle * circle = new RS_Circle(container, data);
54 circle->setLayerToActive();
55 circle->setPenToActive();
56 container->addEntity(circle);
61 document->startUndoCycle();
62 document->addUndoable(circle);
63 document->endUndoCycle();
67 Vector rz = graphicView->getRelativeZero();
68 graphicView->moveRelativeZero(Vector(0.0, 0.0));
69 graphicView->drawEntity(circle);
70 graphicView->moveRelativeZero(circle->getCenter());
76 RS_DEBUG->print("RS_ActionDrawCircle::trigger(): circle added: %d", circle->getId());
79 void RS_ActionDrawCircle::mouseMoveEvent(QMouseEvent * e)
81 RS_DEBUG->print("RS_ActionDrawCircle::mouseMoveEvent begin");
83 Vector mouse = snapPoint(e);
93 if (data.center.valid)
95 data.radius = data.center.distanceTo(mouse);
98 preview->addEntity(new RS_Circle(preview,
105 RS_DEBUG->print("RS_ActionDrawCircle::mouseMoveEvent end");
108 void RS_ActionDrawCircle::mouseReleaseEvent(QMouseEvent * e)
110 if (e->button() == Qt::LeftButton)
112 Vector ce(snapPoint(e));
113 coordinateEvent(&ce);
115 else if (e->button() == Qt::RightButton)
119 init(getStatus() - 1);
123 void RS_ActionDrawCircle::coordinateEvent(Vector * e)
134 graphicView->moveRelativeZero(mouse);
135 setStatus(SetRadius);
140 if (data.center.valid)
142 graphicView->moveRelativeZero(mouse);
143 data.radius = data.center.distanceTo(mouse);
146 //setStatus(SetCenter);
154 void RS_ActionDrawCircle::commandEvent(RS_CommandEvent * e)
156 QString c = e->getCommand().toLower();
158 if (checkCommand("help", c))
160 if (RS_DIALOGFACTORY != NULL)
161 RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
162 + getAvailableCommands().join(", "));
170 double r = RS_Math::eval(c, &ok);
174 else if (RS_DIALOGFACTORY != NULL)
175 RS_DIALOGFACTORY->commandMessage(
176 tr("Not a valid expression"));
179 //setStatus(SetCenter);
188 QStringList RS_ActionDrawCircle::getAvailableCommands()
194 void RS_ActionDrawCircle::updateMouseButtonHints()
200 if (RS_DIALOGFACTORY != NULL)
201 RS_DIALOGFACTORY->updateMouseWidget(
202 tr("Specify center"), tr("Cancel"));
207 if (RS_DIALOGFACTORY != NULL)
208 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify radius"), tr("Back"));
213 if (RS_DIALOGFACTORY != NULL)
214 RS_DIALOGFACTORY->updateMouseWidget("", "");
219 void RS_ActionDrawCircle::showOptions()
221 RS_ActionInterface::showOptions();
224 void RS_ActionDrawCircle::hideOptions()
226 RS_ActionInterface::hideOptions();
229 void RS_ActionDrawCircle::updateMouseCursor()
231 graphicView->setMouseCursor(RS2::CadCursor);
234 void RS_ActionDrawCircle::updateToolBar()
238 if (RS_DIALOGFACTORY != NULL)
239 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
241 else if (RS_DIALOGFACTORY != NULL)
242 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarCircles);