X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fobject.cpp;h=2e85bf2d3e57c0b9666099dfb81a5a796d2692ac;hb=8a5bf49d09b5a00ebea3ffc449519ad05b0326cc;hp=404d30576113a97ad9516b04677d087f81ad4346;hpb=89b8b0c60579d8ef0cf9a13521e7bf7c7864883f;p=architektonas diff --git a/src/object.cpp b/src/object.cpp index 404d305..2e85bf2 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -17,6 +17,7 @@ #include "object.h" #include +#include // Initialize static variables bool Object::fixedAngle = false; @@ -31,17 +32,19 @@ bool Object::ignoreClicks = false; bool Object::dontMove = false; bool Object::selectionInProgress = false; QRectF Object::selection; +double Object::gridSpacing; +int Object::currentLayer = 0; Object::Object(): position(Vector(0, 0)), parent(0), type(OTObject), - state(OSInactive), oldState(OSInactive), needUpdate(false) + state(OSInactive), layer(0), oldState(OSInactive), needUpdate(false) //, attachedDimension(0) { } Object::Object(Vector v, Object * passedInParent/*= 0*/): position(v), - parent(passedInParent), state(OSInactive), oldState(OSInactive), + parent(passedInParent), state(OSInactive), layer(0), oldState(OSInactive), needUpdate(false)//, attachedDimension(0) { } @@ -72,8 +75,9 @@ printf("Object: Destroyed!\n"); } -/*virtual*/ void Object::PointerMoved(Vector) +/*virtual*/ bool Object::PointerMoved(Vector) { + return false; } @@ -142,22 +146,24 @@ printf("Object: Destroyed!\n"); // them here. :-) /*virtual*/ void Object::Connect(Object * obj, double parameter) { - connected.push_back(Connection(obj, parameter)); + // Check to see if this connection is already in our list... + Connection c(obj, parameter); + std::vector::iterator i; + + for(i=connected.begin(); i!=connected.end(); i++) + { + // Bail out if this connection is already present... + if (*i == c) + return; + } + + // Connection is a new one, add it in... + connected.push_back(c); } /*virtual*/ void Object::Disconnect(Object * obj, double parameter) { -#if 0 - for(uint i=0; i::iterator i; for(i=connected.begin(); i!=connected.end(); i++) @@ -168,25 +174,11 @@ printf("Object: Destroyed!\n"); return; } } -#endif } /*virtual*/ void Object::DisconnectAll(Object * obj) { -#if 0 - // According the std::vector docs, only items at position i and beyond are - // invalidated, everything before i is still valid. So we use that here. - for(uint i=0; i::iterator i; for(i=connected.begin(); i!=connected.end(); ) @@ -196,7 +188,6 @@ printf("Object: Destroyed!\n"); else i++; } -#endif } @@ -221,16 +212,33 @@ printf("Object: Destroyed!\n"); } -/*virtual*/ void Object::Rotate(Vector, double) +/*virtual*/ void Object::Rotate(Point, double) +{ +} + + +/*virtual*/ void Object::Scale(Point, double) { } -/*virtual*/ void Object::Scale(Vector, double) +/*virtual*/ void Object::Mirror(Point, Point) { } +/*virtual*/ void Object::Save(void) +{ + oldPosition = position; +} + + +/*virtual*/ void Object::Restore(void) +{ + position = oldPosition; +} + + ObjectState Object::GetState(void) { return state; @@ -291,3 +299,25 @@ void Object::SetSnapMode(bool state/*= true*/) { snapToGrid = state; } + + +// +// This looks strange, but it's really quite simple: We want a point that's +// more than half-way to the next grid point to snap there while conversely we +// want a point that's less than half-way to to the next grid point then snap +// to the one before it. So we add half of the grid spacing to the point, then +// divide by it so that we can remove the fractional part, then multiply it +// back to get back to the correct answer. +// +Vector Object::SnapPointToGrid(Vector point) +{ + point += gridSpacing / 2.0; // *This* adds to Z!!! + point /= gridSpacing; + point.x = floor(point.x);//need to fix this for negative numbers... + point.y = floor(point.y); + point.z = 0; // Make *sure* Z doesn't go anywhere!!! + point *= gridSpacing; + return point; +} + +