aboutsummaryrefslogtreecommitdiff
path: root/src/test/scala/sims/test/gui/events.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/scala/sims/test/gui/events.scala')
-rw-r--r--src/test/scala/sims/test/gui/events.scala49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/test/scala/sims/test/gui/events.scala b/src/test/scala/sims/test/gui/events.scala
new file mode 100644
index 0000000..22015ce
--- /dev/null
+++ b/src/test/scala/sims/test/gui/events.scala
@@ -0,0 +1,49 @@
+package sims.test.gui
+
+import scala.collection.mutable.ListBuffer
+import sims.dynamics._
+
+trait Event
+case class BodyAdded(world: World, body: Body) extends Event
+case class BodyRemoved(world: World, body: Body) extends Event
+case class Stepped(wordl: World) extends Event
+case class JointAdded(world: World, joint: Joint) extends Event
+case class JointRemoved(world: World, joint: Joint) extends Event
+
+object Reactions {
+ class Impl extends Reactions {
+ private val parts = new ListBuffer[Reaction]
+ def isDefinedAt(e: Event) = parts exists (_ isDefinedAt e)
+ def +=(r: Reaction) = parts += r
+ def -=(r: Reaction) = parts -= r
+ def clear() = parts.clear()
+ def apply(e: Event) {
+ for (p <- parts; if p isDefinedAt e) p(e)
+ }
+ }
+ type Reaction = PartialFunction[Event, Unit]
+}
+
+abstract class Reactions extends Reactions.Reaction {
+ def +=(r: Reactions.Reaction): Unit
+ def -=(r: Reactions.Reaction): Unit
+ def clear(): Unit
+}
+
+trait Reactor {
+ val reactions: Reactions = new Reactions.Impl
+
+ def listenTo(ps: Publisher*) = for (p <- ps) p.subscribe(reactions)
+ def deafTo(ps: Publisher*) = for (p <- ps) p.unsubscribe(reactions)
+}
+
+trait Publisher {
+ import Reactions._
+
+ private val listeners = new ListBuffer[Reaction]
+
+ def subscribe(listener: Reaction) = listeners += listener
+ def unsubscribe(listener: Reaction) = listeners -= listener
+
+ def publish(e: Event) { for (l <- listeners) l(e) }
+} \ No newline at end of file