diff options
Diffstat (limited to 'src/graphyx/gui')
-rw-r--r-- | src/graphyx/gui/AboutHelpFrame.scala | 2 | ||||
-rw-r--r-- | src/graphyx/gui/OptionsPanel.scala | 10 | ||||
-rw-r--r-- | src/graphyx/gui/WorldPanel.scala | 30 |
3 files changed, 38 insertions, 4 deletions
diff --git a/src/graphyx/gui/AboutHelpFrame.scala b/src/graphyx/gui/AboutHelpFrame.scala index 5afa58e..4dba9f1 100644 --- a/src/graphyx/gui/AboutHelpFrame.scala +++ b/src/graphyx/gui/AboutHelpFrame.scala @@ -14,7 +14,7 @@ class AboutHelpFrame extends Frame { |SiMS and Graphyx are made available under the MIT License | |http://sourceforge.net/projects/simplemechanics/""".stripMargin - ) + ) {editable = false} } object AboutHelpFrame { diff --git a/src/graphyx/gui/OptionsPanel.scala b/src/graphyx/gui/OptionsPanel.scala index 3ec3921..525f352 100644 --- a/src/graphyx/gui/OptionsPanel.scala +++ b/src/graphyx/gui/OptionsPanel.scala @@ -13,7 +13,7 @@ import scala.swing._ import scala.swing.event._ import GridBagPanel._ -class OptionsPanel(container: Container) extends GridPanel(11,2){ +class OptionsPanel(container: Container) extends GridPanel(12,2){ /* val c = new Constraints c.anchor = Anchor.West @@ -55,6 +55,9 @@ class OptionsPanel(container: Container) extends GridPanel(11,2){ val lblDrawCollisions = new Label("Collisions") val chckDrawCollisions = new CheckBox {selected = false} + val lblTrace = new Label("Trace") + val chckTrace = new CheckBox {selected = false} + val components = List( lblTimeStep, txtTimeStep, lblIterations, txtIterations, @@ -66,7 +69,8 @@ class OptionsPanel(container: Container) extends GridPanel(11,2){ lblDrawJoints, chckDrawJoints, lblDrawAABBs, chckDrawAABBs, lblDrawPairs, chckDrawPairs, - lblDrawCollisions, chckDrawCollisions + lblDrawCollisions, chckDrawCollisions, + lblTrace, chckTrace ) contents ++= components listenTo(components: _*) @@ -82,6 +86,7 @@ class OptionsPanel(container: Container) extends GridPanel(11,2){ case ButtonClicked(`chckDrawAABBs`) => container.mainFrame.mainPanel.worldPanel.drawAABBs = chckDrawAABBs.selected case ButtonClicked(`chckDrawPairs`) => container.mainFrame.mainPanel.worldPanel.drawPairs = chckDrawPairs.selected case ButtonClicked(`chckDrawCollisions`) => container.mainFrame.mainPanel.worldPanel.drawCollisions = chckDrawCollisions.selected + case ButtonClicked(`chckTrace`) => container.mainFrame.mainPanel.worldPanel.trace = chckTrace.selected } def update() = { @@ -97,6 +102,7 @@ class OptionsPanel(container: Container) extends GridPanel(11,2){ chckDrawAABBs.selected = container.mainFrame.mainPanel.worldPanel.drawAABBs chckDrawPairs.selected = container.mainFrame.mainPanel.worldPanel.drawPairs chckDrawCollisions.selected = container.mainFrame.mainPanel.worldPanel.drawCollisions + chckTrace.selected = container.mainFrame.mainPanel.worldPanel.trace } diff --git a/src/graphyx/gui/WorldPanel.scala b/src/graphyx/gui/WorldPanel.scala index 13765e5..cd91f00 100644 --- a/src/graphyx/gui/WorldPanel.scala +++ b/src/graphyx/gui/WorldPanel.scala @@ -42,6 +42,7 @@ class WorldPanel(container: Container) extends BoxPanel(Orientation.Vertical){ var drawAABBs = false var drawPairs = false var drawCollisions = false + var trace = false override def paintComponent(g: java.awt.Graphics) = { var parts: Seq[graphyx.graphics.Drawable] = Seq() @@ -55,6 +56,7 @@ class WorldPanel(container: Container) extends BoxPanel(Orientation.Vertical){ drawAxes(g) g.translate(offset.x.toInt, -offset.y.toInt) drawParts(parts, g) + if (trace) trace(scene.shapes, g) g.translate(-offset.x.toInt, offset.y.toInt) } @@ -80,6 +82,30 @@ class WorldPanel(container: Container) extends BoxPanel(Orientation.Vertical){ } } + import collection.mutable._ + val prevPos: collection.mutable.Map[Int, collection.mutable.Queue[Vector2D]] = Map() + def trace(shapes: Iterable[graphics.GraphicalShape], g: java.awt.Graphics) = { + for (s <- shapes) { + s.g = g + s.windowHeight = super.size.height + s.ppm = ppm + s.scale = this.scale + + + if (!prevPos.contains(s.uid)) prevPos += (s.uid -> new Queue[Vector2D]) + else { + prevPos(s.uid).enqueue(s.pos) + for(i <- 0 until prevPos(s.uid).length - 1) { + val sp = prevPos(s.uid)(i) + val ep = prevPos(s.uid)(i + 1) + s.g.setColor(java.awt.Color.cyan) + s.drawLine(sp, ep) + } + if (prevPos(s.uid).length == 50) prevPos(s.uid).dequeue + } + } + } + def getBody(p: Vector2D): Option[Body] = { val shape = scene.shapes.find(_.contains(p)) if (shape != None) Some(shape.get.real.body) @@ -106,8 +132,10 @@ class WorldPanel(container: Container) extends BoxPanel(Orientation.Vertical){ case MousePressed(c,p,x,y,b) => { mousePressed = true; startPoint = p; endPoint = p x match { - case 1024 if (getBody(p) != None) => grab(getBody(p).get, p) + case 1024 if (getBody(p) != None) => grab(getBody(p).get, p) + case 1152 if (getBody(p) != None) => {grabbedBody = Some(new GrabbedBody(getBody(p).get, p)); popup.body = grabbedBody.get.body; popup.peer.setLocation(p); popup.visible = true} case 4096 if (getBody(p) != None) => {grabbedBody = Some(new GrabbedBody(getBody(p).get, p)); popup.body = grabbedBody.get.body; popup.peer.setLocation(p); popup.visible = true} + case _ => () } } |