]> Shamusworld >> Repos - architektonas/blobdiff - src/container.cpp
Whitespace changes. :-P
[architektonas] / src / container.cpp
index e8a66e4d3ba040a178c7eadefc6a5c855adc6aa2..b3f7347c541897395a192c9b4e26f029226f11d6 100644 (file)
@@ -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<Object *>::const_iterator i;
 
-//     for(uint i=0; i<from.objects.size(); i++)
        for(i=from.objects.begin(); i!=from.objects.end(); i++)
        {
-//             Object * object = from.objects[i];
+printf("Container: Copying object $%08X...\n", *i);
                Object * object = (*i)->Copy();
-
-               // 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<Object *>::iterator i=objects.begin(); i!=objects.end();)
@@ -159,7 +143,11 @@ 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);
+                       }
                }
        }
 
@@ -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<Object *>::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<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)
@@ -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<Object *>::iterator i = objects.begin();
@@ -359,7 +348,6 @@ void Container::Delete(Object * objectToDelete)
        }
 }
 
-
 void Container::DeleteSelectedItems(void)
 {
        std::vector<Object *>::iterator i = objects.begin();
@@ -376,7 +364,6 @@ void Container::DeleteSelectedItems(void)
        }
 }
 
-
 void Container::Clear(void)
 {
        std::vector<Object *>::iterator i = objects.begin();
@@ -389,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;
@@ -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
@@ -442,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);
@@ -453,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)
 {
@@ -475,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<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
        {
                if ((*i)->state == OSSelected)
@@ -490,7 +480,6 @@ void Container::CopySelectedContentsTo(Container * newContainer)
        }
 }
 
-
 void Container::ResizeAllDimensions(double newSize)
 {
        for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
@@ -502,7 +491,6 @@ void Container::ResizeAllDimensions(double newSize)
        }
 }
 
-
 /*virtual*/ void Container::Enumerate(FILE * file)
 {
        // Only put "CONTAINER" markers if *not* the top level container
@@ -518,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 !!!"
@@ -536,6 +523,20 @@ same reference number.
        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)
 {
@@ -543,6 +544,14 @@ same reference number.
                (*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)
 {
@@ -552,7 +561,6 @@ same reference number.
                (*i)->Save();
 }
 
-
 /*virtual*/ void Container::Restore(void)
 {
        Object::Restore();
@@ -560,4 +568,3 @@ same reference number.
        for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
                (*i)->Restore();
 }
-