+//
// 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)
{
state = OSInactive;
}
-
Container::~Container()
{
Clear();
}
-
// Assignment operator
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;
}
}
-
/*virtual*/ Vector Container::Center(void)
{
return position;
}
-
/*
We need at least *three* handles for this object:
- one for moving
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).
/*
/*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();)
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);
+ }
}
}
// 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)
{
else
state = OSInactive;
- return;
+ return false;
}
// No need to do any checking if we're already selected...
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)
(*i)->PointerReleased();
}
-
/*virtual*/ bool Container::NeedsUpdate(void)
{
// If this is *not* a top level container, then we treat it as an
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;
return bounds;
}
-
void Container::Delete(Object * objectToDelete)
{
std::vector<Object *>::iterator i = objects.begin();
}
}
-
void Container::DeleteSelectedItems(void)
{
std::vector<Object *>::iterator i = objects.begin();
}
}
-
void Container::Clear(void)
{
std::vector<Object *>::iterator i = objects.begin();
}
}
-
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;
return selected;
}
-
Object * Container::SelectedItem(unsigned int index)
{
unsigned int selectedIndex = 0;
return NULL;
}
-
void Container::MoveContentsTo(Container * newContainer)
{
// Sanity check
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);
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)
{
}
}
+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)
{
}
}
-
/*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);
fprintf(file, "ENDCONTAINER\n");
}
-
/*virtual*/ Object * Container::Copy(void)
{
#warning "!!! This doesn't take care of attached Dimensions !!!"
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();
+}