]> Shamusworld >> Repos - architektonas/blobdiff - src/container.cpp
Add Dimension sizing.
[architektonas] / src / container.cpp
index cd9b4f5ef5880772601dcff6606cc7728e76eb1b..e909c04ae14b1ba8f9a7e6c0af4b2464cf76aff0 100644 (file)
@@ -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<Object *>::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<Object *>::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<objects.size(); i++)
+       // Search through objects for one that needs an update; if one is found,
+       // return immediately.
+       for(std::vector<Object *>::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<Object *>::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<Object *>::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; i<objects.size(); i++)
-               newContainer->Add(objects[i]);
+//     for(unsigned int i=0; i<objects.size(); i++)
+       for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+       {
+               newContainer->Add(*i);
+               (*i)->Reparent(newContainer);
+       }
 
        // & clear our vector
        objects.clear();
@@ -357,11 +415,31 @@ void Container::MoveSelectedContentsTo(Container * newContainer)
                }
 
                newContainer->Add(*i);
+               (*i)->Reparent(newContainer);
                objects.erase(i);
        }
 }
 
 
+void Container::ResizeAllDimensions(double newSize)
+{
+       for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+       {
+//             Object * object = *i;
+
+               if ((*i)->type == OTDimension)
+//             if (object->type == OTDimension)
+               {
+                       ((Dimension *)(*i))->size = newSize;
+               }
+               if ((*i)->type == OTContainer)
+               {
+                       ((Container *)(*i))->ResizeAllDimensions(newSize);
+               }
+       }
+}
+
+
 /*virtual*/ void Container::Enumerate(FILE * file)
 {
        // Only put "CONTAINER" markers if *not* the top level container