X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcontainer.cpp;h=976172fb38220f094838a7cc806ab1fa482a9712;hb=dbfab6256efe6b03e9750e33081d9dcdcdfc1c34;hp=da491f617b8366ff71bacf1bba6b0ebda26a3bef;hpb=bb8d0671717bac2c5350e34024273381be1d8175;p=architektonas diff --git a/src/container.cpp b/src/container.cpp index da491f6..976172f 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -22,7 +22,8 @@ Container::Container(Vector p1, Object * p/*= NULL*/): Object(p1, p), isTopLevelContainer(false), - dragging(false), draggingHandle1(false), draggingHandle2(false)//, needUpdate(false) + dragging(false), draggingHandle1(false), draggingHandle2(false), + hit(false)//, needUpdate(false) { type = OTContainer; state = OSInactive; @@ -56,11 +57,18 @@ Container & Container::operator=(const Container & from) // Small problem with this approach: if the copied object goes out of scope, // all of the objects we copied in here will be deleted. D'oh! - for(uint i=0; i::const_iterator i; + +// for(uint i=0; iCopy(); - // Need to copy the object here... + // Need to actually COPY the object here, not copy the pointer only!! + // (which we do now, above :-P) objects.push_back(object); } @@ -73,8 +81,10 @@ Container & Container::operator=(const Container & from) { QRectF boundary; +//int a=1; for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) { +//printf("Containter::Draw item #%i [%X]...\n", a++, *i); (*i)->Draw(painter); boundary = boundary.united((*i)->Extents()); } @@ -153,6 +163,9 @@ printf("Container::Collided: Deleting object ($%X)\n", *i); } } + if (snapToGrid) + point = SnapPointToGrid(point); + // We check to see if the container we're trying to access is the // DrawingView's document. If so, we ignore the state of the container. // Otherwise, we care about the state of the container. :-) @@ -429,7 +442,6 @@ void Container::MoveContentsTo(Container * newContainer) return; // Shuffle the contents of this container to the new one -// for(unsigned int i=0; i::iterator i=objects.begin(); i!=objects.end(); i++) { newContainer->Add(*i); @@ -441,6 +453,18 @@ void Container::MoveContentsTo(Container * newContainer) } +void Container::CopyContentsTo(Container * newContainer) +{ + // Sanity check + if (newContainer == NULL) + return; + + // Shuffle the contents of this container to the new one + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + newContainer->Add((*i)->Copy()); +} + + void Container::MoveSelectedContentsTo(Container * newContainer) { // Sanity check @@ -463,6 +487,21 @@ void Container::MoveSelectedContentsTo(Container * newContainer) } +void Container::CopySelectedContentsTo(Container * newContainer) +{ + // Sanity check + if (newContainer == NULL) + return; + + // Shuffle the contents of this container to the new one + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + { + if ((*i)->state == OSSelected) + newContainer->Add((*i)->Copy()); + } +} + + void Container::ResizeAllDimensions(double newSize) { for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) @@ -480,7 +519,7 @@ void Container::ResizeAllDimensions(double newSize) // Only put "CONTAINER" markers if *not* the top level container // if (parent != NULL) if (!isTopLevelContainer) - fprintf(file, "CONTAINER\n"); + fprintf(file, "CONTAINER %i\n", layer); for(uint i=0; iEnumerate(file); @@ -490,3 +529,73 @@ void Container::ResizeAllDimensions(double newSize) fprintf(file, "ENDCONTAINER\n"); } + +/*virtual*/ Object * Container::Copy(void) +{ +#warning "!!! This doesn't take care of attached Dimensions !!!" +/* +This is a real problem. While having a pointer in the Dimension to this line's points +is fast & easy, it creates a huge problem when trying to replicate an object like this. + +Maybe a way to fix that then, is to have reference numbers instead of pointers. That +way, if you copy them, ... you might still have problems. Because you can't be sure if +a copy will be persistant or not, you then *definitely* do not want them to have the +same reference number. +*/ + Container * c = new Container(position, parent); + *c = *this; + return c; +} + + +/*virtual*/ void Container::Rotate(Point point, double angle) +{ + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + (*i)->Rotate(point, angle); +} + + +/*virtual*/ void Container::RotateSelected(Point point, double angle) +{ + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + { + if ((*i)->state == OSSelected) + (*i)->Rotate(point, angle); + } +} + + +/*virtual*/ void Container::Mirror(Point p1, Point p2) +{ + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + (*i)->Mirror(p1, p2); +} + + +/*virtual*/ void Container::MirrorSelected(Point p1, Point p2) +{ + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + { + if ((*i)->state == OSSelected) + (*i)->Mirror(p1, p2); + } +} + + +/*virtual*/ void Container::Save(void) +{ + Object::Save(); + + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + (*i)->Save(); +} + + +/*virtual*/ void Container::Restore(void) +{ + Object::Restore(); + + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + (*i)->Restore(); +} +