1 // 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 // Portions copyright (C) 2001-2003 RibbonSoft
7 // Copyright (C) 2010 Underground Software
8 // See the README and GPLv2 files for licensing and warranty information
10 // JLH = James L. Hammons <jlhamm@acm.org>
13 // --- ---------- -----------------------------------------------------------
14 // JLH 06/03/2010 Added this text. :-)
17 #include "actiondrawcircle.h"
19 #include "commandevent.h"
21 #include "dialogfactory.h"
22 #include "graphicview.h"
25 ActionDrawCircle::ActionDrawCircle(EntityContainer & container, GraphicView & graphicView):
26 ActionInterface("Draw circles", container, graphicView)
31 ActionDrawCircle::~ActionDrawCircle()
35 /*virtual*/ RS2::ActionType ActionDrawCircle::rtti()
37 return RS2::ActionDrawCircle;
40 void ActionDrawCircle::reset()
42 data = CircleData(Vector(false), 0.0);
45 void ActionDrawCircle::init(int status)
47 ActionInterface::init(status);
52 void ActionDrawCircle::trigger()
54 ActionInterface::trigger();
56 Circle * circle = new Circle(container, data);
57 circle->setLayerToActive();
58 circle->setPenToActive();
59 container->addEntity(circle);
64 document->startUndoCycle();
65 document->addUndoable(circle);
66 document->endUndoCycle();
70 Vector rz = graphicView->getRelativeZero();
71 graphicView->moveRelativeZero(Vector(0.0, 0.0));
72 graphicView->drawEntity(circle);
73 graphicView->moveRelativeZero(circle->getCenter());
79 DEBUG->print("ActionDrawCircle::trigger(): circle added: %d", circle->getId());
82 void ActionDrawCircle::mouseMoveEvent(QMouseEvent * e)
84 DEBUG->print("ActionDrawCircle::mouseMoveEvent begin");
86 Vector mouse = snapPoint(e);
96 if (data.center.valid)
98 data.radius = data.center.distanceTo(mouse);
101 // preview->addEntity(new Circle(preview, data));
107 DEBUG->print("ActionDrawCircle::mouseMoveEvent end");
110 void ActionDrawCircle::mouseReleaseEvent(QMouseEvent * e)
112 if (e->button() == Qt::LeftButton)
114 Vector ce(snapPoint(e));
115 coordinateEvent(&ce);
117 else if (e->button() == Qt::RightButton)
121 init(getStatus() - 1);
125 void ActionDrawCircle::coordinateEvent(Vector * e)
136 graphicView->moveRelativeZero(mouse);
137 setStatus(SetRadius);
142 if (data.center.valid)
144 graphicView->moveRelativeZero(mouse);
145 data.radius = data.center.distanceTo(mouse);
148 //setStatus(SetCenter);
156 void ActionDrawCircle::commandEvent(CommandEvent * e)
158 QString c = e->getCommand().toLower();
160 if (checkCommand("help", c))
163 DIALOGFACTORY->commandMessage(msgAvailableCommands()
164 + getAvailableCommands().join(", "));
173 double r = Math::eval(c, &ok);
177 else if (DIALOGFACTORY)
178 DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
181 //setStatus(SetCenter);
190 QStringList ActionDrawCircle::getAvailableCommands()
196 void ActionDrawCircle::updateMouseButtonHints()
202 DIALOGFACTORY->updateMouseWidget(tr("Specify center"), tr("Cancel"));
207 DIALOGFACTORY->updateMouseWidget(tr("Specify radius"), tr("Back"));
212 DIALOGFACTORY->updateMouseWidget("", "");
217 void ActionDrawCircle::showOptions()
219 ActionInterface::showOptions();
222 void ActionDrawCircle::hideOptions()
224 ActionInterface::hideOptions();
227 void ActionDrawCircle::updateMouseCursor()
229 graphicView->setMouseCursor(RS2::CadCursor);
232 void ActionDrawCircle::updateToolBar()
237 DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
239 else if (DIALOGFACTORY)
240 DIALOGFACTORY->requestToolBar(RS2::ToolBarCircles);