]> Shamusworld >> Repos - architektonas/blobdiff - src/container.cpp
Whitespace changes. :-P
[architektonas] / src / container.cpp
index 757828aad73e064af821d04816807a82fa93702a..b3f7347c541897395a192c9b4e26f029226f11d6 100644 (file)
@@ -1,3 +1,4 @@
+//
 // container.cpp: Container object
 //
 // Part of the Architektonas Project
 #include "dimension.h"
 #include "painter.h"
 
-
 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;
 }
 
-
 // Copy constructor
 Container::Container(const Container & copy): Object(copy.position, copy.parent)
 {
        // Use overloaded assignment operator
        *this = copy;
        type = OTContainer;
+       state = OSInactive;
 }
 
-
 Container::~Container()
 {
        Clear();
 }
 
-
 // Assignment operator
 Container & Container::operator=(const Container & from)
 {
@@ -51,28 +51,26 @@ Container & Container::operator=(const Container & from)
                return *this;
 
        Clear();
+       std::vector<Object *>::const_iterator i;
 
-       // 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(uint i=0; i<from.objects.size(); i++)
+       for(i=from.objects.begin(); i!=from.objects.end(); i++)
        {
-               Object * object = from.objects[i];
-
-               // Need to copy the object here...
-
+printf("Container: Copying object $%08X...\n", *i);
+               Object * object = (*i)->Copy();
                objects.push_back(object);
        }
 
        return *this;
 }
 
-
 /*virtual*/ void Container::Draw(Painter * painter)
 {
        QRectF boundary;
 
+//int a=1;
        for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
        {
+//printf("Containter::Draw item #%i [%X]...\n", a++, *i);
                (*i)->Draw(painter);
                boundary = boundary.united((*i)->Extents());
        }
@@ -85,17 +83,15 @@ Container & Container::operator=(const Container & from)
                        painter->SetPen(QPen(Qt::blue, 2.0, Qt::DashLine));
 
                painter->SetBrush(QBrush(Qt::NoBrush));
-               painter->DrawRect(boundary);
+               painter->DrawPaddedRect(boundary);
        }
 }
 
-
 /*virtual*/ Vector Container::Center(void)
 {
        return position;
 }
 
-
 /*
  We need at least *three* handles for this object:
  - one for moving
@@ -109,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).
 /*
@@ -121,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<Object *>::iterator i=objects.begin(); i!=objects.end();)
@@ -147,10 +143,17 @@ printf("Container::Collided: Deleting object ($%X)\n", *i);
                for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
                {
                        if ((*i)->Collided(point))
+                       {
                                collision = true;
+                               lastObjectClicked = *i;
+//printf("Container::Collided: lastObjectClicked = %X\n", lastObjectClicked);
+                       }
                }
        }
 
+       if (snapToGrid)
+               point = SnapPointToGrid(point);
+
        // 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. :-)
@@ -191,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<Object *>::iterator i;
+       lastObjectHovered = penultimateObjectHovered = NULL;
 
        if (!isTopLevelContainer)
        {
@@ -205,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...
@@ -243,20 +247,24 @@ class so that we can leverage that stuff here as well.
                        needUpdate = true;
                }
 
-               return;
+               return false;
        }
 
        for(std::vector<Object *>::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)
@@ -287,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
@@ -308,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;
@@ -326,7 +331,6 @@ printf("Container: Added object (=$%X). size = %li\n", object, objects.size());
        return bounds;
 }
 
-
 void Container::Delete(Object * objectToDelete)
 {
        std::vector<Object *>::iterator i = objects.begin();
@@ -344,7 +348,6 @@ void Container::Delete(Object * objectToDelete)
        }
 }
 
-
 void Container::DeleteSelectedItems(void)
 {
        std::vector<Object *>::iterator i = objects.begin();
@@ -361,7 +364,6 @@ void Container::DeleteSelectedItems(void)
        }
 }
 
-
 void Container::Clear(void)
 {
        std::vector<Object *>::iterator i = objects.begin();
@@ -374,21 +376,18 @@ printf("Container: Deleting object ($%X)...\n", *i);
        }
 }
 
-
 void Container::SelectAll(void)
 {
        for(unsigned int i=0; i<objects.size(); i++)
                objects[i]->state = OSSelected;
 }
 
-
 void Container::DeselectAll(void)
 {
        for(unsigned int i=0; i<objects.size(); i++)
                objects[i]->state = OSInactive;
 }
 
-
 int Container::ItemsSelected(void)
 {
        int selected = 0;
@@ -400,7 +399,6 @@ int Container::ItemsSelected(void)
        return selected;
 }
 
-
 Object * Container::SelectedItem(unsigned int index)
 {
        unsigned int selectedIndex = 0;
@@ -419,7 +417,6 @@ Object * Container::SelectedItem(unsigned int index)
        return NULL;
 }
 
-
 void Container::MoveContentsTo(Container * newContainer)
 {
        // Sanity check
@@ -427,7 +424,6 @@ 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++)
        for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
        {
                newContainer->Add(*i);
@@ -438,6 +434,16 @@ void Container::MoveContentsTo(Container * newContainer)
        objects.clear();
 }
 
+void Container::CopyContentsTo(Container * newContainer)
+{
+       // Sanity check
+       if (newContainer == NULL)
+               return;
+
+       // Shuffle the contents of this container to the new one
+       for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+               newContainer->Add((*i)->Copy());
+}
 
 void Container::MoveSelectedContentsTo(Container * newContainer)
 {
@@ -460,6 +466,19 @@ 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<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+       {
+               if ((*i)->state == OSSelected)
+                       newContainer->Add((*i)->Copy());
+       }
+}
 
 void Container::ResizeAllDimensions(double newSize)
 {
@@ -472,13 +491,12 @@ void Container::ResizeAllDimensions(double newSize)
        }
 }
 
-
 /*virtual*/ void Container::Enumerate(FILE * file)
 {
        // Only put "CONTAINER" markers if *not* the top level container
 //     if (parent != NULL)
        if (!isTopLevelContainer)
-               fprintf(file, "CONTAINER\n");
+               fprintf(file, "CONTAINER %i\n", layer);
 
        for(uint i=0; i<objects.size(); i++)
                objects[i]->Enumerate(file);
@@ -488,3 +506,65 @@ void Container::ResizeAllDimensions(double newSize)
                fprintf(file, "ENDCONTAINER\n");
 }
 
+/*virtual*/ Object * Container::Copy(void)
+{
+#warning "!!! This doesn't take care of attached Dimensions !!!"
+/*
+This is a real problem. While having a pointer in the Dimension to this line's points
+is fast & easy, it creates a huge problem when trying to replicate an object like this.
+
+Maybe a way to fix that then, is to have reference numbers instead of pointers. That
+way, if you copy them, ... you might still have problems. Because you can't be sure if
+a copy will be persistant or not, you then *definitely* do not want them to have the
+same reference number.
+*/
+       Container * c = new Container(position, parent);
+       *c = *this;
+       return c;
+}
+
+/*virtual*/ void Container::Rotate(Point point, double angle)
+{
+       for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+               (*i)->Rotate(point, angle);
+}
+
+/*virtual*/ void Container::RotateSelected(Point point, double angle)
+{
+       for(std::vector<Object *>::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<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+               (*i)->Mirror(p1, p2);
+}
+
+/*virtual*/ void Container::MirrorSelected(Point p1, Point p2)
+{
+       for(std::vector<Object *>::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<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+               (*i)->Save();
+}
+
+/*virtual*/ void Container::Restore(void)
+{
+       Object::Restore();
+
+       for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+               (*i)->Restore();
+}