X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcontainer.cpp;h=25079d972e9cb0fb3f6ba925a40a3282baa69af6;hb=11802354d1ddc5bc571d83d8fc9b600618cb4372;hp=cd9b4f5ef5880772601dcff6606cc7728e76eb1b;hpb=f3110724be7ad4d4e8c6b97d350ff8af7fbf3799;p=architektonas diff --git a/src/container.cpp b/src/container.cpp index cd9b4f5..25079d9 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -21,6 +21,7 @@ Container::Container(Vector p1, Object * p/*= NULL*/): Object(p1, p), + isTopLevelContainer(false), dragging(false), draggingHandle1(false), draggingHandle2(false)//, needUpdate(false) { type = OTContainer; @@ -111,6 +112,14 @@ 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). +/* +One approach is to check for the parent of the container: If it's NULL, then it's +the DrawingView's document. It might be better, though, to set a boolean like +isTopLevelContainer so that we can do things like edit members of a group without +having to ungroup them first (like Inkscape). +*/ /*virtual*/ bool Container::Collided(Vector point) { objectWasDragged = false; @@ -144,11 +153,34 @@ printf("Container::Collided: Deleting object ($%X)\n", *i); } } - // Do we decouple the state of the generic container from the objects inside??? Mebbe. - state = OSInactive; + // 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. :-) + if (isTopLevelContainer) + state = OSInactive; + else + { + state = (collision ? OSSelected : OSInactive); + + if (state == OSSelected) + DeselectAll(); + } + return collision; } +/* +What we need to do is check for whether or not we're a top level container, +and override the passing of stuff into the objects held. So here, if we're *NOT* +a top level container, instead of passing PointerMoved to our contained objects, +we check to see if our bounds are met (for selection rectangle, e.g.). + +Also, for things like being able to split point's hot spots we need to be able +to check for that crap in the top level container. Which means that objects can +still know how to move themselves, but they can also defer to their container +as well. Which also means that things like HitTest() need to be in the Object +class so that we can leverage that stuff here as well. +*/ // The TLC is passing all mouse movement here, so we're doing the same here. // Need to adjust all other objects to handle things correctly. @@ -159,13 +191,35 @@ printf("Container::Collided: Deleting object ($%X)\n", *i); // every object for collision. /*virtual*/ void Container::PointerMoved(Vector point) { + if (!isTopLevelContainer) + { + // check for selection rectangle too + + + needUpdate = true; + + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + { + if ((*i)->HitTest(point)) + { + state = OSSelected; + return; + } + } + + state = OSInactive; + return; + } + // objectWasDragged = true; //printf("CONTAINER: PointerMoved()\n"); - for(int i=0; i<(int)objects.size(); i++) + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) +// for(int i=0; i<(int)objects.size(); i++) { -// if (objects[i]->GetState() == OSSelected) - objects[i]->PointerMoved(point); +//// if (objects[i]->GetState() == OSSelected) +// objects[i]->PointerMoved(point); + (*i)->PointerMoved(point); } // Generic container doesn't need this??? @@ -196,15 +250,22 @@ about keeping track of old states... /*virtual*/ bool Container::NeedsUpdate(void) { - needUpdate = false; + // If this is *not* a top level container, then we treat it as an + // aggregate object. + if (!isTopLevelContainer) + { + return needUpdate; + } - for(uint i=0; i::iterator i=objects.begin(); i!=objects.end(); i++) { - if (objects[i]->NeedsUpdate()) - needUpdate = true; + if ((*i)->NeedsUpdate()) + return true; } - return needUpdate; + return false; } @@ -215,12 +276,15 @@ printf("Container: Added object (=$%X). size = %li\n", object, objects.size()); } -#if 0 -/*virtual*/ ObjectType Container::Type(void) +/*virtual*/ QRectF Container::Extents(void) { - return OTContainer; + QRectF bounds; + + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + bounds = bounds.united((*i)->Extents()); + + return bounds; } -#endif void Container::Delete(Object * objectToDelete) @@ -260,15 +324,6 @@ void Container::DeleteSelectedItems(void) void Container::Clear(void) { -#if 0 - // No memory leaks! - while (objects.size() > 0) - { -printf("Container: Deleting object ($%X)...\n", objects[0]); - delete objects[0]; - objects.erase(objects.begin()); - } -#else std::vector::iterator i = objects.begin(); while (i != objects.end()) @@ -277,7 +332,6 @@ printf("Container: Deleting object ($%X)...\n", *i); delete (*i); objects.erase(i); } -#endif } @@ -333,8 +387,12 @@ void Container::MoveContentsTo(Container * newContainer) return; // Shuffle the contents of this container to the new one - for(unsigned int i=0; iAdd(objects[i]); +// for(unsigned int i=0; i::iterator i=objects.begin(); i!=objects.end(); i++) + { + newContainer->Add(*i); + (*i)->Reparent(newContainer); + } // & clear our vector objects.clear(); @@ -357,6 +415,7 @@ void Container::MoveSelectedContentsTo(Container * newContainer) } newContainer->Add(*i); + (*i)->Reparent(newContainer); objects.erase(i); } }