aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core-units/container.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core-units/container.lisp')
-rw-r--r--src/core-units/container.lisp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/core-units/container.lisp b/src/core-units/container.lisp
new file mode 100644
index 0000000..afa68b3
--- /dev/null
+++ b/src/core-units/container.lisp
@@ -0,0 +1,32 @@
+;;;; units/container.lisp
+
+(in-package #:wheelwork)
+
+
+(defclass/std container ()
+ ((units :with :a))
+ (:documentation "Just a list of units. Made into a class so that
+ transformation affine transformations methods can be specialzied on
+ whole groups of units"))
+
+(defmethod drop-unit ((unit unit))
+ "Removes a unit from its container. Returns T if the unit actually was removed."
+ (when-let (container (unit-container unit))
+ (setf
+ (container-units container) (delete unit (container-units container))
+ (unit-container unit) nil)
+ t))
+
+(defmethod add-unit ((container container) (unit unit))
+ "Adds a unit to the end of a container (thus affecting render
+order). Makes sure to remove the unit from its current container if
+necessary."
+ (when (unit-container unit)
+ (drop-unit unit))
+ (push unit (container-units container))
+ (setf (unit-container unit) container)
+ unit)
+
+(defmethod cleanup ((container container))
+ (dolist (u (container-units container))
+ (cleanup u)))