]> Shamusworld >> Repos - architektonas/blob - src/actions/actionmodifystretch.cpp
Last checkin before major refactor...
[architektonas] / src / actions / actionmodifystretch.cpp
1 // actionmodifystretch.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/04/2010  Added this text. :-)
13 //
14
15 #include "actionmodifystretch.h"
16
17 #include "rs_dialogfactory.h"
18 #include "rs_modification.h"
19 #include "rs_preview.h"
20
21 ActionModifyStretch::ActionModifyStretch(RS_EntityContainer & container,
22         GraphicView & graphicView): ActionInterface("Stretch Entities",
23                 container, graphicView)
24 {
25         firstCorner = Vector(false);
26         secondCorner = Vector(false);
27         referencePoint = Vector(false);
28         targetPoint = Vector(false);
29 }
30
31 ActionModifyStretch::~ActionModifyStretch()
32 {
33 }
34
35 void ActionModifyStretch::init(int status)
36 {
37         ActionInterface::init(status);
38 }
39
40 void ActionModifyStretch::trigger()
41 {
42         RS_DEBUG->print("ActionModifyStretch::trigger()");
43
44         deletePreview();
45         clearPreview();
46
47         deleteSnapper();
48
49         RS_Modification m(*container, graphicView);
50         m.stretch(firstCorner, secondCorner, targetPoint - referencePoint);
51
52         drawSnapper();
53
54         setStatus(SetFirstCorner);
55
56         RS_DIALOGFACTORY->updateSelectionWidget(container->countSelected());
57 }
58
59 void ActionModifyStretch::mouseMoveEvent(QMouseEvent * e)
60 {
61         RS_DEBUG->print("ActionModifyStretch::mouseMoveEvent begin");
62
63         Vector mouse = snapPoint(e);
64
65         switch (getStatus())
66         {
67         case SetFirstCorner:
68                 break;
69
70         case SetSecondCorner:
71                 if (firstCorner.valid)
72                 {
73                         secondCorner = snapPoint(e);
74                         deletePreview();
75                         clearPreview();
76 /*                      preview->addEntity(
77                                 new RS_Line(preview, RS_LineData(Vector(firstCorner.x, firstCorner.y),
78                                         Vector(secondCorner.x, firstCorner.y))));
79                         preview->addEntity(
80                                 new RS_Line(preview, RS_LineData(Vector(secondCorner.x, firstCorner.y),
81                                                 Vector(secondCorner.x, secondCorner.y))));
82                         preview->addEntity(
83                                 new RS_Line(preview, RS_LineData(Vector(secondCorner.x, secondCorner.y),
84                                                 Vector(firstCorner.x, secondCorner.y))));
85                         preview->addEntity(
86                                 new RS_Line(preview, RS_LineData(Vector(firstCorner.x, secondCorner.y),
87                                                 Vector(firstCorner.x, firstCorner.y))));*/
88                         drawPreview();
89                 }
90
91                 break;
92
93         case SetReferencePoint:
94                 break;
95
96         case SetTargetPoint:
97                 if (referencePoint.valid)
98                 {
99                         targetPoint = mouse;
100
101                         deletePreview();
102                         clearPreview();
103 /*                      preview->addStretchablesFrom(*container, firstCorner, secondCorner);
104                         preview->stretch(firstCorner, secondCorner, targetPoint - referencePoint);*/
105                         drawPreview();
106                 }
107
108                 break;
109
110         default:
111                 break;
112         }
113
114         RS_DEBUG->print("ActionModifyStretch::mouseMoveEvent end");
115 }
116
117 void ActionModifyStretch::mouseReleaseEvent(QMouseEvent * e)
118 {
119         if (e->button() == Qt::LeftButton)
120         {
121                 Vector ce(snapPoint(e));
122                 coordinateEvent(&ce);
123         }
124         else if (e->button() == Qt::RightButton)
125         {
126                 deletePreview();
127                 deleteSnapper();
128                 init(getStatus() - 1);
129         }
130 }
131
132 void ActionModifyStretch::coordinateEvent(Vector * e)
133 {
134         if (e == NULL)
135                 return;
136
137         Vector mouse = *e;
138
139         switch (getStatus())
140         {
141         case SetFirstCorner:
142                 firstCorner = mouse;
143                 setStatus(SetSecondCorner);
144                 break;
145
146         case SetSecondCorner:
147                 secondCorner = mouse;
148                 deletePreview();
149                 clearPreview();
150                 setStatus(SetReferencePoint);
151                 break;
152
153         case SetReferencePoint:
154                 referencePoint = mouse;
155                 graphicView->moveRelativeZero(referencePoint);
156                 setStatus(SetTargetPoint);
157                 break;
158
159         case SetTargetPoint:
160                 targetPoint = mouse;
161                 graphicView->moveRelativeZero(targetPoint);
162                 trigger();
163                 //finish();
164                 break;
165
166         default:
167                 break;
168         }
169 }
170
171 void ActionModifyStretch::updateMouseButtonHints()
172 {
173         switch (getStatus())
174         {
175         case SetFirstCorner:
176                 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify first corner"),
177                         tr("Cancel"));
178                 break;
179
180         case SetSecondCorner:
181                 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify second corner"),
182                         tr("Back"));
183                 break;
184
185         case SetReferencePoint:
186                 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify reference point"),
187                         tr("Back"));
188                 break;
189
190         case SetTargetPoint:
191                 RS_DIALOGFACTORY->updateMouseWidget(tr("Specify target point"),
192                         tr("Back"));
193                 break;
194
195         default:
196                 RS_DIALOGFACTORY->updateMouseWidget("", "");
197                 break;
198         }
199 }
200
201 void ActionModifyStretch::updateMouseCursor()
202 {
203         graphicView->setMouseCursor(RS2::CadCursor);
204 }
205
206 void ActionModifyStretch::updateToolBar()
207 {
208         if (!isFinished())
209                 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarSnap);
210         else
211                 RS_DIALOGFACTORY->requestToolBar(RS2::ToolBarModify);
212 }
213
214