summaryrefslogtreecommitdiff
path: root/src/graphyx/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphyx/gui')
-rw-r--r--src/graphyx/gui/AboutHelpFrame.scala2
-rw-r--r--src/graphyx/gui/OptionsPanel.scala10
-rw-r--r--src/graphyx/gui/WorldPanel.scala30
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 _ => ()
}
}