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 "rs_commandevent.h"
20 #include "rs_dialogfactory.h"
21 #include "graphicview.h"
22 #include "rs_preview.h"
24 ActionDrawCircle::ActionDrawCircle(RS_EntityContainer & container, GraphicView & graphicView):
25 ActionInterface("Draw circles", container, graphicView)
30 ActionDrawCircle::~ActionDrawCircle()
34 /*virtual*/ RS2::ActionType ActionDrawCircle::rtti()
36 return RS2::ActionDrawCircle;
39 void ActionDrawCircle::reset()
41 data = RS_CircleData(Vector(false), 0.0);
44 void ActionDrawCircle::init(int status)
46 ActionInterface::init(status);
51 void ActionDrawCircle::trigger()
53 ActionInterface::trigger();
55 RS_Circle * circle = new RS_Circle(container, data);
56 circle->setLayerToActive();
57 circle->setPenToActive();
58 container->addEntity(circle);
63 document->startUndoCycle();
64 document->addUndoable(circle);
65 document->endUndoCycle();
69 Vector rz = graphicView->getRelativeZero();
70 graphicView->moveRelativeZero(Vector(0.0, 0.0));
71 graphicView->drawEntity(circle);
72 graphicView->moveRelativeZero(circle->getCenter());
78 RS_DEBUG->print("ActionDrawCircle::trigger(): circle added: %d", circle->getId());
81 void ActionDrawCircle::mouseMoveEvent(QMouseEvent * e)
83 RS_DEBUG->print("ActionDrawCircle::mouseMoveEvent begin");
85 Vector mouse = snapPoint(e);
95 if (data.center.valid)
97 data.radius = data.center.distanceTo(mouse);
100 // preview->addEntity(new RS_Circle(preview, data));
106 RS_DEBUG->print("ActionDrawCircle::mouseMoveEvent end");
109 void ActionDrawCircle::mouseReleaseEvent(QMouseEvent * e)
111 if (e->button() == Qt::LeftButton)
113 Vector ce(snapPoint(e));
114 coordinateEvent(&ce);
116 else if (e->button() == Qt::RightButton)
120 init(getStatus() - 1);
124 void ActionDrawCircle::coordinateEvent(Vector * e)
135 graphicView->moveRelativeZero(mouse);
136 setStatus(SetRadius);
141 if (data.center.valid)
143 graphicView->moveRelativeZero(mouse);
144 data.radius = data.center.distanceTo(mouse);
147 //setStatus(SetCenter);
155 void ActionDrawCircle::commandEvent(RS_CommandEvent * e)
157 QString c = e->getCommand().toLower();
159 if (checkCommand("help", c))
161 if (RS_DIALOGFACTORY)
162 RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
163 + getAvailableCommands().join(", "));
172 double r = RS_Math::eval(c, &ok);
176 else if (RS_DIALOGFACTORY)
177 RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
180 //setStatus(SetCenter);
189 QStringList ActionDrawCircle::getAvailableCommands()
195 void ActionDrawCircle::updateMouseButtonHints()
200 if (RS_DIALOGFACTORY)
201 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify center"), tr("Cancel"));
205 if (RS_DIALOGFACTORY)
206 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify radius"), tr("Back"));
210 if (RS_DIALOGFACTORY)
211 RS_DIALOGFACTORY->updateMouseWidget("", "");
216 void ActionDrawCircle::showOptions()
218 ActionInterface::showOptions();
221 void ActionDrawCircle::hideOptions()
223 ActionInterface::hideOptions();
226 void ActionDrawCircle::updateMouseCursor()
228 graphicView->setMouseCursor(RS2::CadCursor);
231 void ActionDrawCircle::updateToolBar()
235 if (RS_DIALOGFACTORY)
236 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
238 else if (RS_DIALOGFACTORY)
239 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarCircles);