X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcontainer.cpp;h=cd9b4f5ef5880772601dcff6606cc7728e76eb1b;hb=f3110724be7ad4d4e8c6b97d350ff8af7fbf3799;hp=726366365722422da0349c171e751c88c4cf52ef;hpb=ba6723b86d8dd67ebc7b11b245de3e7ff64f06b1;p=architektonas diff --git a/src/container.cpp b/src/container.cpp index 7263663..cd9b4f5 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -114,111 +114,38 @@ Also: should put the snap logic into the Object base class (as a static method). /*virtual*/ bool Container::Collided(Vector point) { objectWasDragged = false; - Vector v1 = position - point; +// Vector v1 = position - point; -#if 0 - if (state == OSInactive) - { -//printf("Circle: pp = %lf, length = %lf, distance = %lf\n", parameterizedPoint, lineSegment.Magnitude(), distance); -//printf(" v1.Magnitude = %lf, v2.Magnitude = %lf\n", v1.Magnitude(), v2.Magnitude()); -//printf(" point = %lf,%lf,%lf; p1 = %lf,%lf,%lf; p2 = %lf,%lf,%lf\n", point.x, point.y, point.z, position.x, position.y, position.z, endpoint.x, endpoint.y, endpoint.z); -//printf(" \n", ); -//How to translate this into pixels from Document space??? -//Maybe we need to pass a scaling factor in here from the caller? That would make sense, as -//the caller knows about the zoom factor and all that good kinda crap - if (v1.Magnitude() < 10.0) - { - oldState = state; - state = OSSelected; - oldPoint = position; //maybe "position"? - draggingHandle1 = true; - return true; - } - else if ((v1.Magnitude() < radius + 2.0) && (v1.Magnitude() > radius - 2.0)) - { - oldState = state; - state = OSSelected; - oldPoint = point; - dragging = true; - return true; - } - } - else if (state == OSSelected) - { - // Here we test for collision with handles as well! (SOON!) -/* -Like so: - if (v1.Magnitude() < 2.0) // Handle #1 - else if (v2.Magnitude() < 2.0) // Handle #2 -*/ - if ((v1.Magnitude() < radius + 2.0) && (v1.Magnitude() > radius - 2.0)) - { - oldState = state; -// state = OSInactive; - oldPoint = point; - dragging = true; - return true; - } - } -#else bool collision = false; // 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... if (deleteActive) { - for(int i=0; i<(int)objects.size(); i++) + for(std::vector::iterator i=objects.begin(); i!=objects.end();) { - if (objects[i]->Collided(point)) + if ((*i)->Collided(point)) { -#if 0 -Dimension * dimension = objects[i]->GetAttachedDimension(); -#endif - Object * objectToDelete = objects[i]; - objects.erase(objects.begin() + i); // Calls the destructor, (deletes the object, I presume... O_o) [NOPE! SURE DOESN'T!] +printf("Container::Collided: Deleting object ($%X)\n", *i); + Object * objectToDelete = *i; + objects.erase(i); delete objectToDelete; - -// If this object had an attached dimension, reattach it to another object, if any... -// The only problem with that approach is if the object it gets attached to is deleted, -// it will call the dimension to use a NULL pointer and BLAMMO -#if 0 -if (dimension) -{ - Vector p1 = dimension->GetPoint1(); - Vector p2 = dimension->GetPoint2(); - for(int j=0; j<(int)objects.size(); j++) - { - Vector * objectP1 = objects[i]->GetPointAt(p1); - Vector * objectP2 = objects[i]->GetPointAt(p2); - - if (objectP1) - dimension->SetPoint1(objectP1); - - if (objectP2) - dimension->SetPoint2(objectP2); - } -} -#endif - // This only allows deleting objects one at a time... - break; - // however, this way of doing things could be problematic if we don't - // delete one at a time... Need to come up with a better approach. } + else + i++; } } else { - for(int i=0; i<(int)objects.size(); i++) + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) { - if (objects[i]->Collided(point)) + if ((*i)->Collided(point)) collision = true; } } -#endif // Do we decouple the state of the generic container from the objects inside??? Mebbe. state = OSInactive; -// return false; return collision; } @@ -298,37 +225,42 @@ printf("Container: Added object (=$%X). size = %li\n", object, objects.size()); void Container::Delete(Object * objectToDelete) { -#if 0 - //this is wrong - for(unsigned int i=0; i::iterator i = objects.begin(); + + while (i != objects.end()) { - if (objects[i] == objectToDelete) + if (*i == objectToDelete) { objects.erase(i); delete objectToDelete; return; } + + i++; } -#else +} + + +void Container::DeleteSelectedItems(void) +{ std::vector::iterator i = objects.begin(); while (i != objects.end()) { - if (*i == objectToDelete) + if ((*i)->state == OSSelected) { + delete *i; objects.erase(i); - delete objectToDelete; - return; } - - i++; + else + i++; } -#endif } void Container::Clear(void) { +#if 0 // No memory leaks! while (objects.size() > 0) { @@ -336,6 +268,16 @@ 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()) + { +printf("Container: Deleting object ($%X)...\n", *i); + delete (*i); + objects.erase(i); + } +#endif } @@ -365,20 +307,8 @@ int Container::ItemsSelected(void) } -/*ObjectType Container::SelectedItemType(unsigned int index) -{ - if (index >= objects.size()) - return OTNone; - - return objects[index]->Type(); -}*/ - - Object * Container::SelectedItem(unsigned int index) { -// if (index >= objects.size()) -// return NULL; - unsigned int selectedIndex = 0; for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++)