X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcontainer.cpp;h=9c3d403bf74b8864af6cfea0b0a4a0f2e036c520;hb=7f3a6b11585376eecd80979ec3da2346c5314d88;hp=77d1771416d47ae112be9c1e74fd5d663a408200;hpb=11cff81f10ccca1b31288fce04d696e715b922b0;p=architektonas diff --git a/src/container.cpp b/src/container.cpp index 77d1771..9c3d403 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; @@ -53,22 +54,12 @@ Container & Container::operator=(const Container & from) return *this; Clear(); - - // 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 this COPY constructor to be meaningful, we have to actually COPY the - // objects in this Container, not just MOVE a copy of the POINTER! D-: std::vector::const_iterator i; -// for(uint i=0; iCopy(); - - // Need to actually COPY the object here, not copy the pointer only!! - // (which we do now, above :-P) - objects.push_back(object); } @@ -132,12 +123,13 @@ having to ungroup them first (like Inkscape). /*virtual*/ bool Container::Collided(Vector point) { objectWasDragged = false; -// Vector v1 = position - point; - bool collision = false; + lastObjectClicked = NULL; - // NOTE that this deletes the object on mouse down instead of mouse up. Have to - // check to see how it feels to do it that way... + // NOTE that this deletes the object on mouse down instead of mouse up. + // Have to check to see how it feels to do it that way... + // N.B.: This only works because the toolAction is not set, & + // Object::ignoreClicks isn't set either... if (deleteActive) { for(std::vector::iterator i=objects.begin(); i!=objects.end();) @@ -158,7 +150,11 @@ printf("Container::Collided: Deleting object ($%X)\n", *i); for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) { if ((*i)->Collided(point)) + { collision = true; + lastObjectClicked = *i; +//printf("Container::Collided: lastObjectClicked = %X\n", lastObjectClicked); + } } } @@ -205,9 +201,10 @@ class so that we can leverage that stuff here as well. // into parts and keep subdividing until an acceptable number of objects lie within // the slice. This way, the GUI will still be responsive and *not* have to test // every object for collision. -/*virtual*/ void Container::PointerMoved(Vector point) +/*virtual*/ bool Container::PointerMoved(Vector point) { std::vector::iterator i; + lastObjectHovered = penultimateObjectHovered = NULL; if (!isTopLevelContainer) { @@ -219,7 +216,7 @@ class so that we can leverage that stuff here as well. else state = OSInactive; - return; + return false; } // No need to do any checking if we're already selected... @@ -257,17 +254,22 @@ class so that we can leverage that stuff here as well. needUpdate = true; } - return; + return false; } for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) { // if (objects[i]->GetState() == OSSelected) - (*i)->PointerMoved(point); + if ((*i)->PointerMoved(point)) + { + penultimateObjectHovered = lastObjectHovered; + lastObjectHovered = *i; + } } // Generic container doesn't need this??? // needUpdate = false; + return (lastObjectHovered == NULL ? false : true); } @@ -441,7 +443,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); @@ -453,6 +454,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 @@ -475,6 +488,21 @@ void Container::MoveSelectedContentsTo(Container * newContainer) } +void Container::CopySelectedContentsTo(Container * newContainer) +{ + // Sanity check + if (newContainer == NULL) + return; + + // Copy 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++) @@ -520,3 +548,55 @@ same reference number. 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(); +} +