]> Shamusworld >> Repos - architektonas/blobdiff - src/utils.cpp
Added object pane, grouping, load/save functionality.
[architektonas] / src / utils.cpp
index 12f7146ad4418ea74d145074847981b562c81651..02d6b20ef9c6fe977aa9efe5de0a4f5e6e70baa7 100644 (file)
@@ -90,6 +90,25 @@ Object * CopyObject(Object * obj)
 }
 
 
+void MoveSelectedObjectsTo(std::vector<void *> & dest, std::vector<void *> & from)
+{
+       std::vector<void *>::iterator i = from.begin();
+
+       while (i != from.end())
+       {
+               Object * obj = (Object *)(*i);
+
+               if (obj->selected)
+               {
+                       dest.push_back(*i);
+                       from.erase(i);
+               }
+               else
+                       i++;
+       }
+}
+
+
 void AddObjectsTo(std::vector<void *> & dest, std::vector<void *> & from)
 {
        for(std::vector<void *>::iterator i=from.begin(); i!=from.end(); i++)
@@ -106,6 +125,38 @@ void ClearSelected(std::vector<void *> & v)
 }
 
 
+void SelectAll(std::vector<void *> & v)
+{
+       std::vector<void *>::iterator i;
+
+       for(i=v.begin(); i!=v.end(); i++)
+               ((Object *)(*i))->selected = true;
+}
+
+
+//
+// Recursively go down thru the Container's vectors, deleting all the objects
+// contained therein. Once that is done, the main Container can be deleted. We
+// don't have to worry about the underlying std::vectors, as they have their
+// own destructors--plus they don't take ownership of objects, which is why we
+// have to keep track of that stuff ourselves. :-P Believe it or not, this is a
+// Good Thing(TM). ;-)
+//
+void DeleteContents(std::vector<void *> & v)
+{
+       std::vector<void *>::iterator i;
+
+       for(i=v.begin(); i!=v.end(); i++)
+       {
+               Object * obj = (Object *)(*i);
+
+               if (obj->type == OTContainer)
+                       DeleteContents(((Container *)obj)->objects);
+
+               delete obj;
+       }
+}
+
 void DeleteSelectedObjects(std::vector<void *> & v)
 {
        std::vector<void *>::iterator i = v.begin();
@@ -125,6 +176,26 @@ void DeleteSelectedObjects(std::vector<void *> & v)
 }
 
 
+//
+// This is used to remove selected objects from one container in order to move
+// them to a different container.
+//
+void RemoveSelectedObjects(std::vector<void *> & v)
+{
+       std::vector<void *>::iterator i = v.begin();
+
+       while (i != v.end())
+       {
+               Object * obj = (Object *)(*i);
+
+               if (obj->selected)
+                       v.erase(i);
+               else
+                       i++;
+       }
+}
+
+
 void SavePointsFrom(std::vector<void *> & v, std::vector<Object> & save)
 {
        save.clear();
@@ -156,3 +227,21 @@ void RestorePointsTo(std::vector<void *> & v, std::vector<Object> & s)
 }
 
 
+void TranslateObject(Object * obj, Point delta)
+{
+       if (obj->type == OTContainer)
+       {
+               Container * c = (Container *)obj;
+               std::vector<void *>::iterator i;
+
+               for(i=c->objects.begin(); i!=c->objects.end(); i++)
+                       TranslateObject((Object *)*i, delta);
+       }
+       else
+       {
+               obj->p[0] += delta;
+               obj->p[1] += delta;
+       }
+}
+
+