]> Shamusworld >> Repos - architektonas/blob - src/object.cpp
Various fixes to Container/Group handling, added DrawArcAction.
[architektonas] / src / object.cpp
1 //
2 // object.cpp: Base class for all CAD objects
3 //
4 // Part of the Architektonas Project
5 // (C) 2011 Underground Software
6 // See the README and GPLv3 files for licensing and warranty information
7 //
8 // JLH = James Hammons <jlhamm@acm.org>
9 //
10 // WHO  WHEN        WHAT
11 // ---  ----------  ------------------------------------------------------------
12 // JLH  03/22/2011  Created this file
13 // JLH  04/01/2011  Added constructor to allow derived objects to have empty
14 //                  constructor bodies, added state querying
15 // JLH  04/02/2001  Added static methods for global states (fixed angle, etc)
16 //
17
18 #include "object.h"
19 #include <stdlib.h>
20
21 // Initialize static variables
22 bool Object::fixedAngle = false;
23 bool Object::fixedLength = false;
24 QFont * Object::font = 0;
25 int Object::viewportHeight = 0;
26 bool Object::deleteActive = false;
27 bool Object::dimensionActive = false;
28 bool Object::snapToGrid = true;
29 //snapToPoints all well here?
30 bool Object::ignoreClicks = false;
31 bool Object::dontMove = false;
32 bool Object::selectionInProgress = false;
33 QRectF Object::selection;
34
35
36 Object::Object(): position(Vector(0, 0)), parent(0), type(OTObject),
37         state(OSInactive), oldState(OSInactive), needUpdate(false)
38         //, attachedDimension(0)
39 {
40 }
41
42
43 Object::Object(Vector v,  Object * passedInParent/*= 0*/): position(v), parent(passedInParent),
44         state(OSInactive), oldState(OSInactive), needUpdate(false)//, attachedDimension(0)
45 {
46 }
47
48
49 Object::~Object()
50 {
51 printf("Object: Destroyed!\n");
52         for(uint i=0; i<connected.size(); i++)
53                 connected[i].object->DisconnectAll(this);
54 }
55
56
57 /*virtual*/ void Object::Draw(Painter *)
58 {
59 }
60
61
62 /*virtual*/ Vector Object::Center(void)
63 {
64         return Vector();
65 }
66
67
68 /*virtual*/ bool Object::Collided(Vector)
69 {
70         return false;
71 }
72
73
74 /*virtual*/ void Object::PointerMoved(Vector)
75 {
76 }
77
78
79 /*virtual*/ void Object::PointerReleased(void)
80 {
81 }
82
83
84 /*virtual*/ bool Object::NeedsUpdate(void)
85 {
86         return needUpdate;
87 }
88
89
90 /*virtual*/ bool Object::HitTest(Point)
91 {
92         return false;
93 }
94
95
96 // This is intended to be overridden by the Container class, for object morphing
97 /*virtual*/ void Object::Transmute(Object *, Object *)
98 {
99 }
100
101
102 /*virtual*/ Object * Object::GetParent(void)
103 {
104         return parent;
105 }
106
107
108 /*virtual*/ void Object::Add(Object *)
109 {
110 }
111
112
113 // This returns a pointer to the point passed in, if it coincides. Otherwise returns NULL.
114 /*virtual*/ Vector * Object::GetPointAt(Vector)
115 {
116         return 0;
117 }
118
119
120 // This is meant for writing object data to a file.
121 /*virtual*/ void Object::Enumerate(FILE *)
122 {
123 }
124
125
126 /*virtual*/ Object * Object::Copy(void)
127 {
128         return new Object(position, parent);
129 }
130
131
132 // This returns a point on the object at 'parameter', which is between 0 and 1.
133 // Default is to return the object's position.
134 /*virtual*/ Vector Object::GetPointAtParameter(double)
135 {
136         return position;
137 }
138
139
140 // Since these functions are pretty much non-object specific, we can implement
141 // them here. :-)
142 /*virtual*/ void Object::Connect(Object * obj, double parameter)
143 {
144         connected.push_back(Connection(obj, parameter));
145 }
146
147
148 /*virtual*/ void Object::Disconnect(Object * obj, double parameter)
149 {
150         for(uint i=0; i<connected.size(); i++)
151         {
152                 if (connected[i].object == obj && connected[i].t == parameter)
153                 {
154                         connected.erase(connected.begin() + i);
155                         return;
156                 }
157         }
158 }
159
160
161 /*virtual*/ void Object::DisconnectAll(Object * obj)
162 {
163         // According the std::vector docs, only items at position i and beyond are
164         // invalidated, everything before i is still valid. So we use that here.
165         for(uint i=0; i<connected.size();)
166         {
167                 // If we found our object, erase it from the vector but don't advance
168                 // the iterator. Otherwise, advance the iterator. :-)
169                 if (connected[i].object == obj)
170                         connected.erase(connected.begin() + i);
171                 else
172                         i++;
173         }
174 }
175
176
177 /*virtual*/ QRectF Object::Extents(void)
178 {
179         // Generic object returns an empty rect...
180         return QRectF();
181 }
182
183
184 #if 0
185 /*virtual*/ ObjectType Object::Type(void)
186 {
187         return OTObject;
188 }
189 #endif
190
191
192 /*virtual*/ void Object::Translate(Vector amount)
193 {
194         position += amount;
195 }
196
197
198 /*virtual*/ void Object::Rotate(Vector, double)
199 {
200 }
201
202
203 /*virtual*/ void Object::Scale(Vector, double)
204 {
205 }
206
207
208 ObjectState Object::GetState(void)
209 {
210         return state;
211 }
212
213
214 void Object::Reparent(Object * newParent)
215 {
216         parent = newParent;
217 }
218
219
220 /*Dimension * Object::GetAttachedDimension(void)
221 {
222         return attachedDimension;
223 }*/
224
225
226 // Class methods...
227
228 void Object::SetFixedAngle(bool state/*= true*/)
229 {
230         fixedAngle = state;
231 }
232
233
234 void Object::SetFixedLength(bool state/*= true*/)
235 {
236         fixedLength = state;
237 }
238
239
240 void Object::SetFont(QFont * f)
241 {
242         font = f;
243 }
244
245
246 void Object::SetViewportHeight(int height)
247 {
248         viewportHeight = height;
249 }
250
251
252 void Object::SetDeleteActive(bool state/*= true*/)
253 {
254         deleteActive = state;
255 }
256
257
258 void Object::SetDimensionActive(bool state/*= true*/)
259 {
260         dimensionActive = state;
261 }
262
263
264 void Object::SetSnapMode(bool state/*= true*/)
265 {
266         snapToGrid = state;
267 }