package edu.colorado.phet.movingman.ladybug
import edu.colorado.phet.common.phetcommon.view.util.PhetFont
import edu.colorado.phet.common.piccolophet.event.CursorHandler
import edu.colorado.phet.common.piccolophet.nodes.PhetPPath
import edu.colorado.phet.common.piccolophet.PhetPCanvas
import java.awt.geom.Ellipse2D
import java.awt.{Rectangle, Dimension, BasicStroke, Color}
import java.text.DecimalFormat
import javax.swing.JPanel
import LadybugUtil._
import umd.cs.piccolo.event.{PBasicInputEventHandler, PInputEvent}
import umd.cs.piccolo.nodes.{PPath, PText}
import umd.cs.piccolo.PNode
class RecordingControl(model: LadybugModel) extends PhetPCanvas {
val text = new PText("0.00")
text.setFont(new PhetFont(30))
addScreenChild(text)
val _width = 250
val _height = 60
setPreferredSize(new Dimension(_width, _height))
implicit def timeToString(time: Double) = new DecimalFormat("0.00").format(time) + " sec"
model.addListener((model: LadybugModel) => {
updateReadouts
})
val playbackIndicator = new PText("* Playback")
playbackIndicator.setFont(new PhetFont(16, true))
addScreenChild(playbackIndicator)
val recordIndicator = new PText("* Record")
recordIndicator.setFont(new PhetFont(16, true))
addScreenChild(recordIndicator)
playbackIndicator.setOffset(_width - playbackIndicator.getFullBounds.getWidth - 2, _height - playbackIndicator.getFullBounds.getHeight)
recordIndicator.setOffset(playbackIndicator.getFullBounds.getX, playbackIndicator.getFullBounds.getY - recordIndicator.getFullBounds.getHeight)
val timeline = new Timeline()
addScreenChild(timeline)
updateReadouts
def updateReadouts = {
text.setText(model.getTime())
text.setOffset(2, _height - text.getFullBounds.getHeight)
playbackIndicator.setTextPaint(if (model.isPlayback) Color.red else Color.lightGray)
recordIndicator.setTextPaint(if (model.isRecord) Color.red else Color.lightGray)
}
class Timeline extends PNode {
val pathOffsetY = 4
val pathHeight = 10
val ellipseWidth = 8
val ellipseHeight = 12
val scale = 2.0
val background = new PhetPPath(new Rectangle(0, pathOffsetY, _width, pathHeight), Color.lightGray)
val shaded = new PhetPPath(Color.orange)
val handle = new PhetPPath(Color.blue, new BasicStroke(1), Color.black)
addChild(background)
addChild(shaded)
addChild(handle)
handle.addInputEventListener(new CursorHandler)
handle.addInputEventListener(new PBasicInputEventHandler() {
override def mouseDragged(event: PInputEvent) = {
model.setPaused(true)
val dx = event.getCanvasDelta.width
model.setPlaybackIndexFloat(((model.getPlaybackIndexFloat + dx * scale) max 0) min (model.history.length - 1))
}
})
model.addListener((model: LadybugModel) => {
updateSelf()
})
updateSelf
def updateSelf() = {
shaded.setPathTo(new Rectangle(0, pathOffsetY, (model.history.length / scale).toInt, pathHeight))
handle.setVisible(model.isPlayback)
handle.setPathTo(new Ellipse2D.Double(model.getPlaybackIndexFloat / scale - ellipseWidth / 2, pathOffsetY, ellipseWidth, ellipseHeight))
}
}
}