]> Shamusworld >> Repos - architektonas/blobdiff - src/container.cpp
Fixed loading code, added "Base Unit" dialog.
[architektonas] / src / container.cpp
index e909c04ae14b1ba8f9a7e6c0af4b2464cf76aff0..ced7326de4979b91e67d4d16dfe97694101d4837 100644 (file)
@@ -25,6 +25,7 @@ Container::Container(Vector p1, Object * p/*= NULL*/): Object(p1, p),
        dragging(false), draggingHandle1(false), draggingHandle2(false)//, needUpdate(false)
 {
        type = OTContainer;
+       state = OSInactive;
 }
 
 
@@ -34,6 +35,7 @@ Container::Container(const Container & copy): Object(copy.position, copy.parent)
        // Use overloaded assignment operator
        *this = copy;
        type = OTContainer;
+       state = OSInactive;
 }
 
 
@@ -54,11 +56,18 @@ Container & Container::operator=(const Container & from)
 
        // 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 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];
+//             Object * object = from.objects[i];
+               Object * object = (*i)->Copy();
 
-               // Need to copy the object here...
+               // Need to actually COPY the object here, not copy the pointer only!!
+               // (which we do now, above :-P)
 
                objects.push_back(object);
        }
@@ -71,24 +80,23 @@ Container & Container::operator=(const Container & from)
 {
        QRectF boundary;
 
+//int a=1;
        for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
-//     for(int i=0; i<(int)objects.size(); i++)
        {
-#if 0
-//printf("Container: About to draw (object = $%X)\n", objects[i]);
-               objects[i]->Draw(painter);
-               bounds = bounds.united(objects[i].RectangularExtents());
-#else
+//printf("Containter::Draw item #%i [%X]...\n", a++, *i);
                (*i)->Draw(painter);
                boundary = boundary.united((*i)->Extents());
-#endif
        }
 
-       if (state == OSSelected)
+       if ((state == OSSelected) || hit)
        {
-               painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DashLine));
+               if (hit)
+                       painter->SetPen(QPen(Qt::magenta, 1.0, Qt::DashLine));
+               else
+                       painter->SetPen(QPen(Qt::blue, 2.0, Qt::DashLine));
+
                painter->SetBrush(QBrush(Qt::NoBrush));
-               painter->DrawRect(boundary);
+               painter->DrawPaddedRect(boundary);
        }
 }
 
@@ -98,6 +106,7 @@ Container & Container::operator=(const Container & from)
        return position;
 }
 
+
 /*
  We need at least *three* handles for this object:
  - one for moving
@@ -163,7 +172,11 @@ printf("Container::Collided: Deleting object ($%X)\n", *i);
                state = (collision ? OSSelected : OSInactive);
 
                if (state == OSSelected)
+               {
                        DeselectAll();
+                       dragging = true;
+                       oldPoint = point;
+               }
        }
 
        return collision;
@@ -191,34 +204,62 @@ class so that we can leverage that stuff here as well.
 // every object for collision.
 /*virtual*/ void Container::PointerMoved(Vector point)
 {
+       std::vector<Object *>::iterator i;
+
        if (!isTopLevelContainer)
        {
                // check for selection rectangle too
+               if (selectionInProgress)
+               {
+                       if (selection.contains(Extents()))
+                               state = OSSelected;
+                       else
+                               state = OSInactive;
+
+                       return;
+               }
 
+               // No need to do any checking if we're already selected...
+//             if (state == OSSelected)
+//                     return;
 
-               needUpdate = true;
+//             oldState = state;
+//             needUpdate = true;
+//             if (dragging &&
+               bool oldHit = hit;
+               hit = false;
 
-               for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+               for(i=objects.begin(); i!=objects.end(); i++)
                {
                        if ((*i)->HitTest(point))
                        {
-                               state = OSSelected;
-                               return;
+//                             state = OSSelected;
+//                             return;
+                               hit = true;
+                               break;
                        }
                }
 
-               state = OSInactive;
+               needUpdate = (oldHit != hit ? true : false);
+//             state = oldState;
+
+               if (dragging)
+               {
+                       Vector delta = point - oldPoint;
+
+                       for(i=objects.begin(); i!=objects.end(); i++)
+                               (*i)->Translate(delta);
+
+                       oldPoint = point;
+                       needUpdate = true;
+               }
+
                return;
        }
 
-//     objectWasDragged = true;
-//printf("CONTAINER: PointerMoved()\n");
-
        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)
                (*i)->PointerMoved(point);
        }
 
@@ -229,6 +270,12 @@ class so that we can leverage that stuff here as well.
 
 /*virtual*/ void Container::PointerReleased(void)
 {
+       if (!isTopLevelContainer)
+       {
+               dragging = false;
+               return;
+       }
+#if 0
        dragging = false;
        draggingHandle1 = false;
        draggingHandle2 = false;
@@ -236,15 +283,19 @@ class so that we can leverage that stuff here as well.
        // Here we check for just a click: If object was clicked and dragged, then
        // revert to the old state (OSInactive). Otherwise, keep the new state that
        // we set.
-/*Maybe it would be better to just check for "object was dragged" state and not have to worry
-about keeping track of old states...
+/*
+Maybe it would be better to just check for "object was dragged" state and not
+have to worry about keeping track of old states...
 */
        if (objectWasDragged)
                state = oldState;
 //Note that the preceeding is unnecessary for a generic container!
+#endif
 
-       for(int i=0; i<(int)objects.size(); i++)
-               objects[i]->PointerReleased();
+//     for(int i=0; i<(int)objects.size(); i++)
+//             objects[i]->PointerReleased();
+       for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+               (*i)->PointerReleased();
 }
 
 
@@ -425,17 +476,10 @@ 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);
-               }
        }
 }
 
@@ -443,13 +487,15 @@ 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 (parent != NULL)
+       if (!isTopLevelContainer)
                fprintf(file, "CONTAINER\n");
 
        for(uint i=0; i<objects.size(); i++)
                objects[i]->Enumerate(file);
 
-       if (parent != NULL)
+//     if (parent != NULL)
+       if (!isTopLevelContainer)
                fprintf(file, "ENDCONTAINER\n");
 }