dragging(false), draggingHandle1(false), draggingHandle2(false)//, needUpdate(false)
{
type = OTContainer;
+ state = OSInactive;
}
// Use overloaded assignment operator
*this = copy;
type = OTContainer;
+ state = OSInactive;
}
// 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);
}
{
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);
}
}
return position;
}
+
/*
We need at least *three* handles for this object:
- one for moving
}
}
+ 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. :-)
state = (collision ? OSSelected : OSInactive);
if (state == OSSelected)
+ {
DeselectAll();
+ dragging = true;
+ oldPoint = point;
+ }
}
return collision;
// 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;
+ }
- needUpdate = true;
+ // No need to do any checking if we're already selected...
+// if (state == OSSelected)
+// return;
- for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+// oldState = state;
+// needUpdate = true;
+// if (dragging &&
+ bool oldHit = hit;
+ hit = false;
+
+ 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);
}
/*virtual*/ void Container::PointerReleased(void)
{
+ if (!isTopLevelContainer)
+ {
+ dragging = false;
+ return;
+ }
+#if 0
dragging = false;
draggingHandle1 = false;
draggingHandle2 = false;
// 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();
}
{
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
- 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");
}
+
+/*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;
+}
+