X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcontainer.cpp;h=b3f7347c541897395a192c9b4e26f029226f11d6;hb=d9f34cb7917e396a1df805687234d5473d82283b;hp=976172fb38220f094838a7cc806ab1fa482a9712;hpb=dbfab6256efe6b03e9750e33081d9dcdcdfc1c34;p=architektonas diff --git a/src/container.cpp b/src/container.cpp index 976172f..b3f7347 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -1,3 +1,4 @@ +// // container.cpp: Container object // // Part of the Architektonas Project @@ -19,7 +20,6 @@ #include "dimension.h" #include "painter.h" - Container::Container(Vector p1, Object * p/*= NULL*/): Object(p1, p), isTopLevelContainer(false), dragging(false), draggingHandle1(false), draggingHandle2(false), @@ -29,7 +29,6 @@ Container::Container(Vector p1, Object * p/*= NULL*/): Object(p1, p), state = OSInactive; } - // Copy constructor Container::Container(const Container & copy): Object(copy.position, copy.parent) { @@ -39,13 +38,11 @@ Container::Container(const Container & copy): Object(copy.position, copy.parent) state = OSInactive; } - Container::~Container() { Clear(); } - // Assignment operator Container & Container::operator=(const Container & from) { @@ -54,29 +51,18 @@ 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); } return *this; } - /*virtual*/ void Container::Draw(Painter * painter) { QRectF boundary; @@ -101,13 +87,11 @@ Container & Container::operator=(const Container & from) } } - /*virtual*/ Vector Container::Center(void) { return position; } - /* We need at least *three* handles for this object: - one for moving @@ -121,7 +105,6 @@ I click here and drag there?" Also: should put the snap logic into the Object base class (as a static method)... */ - // Need to add checking here for clicking on a member of a group (Container), // and checking for if it's a top level container (the DrawingView's document). /* @@ -133,12 +116,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();) @@ -159,7 +143,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); + } } } @@ -206,9 +194,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) { @@ -220,7 +209,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... @@ -258,20 +247,24 @@ 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); } - /*virtual*/ void Container::PointerReleased(void) { if (!isTopLevelContainer) @@ -302,7 +295,6 @@ have to worry about keeping track of old states... (*i)->PointerReleased(); } - /*virtual*/ bool Container::NeedsUpdate(void) { // If this is *not* a top level container, then we treat it as an @@ -323,14 +315,12 @@ have to worry about keeping track of old states... return false; } - /*virtual*/ void Container::Add(Object * object) { objects.push_back(object); printf("Container: Added object (=$%X). size = %li\n", object, objects.size()); } - /*virtual*/ QRectF Container::Extents(void) { QRectF bounds; @@ -341,7 +331,6 @@ printf("Container: Added object (=$%X). size = %li\n", object, objects.size()); return bounds; } - void Container::Delete(Object * objectToDelete) { std::vector::iterator i = objects.begin(); @@ -359,7 +348,6 @@ void Container::Delete(Object * objectToDelete) } } - void Container::DeleteSelectedItems(void) { std::vector::iterator i = objects.begin(); @@ -376,7 +364,6 @@ void Container::DeleteSelectedItems(void) } } - void Container::Clear(void) { std::vector::iterator i = objects.begin(); @@ -389,21 +376,18 @@ printf("Container: Deleting object ($%X)...\n", *i); } } - void Container::SelectAll(void) { for(unsigned int i=0; istate = OSSelected; } - void Container::DeselectAll(void) { for(unsigned int i=0; istate = OSInactive; } - int Container::ItemsSelected(void) { int selected = 0; @@ -415,7 +399,6 @@ int Container::ItemsSelected(void) return selected; } - Object * Container::SelectedItem(unsigned int index) { unsigned int selectedIndex = 0; @@ -434,7 +417,6 @@ Object * Container::SelectedItem(unsigned int index) return NULL; } - void Container::MoveContentsTo(Container * newContainer) { // Sanity check @@ -452,7 +434,6 @@ void Container::MoveContentsTo(Container * newContainer) objects.clear(); } - void Container::CopyContentsTo(Container * newContainer) { // Sanity check @@ -464,7 +445,6 @@ void Container::CopyContentsTo(Container * newContainer) newContainer->Add((*i)->Copy()); } - void Container::MoveSelectedContentsTo(Container * newContainer) { // Sanity check @@ -486,14 +466,13 @@ 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 + // 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) @@ -501,7 +480,6 @@ void Container::CopySelectedContentsTo(Container * newContainer) } } - void Container::ResizeAllDimensions(double newSize) { for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) @@ -513,7 +491,6 @@ void Container::ResizeAllDimensions(double newSize) } } - /*virtual*/ void Container::Enumerate(FILE * file) { // Only put "CONTAINER" markers if *not* the top level container @@ -529,7 +506,6 @@ void Container::ResizeAllDimensions(double newSize) fprintf(file, "ENDCONTAINER\n"); } - /*virtual*/ Object * Container::Copy(void) { #warning "!!! This doesn't take care of attached Dimensions !!!" @@ -547,14 +523,12 @@ 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++) @@ -564,14 +538,12 @@ same reference number. } } - /*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++) @@ -581,7 +553,6 @@ same reference number. } } - /*virtual*/ void Container::Save(void) { Object::Save(); @@ -590,7 +561,6 @@ same reference number. (*i)->Save(); } - /*virtual*/ void Container::Restore(void) { Object::Restore(); @@ -598,4 +568,3 @@ same reference number. for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) (*i)->Restore(); } -