1 // actionblocksinsert.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. :-)
13 // JLH 06/03/2010 Scrubbed out all occurances of RS_CoordinateEvent
16 #include "actionblocksinsert.h"
19 #include "rs_commandevent.h"
20 #include "rs_creation.h"
21 #include "rs_dialogfactory.h"
22 #include "rs_modification.h"
23 #include "rs_preview.h"
28 ActionBlocksInsert::ActionBlocksInsert(RS_EntityContainer & container, GraphicView & graphicView):
29 ActionInterface("Blocks Insert", container, graphicView)
33 ActionBlocksInsert::~ActionBlocksInsert()
37 /*virtual*/ RS2::ActionType ActionBlocksInsert::rtti()
39 return RS2::ActionBlocksInsert;
42 void ActionBlocksInsert::init(int status /*= 0*/)
44 ActionInterface::init(status);
49 block = graphic->getActiveBlock();
52 data.name = block->getName();
58 void ActionBlocksInsert::reset()
60 data = RS_InsertData("", Vector(0.0, 0.0), Vector(1.0, 1.0), 0.0, 1, 1,
61 Vector(1.0, 1.0), NULL, RS2::Update);
64 void ActionBlocksInsert::trigger()
70 //RS_Modification m(*container, graphicView);
71 //m.paste(data.insertionPoint);
72 //std::cout << *RS_Clipboard::instance();
76 RS_Creation creation(container, graphicView);
77 data.updateMode = RS2::Update;
78 creation.createInsert(data);
81 graphicView->redraw();
84 void ActionBlocksInsert::mouseMoveEvent(QMouseEvent * e)
89 // data.insertionPoint = snapPoint(e);
90 data.insertionPoint = graphicView->snapper.snapPoint(e);
96 //preview->addAllFrom(*block);
97 //preview->move(data.insertionPoint);
98 // RS_Creation creation(preview, NULL, false);
99 RS_Creation creation(&(graphicView->preview), NULL, false);
100 // Create insert as preview only
101 data.updateMode = RS2::PreviewUpdate;
102 creation.createInsert(data);
112 void ActionBlocksInsert::mouseReleaseEvent(QMouseEvent * e)
114 if (e->button() == Qt::LeftButton)
116 // Vector ce(snapPoint(e));
117 Vector ce(graphicView->snapper.snapPoint(e));
118 coordinateEvent(&ce);
120 else if (e->button() == Qt::RightButton)
123 init(getStatus() - 1);
127 void ActionBlocksInsert::coordinateEvent(Vector * e)
132 data.insertionPoint = *e;
136 void ActionBlocksInsert::commandEvent(RS_CommandEvent * e)
138 QString c = e->getCommand().toLower();
140 if (checkCommand("help", c))
142 RS_DIALOGFACTORY->commandMessage(msgAvailableCommands()
143 + getAvailableCommands().join(", "));
151 if (checkCommand("angle", c))
156 lastStatus = (Status)getStatus();
159 else if (checkCommand("factor", c))
164 lastStatus = (Status)getStatus();
165 setStatus(SetFactor);
167 else if (checkCommand("columns", c))
172 lastStatus = (Status)getStatus();
173 setStatus(SetColumns);
175 else if (checkCommand("rows", c))
180 lastStatus = (Status)getStatus();
183 else if (checkCommand("columnspacing", c))
188 lastStatus = (Status)getStatus();
189 setStatus(SetColumnSpacing);
191 else if (checkCommand("rowspacing", c))
196 lastStatus = (Status)getStatus();
197 setStatus(SetRowSpacing);
204 double a = RS_Math::eval(c, &ok);
207 data.angle = RS_Math::deg2rad(a);
209 RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
211 RS_DIALOGFACTORY->requestOptions(this, true, true);
212 setStatus(lastStatus);
219 double f = RS_Math::eval(c, &ok);
224 RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
226 RS_DIALOGFACTORY->requestOptions(this, true, true);
227 setStatus(lastStatus);
234 int cols = (int)RS_Math::eval(c, &ok);
239 RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
241 RS_DIALOGFACTORY->requestOptions(this, true, true);
242 setStatus(lastStatus);
249 int rows = (int)RS_Math::eval(c, &ok);
254 RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
256 RS_DIALOGFACTORY->requestOptions(this, true, true);
257 setStatus(lastStatus);
261 case SetColumnSpacing:
264 double cs = (int)RS_Math::eval(c, &ok);
269 RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
271 RS_DIALOGFACTORY->requestOptions(this, true, true);
272 setStatus(lastStatus);
279 int rs = (int)RS_Math::eval(c, &ok);
284 RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression"));
286 RS_DIALOGFACTORY->requestOptions(this, true, true);
287 setStatus(lastStatus);
296 QStringList ActionBlocksInsert::getAvailableCommands()
303 cmd += command("angle");
304 cmd += command("factor");
305 cmd += command("columns");
306 cmd += command("rows");
307 cmd += command("columnspacing");
308 cmd += command("rowspacing");
318 void ActionBlocksInsert::showOptions()
320 ActionInterface::showOptions();
321 RS_DIALOGFACTORY->requestOptions(this, true);
324 void ActionBlocksInsert::hideOptions()
326 ActionInterface::hideOptions();
327 RS_DIALOGFACTORY->requestOptions(this, false);
330 void ActionBlocksInsert::updateMouseButtonHints()
335 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify reference point"), tr("Cancel"));
339 RS_DIALOGFACTORY->updateMouseWidget(tr("Enter angle:"), "");
343 RS_DIALOGFACTORY->updateMouseWidget(tr("Enter factor:"), "");
347 RS_DIALOGFACTORY->updateMouseWidget(tr("Enter columns:"), "");
351 RS_DIALOGFACTORY->updateMouseWidget(tr("Enter rows:"), "");
354 case SetColumnSpacing:
355 RS_DIALOGFACTORY->updateMouseWidget(tr("Enter column spacing:"), "");
359 RS_DIALOGFACTORY->updateMouseWidget(tr("Enter row spacing:"), "");
363 RS_DIALOGFACTORY->updateMouseWidget("", "");
368 void ActionBlocksInsert::updateMouseCursor()
370 graphicView->setMouseCursor(RS2::CadCursor);
373 void ActionBlocksInsert::updateToolBar()
376 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
378 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarMain);
381 double ActionBlocksInsert::getAngle()
386 void ActionBlocksInsert::setAngle(double a)
391 double ActionBlocksInsert::getFactor()
393 return data.scaleFactor.x;
396 void ActionBlocksInsert::setFactor(double f)
398 data.scaleFactor = Vector(f, f);
401 int ActionBlocksInsert::getColumns()
406 void ActionBlocksInsert::setColumns(int c)
411 int ActionBlocksInsert::getRows()
416 void ActionBlocksInsert::setRows(int r)
421 double ActionBlocksInsert::getColumnSpacing()
423 return data.spacing.x;
426 void ActionBlocksInsert::setColumnSpacing(double cs)
431 double ActionBlocksInsert::getRowSpacing()
433 return data.spacing.y;
436 void ActionBlocksInsert::setRowSpacing(double rs)