]> Shamusworld >> Repos - architektonas/blob - src/actions/actiondefault.cpp
In the middle of major refactoring...
[architektonas] / src / actions / actiondefault.cpp
1 // actiondefault.cpp
2 //
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
7 //
8 // JLH = James L. Hammons <jlhamm@acm.org>
9 //
10 // Who  When        What
11 // ---  ----------  -----------------------------------------------------------
12 // JLH  06/03/2010  Added this text. :-)
13 //
14
15 #include "actiondefault.h"
16
17 #include "rs.h"
18 #include "rs_commandevent.h"
19 #include "rs_dialogfactory.h"
20 #include "rs_line.h"
21 #include "rs_modification.h"
22 #include "rs_preview.h"
23 #include "rs_snapper.h"
24 #include "rs_selection.h"
25
26 /**
27  * Constructor.
28  */
29 ActionDefault::ActionDefault(RS_EntityContainer & container,
30         GraphicView & graphicView): ActionInterface("Default",
31         container, graphicView)
32 {
33         RS_DEBUG->print("ActionDefault::ActionDefault");
34         RS_DEBUG->print("ActionDefault::ActionDefault: OK");
35 }
36
37 ActionDefault::~ActionDefault()
38 {
39 }
40
41 /*virtual*/ RS2::ActionType ActionDefault::rtti()
42 {
43         return RS2::ActionDefault;
44 }
45
46 void ActionDefault::init(int status /*= 0*/)
47 {
48         RS_DEBUG->print("ActionDefault::init");
49
50         ActionInterface::init(status);
51         v1 = v2 = Vector(false);
52 //      snapMode = RS2::SnapFree;
53 //      snapRes = RS2::RestrictNothing;
54         restrBak = RS2::RestrictNothing;
55         RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarMain);
56
57         RS_DEBUG->print("ActionDefault::init: OK");
58 }
59
60 void ActionDefault::trigger()
61 {
62         ActionInterface::trigger();
63 }
64
65 void ActionDefault::keyPressEvent(QKeyEvent * e)
66 {
67         if (e->key() == Qt::Key_Shift)
68         {
69 //              restrBak = snapRes;
70 //              setSnapRestriction(RS2::RestrictOrthogonal);
71         }
72 }
73
74 void ActionDefault::keyReleaseEvent(QKeyEvent * e)
75 {
76 //      if (e->key() == Qt::Key_Shift)
77 //              setSnapRestriction(restrBak);
78 }
79
80 void ActionDefault::mouseMoveEvent(QMouseEvent * e)
81 {
82         Vector mouse = graphicView->toGraph(Vector(e->x(), e->y()));
83         Vector relMouse = mouse - graphicView->getRelativeZero();
84
85         RS_DIALOGFACTORY->updateCoordinateWidget(mouse, relMouse);
86
87         switch (getStatus())
88         {
89         case Dragging:
90                 v2 = mouse;
91
92                 if (graphicView->toGuiDX(v1.distanceTo(v2)) > 10)
93                 {
94                         // look for reference points to drag:
95                         double dist;
96                         Vector ref = container->getNearestSelectedRef(v1, &dist);
97
98                         if (ref.valid && graphicView->toGuiDX(dist) < 8)
99                         {
100                                 RS_DEBUG->print("ActionDefault::mouseMoveEvent: "
101                                         "moving reference point");
102                                 setStatus(MovingRef);
103                                 v1 = ref;
104                                 graphicView->moveRelativeZero(v1);
105                         }
106                         else
107                         {
108                                 // test for an entity to drag:
109                                 RS_Entity * en = graphicView->snapper.catchEntity(v1);
110
111                                 if (en && en->isSelected())
112                                 {
113                                         RS_DEBUG->print("ActionDefault::mouseMoveEvent: "
114                                                 "moving entity");
115                                         setStatus(Moving);
116                                         v1 = en->getNearestRef(v1);
117                                         graphicView->moveRelativeZero(v1);
118                                 }
119                                 // no entity found. start area selection:
120                                 else
121                                         setStatus(SetCorner2);
122                         }
123                 }
124
125                 break;
126
127         case MovingRef:
128                 v2 = snapPoint(e);
129
130 //              deletePreview();
131 //              clearPreview();
132 //              preview->addSelectionFrom(*container);
133 //              preview->moveRef(v1, v2 - v1);
134 //              drawPreview();
135                 break;
136
137         case Moving:
138                 v2 = snapPoint(e);
139
140 //              deletePreview();
141 //              clearPreview();
142 //              preview->addSelectionFrom(*container);
143 //              preview->move(v2 - v1);
144 //              drawPreview();
145                 break;
146
147         case SetCorner2:
148                 if (v1.valid)
149                 {
150                         v2 = mouse;
151
152 //                      deletePreview();
153 //                      clearPreview();
154
155 //                      preview->addEntity(new RS_Line(preview,
156 //                              RS_LineData(Vector(v1.x, v1.y), Vector(v2.x, v1.y))));
157 //                      preview->addEntity(new RS_Line(preview,
158 //                              RS_LineData(Vector(v2.x, v1.y), Vector(v2.x, v2.y))));
159 //                      preview->addEntity(new RS_Line(preview,
160 //                              RS_LineData(Vector(v2.x, v2.y), Vector(v1.x, v2.y))));
161 //                      preview->addEntity(new RS_Line(preview,
162 //                              RS_LineData(Vector(v1.x, v2.y), Vector(v1.x, v1.y))));
163 //                      drawPreview();
164                 }
165
166         default:
167                 break;
168         }
169 }
170
171 void ActionDefault::mousePressEvent(QMouseEvent * e)
172 {
173         if (e->button() == Qt::LeftButton)
174         {
175                 switch (getStatus())
176                 {
177                 case Neutral:
178                         v1 = graphicView->toGraph(e->x(), e->y());
179                         setStatus(Dragging);
180                         break;
181
182                 case Moving:
183                 {
184                         v2 = snapPoint(e);
185 //                      deleteSnapper();
186 //                      deletePreview();
187 //                      clearPreview();
188                         RS_Modification m(*container, graphicView);
189                         RS_MoveData data;
190                         data.number = 0;
191                         data.useCurrentLayer = false;
192                         data.useCurrentAttributes = false;
193                         data.offset = v2 - v1;
194                         m.move(data);
195                         setStatus(Neutral);
196                         RS_DIALOGFACTORY->updateSelectionWidget(container->countSelected());
197                         RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarMain);
198                 }
199                 break;
200
201                 case MovingRef:
202                 {
203                         v2 = snapPoint(e);
204 //                      deleteSnapper();
205 //                      deletePreview();
206 //                      clearPreview();
207                         RS_Modification m(*container, graphicView);
208                         RS_MoveRefData data;
209                         data.ref = v1;
210                         data.offset = v2 - v1;
211                         m.moveRef(data);
212                         setStatus(Neutral);
213                         RS_DIALOGFACTORY->updateSelectionWidget(container->countSelected());
214                         RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarMain);
215                 }
216                 break;
217
218                 default:
219                         break;
220                 }
221         }
222 }
223
224 void ActionDefault::mouseReleaseEvent(QMouseEvent * e)
225 {
226         RS_DEBUG->print("ActionDefault::mouseReleaseEvent()");
227
228         if (e->button() == Qt::LeftButton)
229         {
230                 v2 = graphicView->toGraph(e->x(), e->y());
231
232                 switch (getStatus())
233                 {
234                 case Dragging:
235                 {
236                         // select single entity:
237                         RS_Entity * en = graphicView->snapper.catchEntity(e);
238
239                         if (en)
240                         {
241 //                              deleteSnapper();
242 //                              deletePreview();
243 //                              clearPreview();
244
245                                 RS_Selection s(*container, graphicView);
246                                 s.selectSingle(en);
247
248                                 RS_DIALOGFACTORY->updateSelectionWidget(container->countSelected());
249
250                                 e->accept();
251                                 setStatus(Neutral);
252                         }
253                         else
254                                 setStatus(SetCorner2);
255                 }
256                 break;
257
258                 case SetCorner2:
259                 {
260                         v2 = graphicView->toGraph(e->x(), e->y());
261
262                         // select window:
263 //                      deleteSnapper();
264 //                      deletePreview();
265 //                      clearPreview();
266
267                         bool cross = (v2.y > v1.y);
268                         RS_Selection s(*container, graphicView);
269                         s.selectWindow(v1, v2, true, cross);
270
271                         RS_DIALOGFACTORY->updateSelectionWidget(container->countSelected());
272
273                         setStatus(Neutral);
274                         e->accept();
275                 }
276                 break;
277
278                 default:
279                         break;
280                 }
281         }
282         else if (e->button() == Qt::RightButton)
283         {
284                 switch (getStatus())
285                 {
286                 case SetCorner2:
287                 case Moving:
288                 case MovingRef:
289 //                      deletePreview();
290 //                      clearPreview();
291 //                      deleteSnapper();
292                         setStatus(Neutral);
293                         RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarMain);
294                         e->accept();
295                         break;
296
297                 default:
298                         graphicView->snapper.SetVisible(false);
299                         graphicView->preview.SetVisible(false);
300                         RS_DIALOGFACTORY->requestPreviousMenu();
301                         e->accept();
302                         break;
303                 }
304         }
305 }
306
307 void ActionDefault::commandEvent(RS_CommandEvent * e)
308 {
309         QString c = e->getCommand().toLower();
310 }
311
312 QStringList ActionDefault::getAvailableCommands()
313 {
314         QStringList cmd;
315
316         return cmd;
317 }
318
319 void ActionDefault::updateMouseButtonHints()
320 {
321         switch (getStatus())
322         {
323         case Neutral:
324                 RS_DIALOGFACTORY->updateMouseWidget("", "");
325                 break;
326
327         case SetCorner2:
328                 RS_DIALOGFACTORY->updateMouseWidget(tr("Drag to second point"), tr("Back"));
329                 break;
330
331         default:
332                 RS_DIALOGFACTORY->updateMouseWidget("", "");
333                 break;
334         }
335 }
336
337 void ActionDefault::updateMouseCursor()
338 {
339         switch (getStatus())
340         {
341         case Neutral:
342                 graphicView->setMouseCursor(RS2::ArrowCursor);
343                 break;
344
345         case Moving:
346         case MovingRef:
347                 graphicView->setMouseCursor(RS2::SelectCursor);
348                 break;
349
350         default:
351                 break;
352         }
353 }
354
355 void ActionDefault::updateToolBar()
356 {
357         switch (getStatus())
358         {
359         case Neutral:
360                 break;
361
362         case Moving:
363         case MovingRef:
364                 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
365                 break;
366
367         default:
368                 break;
369         }
370 }