This is referenced by MediaContainer, so it's compiled in,
but we don't actually use it anywhere in whirled. Made it extra stupid simple: click to play/pause, with no other controls. git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@718 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
@@ -8,23 +8,14 @@ import flash.display.Graphics;
|
||||
import flash.display.Shape;
|
||||
import flash.display.Sprite;
|
||||
|
||||
import flash.events.Event;
|
||||
import flash.events.MouseEvent;
|
||||
|
||||
import flash.geom.Point;
|
||||
import flash.geom.Rectangle;
|
||||
|
||||
import com.threerings.util.Log;
|
||||
import com.threerings.util.ValueEvent;
|
||||
|
||||
/**
|
||||
*
|
||||
* @eventType com.threerings.flash.video.MediaPlayerCodes.SIZE
|
||||
*/
|
||||
[Event(name="size", type="com.threerings.util.ValueEvent")]
|
||||
|
||||
/**
|
||||
* A simple video display.
|
||||
* An extremely simple video display. Click to pause/play.
|
||||
*/
|
||||
public class SimpleVideoDisplay extends Sprite
|
||||
{
|
||||
@@ -38,11 +29,7 @@ public class SimpleVideoDisplay extends Sprite
|
||||
public function SimpleVideoDisplay (player :VideoPlayer)
|
||||
{
|
||||
_player = player;
|
||||
_player.addEventListener(MediaPlayerCodes.STATE, handlePlayerState);
|
||||
_player.addEventListener(MediaPlayerCodes.SIZE, handlePlayerSize);
|
||||
_player.addEventListener(MediaPlayerCodes.DURATION, handlePlayerDuration);
|
||||
_player.addEventListener(MediaPlayerCodes.POSITION, handlePlayerPosition);
|
||||
_player.addEventListener(MediaPlayerCodes.ERROR, handlePlayerError);
|
||||
|
||||
addChild(_player.getDisplay());
|
||||
|
||||
@@ -50,13 +37,6 @@ public class SimpleVideoDisplay extends Sprite
|
||||
this.mask = masker;
|
||||
addChild(masker);
|
||||
|
||||
addEventListener(MouseEvent.ROLL_OVER, handleRollOver);
|
||||
addEventListener(MouseEvent.ROLL_OUT, handleRollOut);
|
||||
|
||||
_hud = new Sprite();
|
||||
_hud.addEventListener(MouseEvent.CLICK, handleClick);
|
||||
redrawHUD();
|
||||
|
||||
// create the mask...
|
||||
var g :Graphics = masker.graphics;
|
||||
g.clear();
|
||||
@@ -64,38 +44,7 @@ public class SimpleVideoDisplay extends Sprite
|
||||
g.drawRect(0, 0, NATIVE_WIDTH, NATIVE_HEIGHT);
|
||||
g.endFill();
|
||||
|
||||
// and update the HUD location (even if not currently showing)
|
||||
_hud.x = NATIVE_WIDTH/2;
|
||||
_hud.y = NATIVE_HEIGHT/2;
|
||||
|
||||
_track = new Sprite();
|
||||
_track.x = PAD - _hud.x;
|
||||
_track.y = NATIVE_HEIGHT - PAD - TRACK_HEIGHT - _hud.y;
|
||||
g = _track.graphics;
|
||||
g.beginFill(0x000000, .7);
|
||||
g.drawRect(0, 0, TRACK_WIDTH, TRACK_HEIGHT);
|
||||
g.endFill();
|
||||
g.lineStyle(2, 0xFFFFFF);
|
||||
g.drawRect(0, 0, TRACK_WIDTH, TRACK_HEIGHT);
|
||||
// _track is not added to _hud until we know the duration
|
||||
|
||||
const trackMask :Shape = new Shape();
|
||||
g = trackMask.graphics;
|
||||
g.beginFill(0xFFFFFF);
|
||||
g.drawRect(0, 0, TRACK_WIDTH, TRACK_HEIGHT);
|
||||
_track.addChild(trackMask);
|
||||
_track.mask = trackMask;
|
||||
|
||||
_knob = new Sprite();
|
||||
_knob.y = TRACK_HEIGHT / 2;
|
||||
g = _knob.graphics;
|
||||
g.lineStyle(1, 0xFFFFFF);
|
||||
g.beginFill(0x000099);
|
||||
g.drawCircle(0, 0, TRACK_HEIGHT/2 - 1);
|
||||
// _knob is not added to _track until we know the position
|
||||
|
||||
_track.addEventListener(MouseEvent.CLICK, handleTrackClick);
|
||||
_knob.addEventListener(MouseEvent.MOUSE_DOWN, handleKnobDown);
|
||||
addEventListener(MouseEvent.CLICK, handleClick);
|
||||
}
|
||||
|
||||
override public function get width () :Number
|
||||
@@ -116,16 +65,6 @@ public class SimpleVideoDisplay extends Sprite
|
||||
_player.unload();
|
||||
}
|
||||
|
||||
protected function handleRollOver (event :MouseEvent) :void
|
||||
{
|
||||
showHUD(true);
|
||||
}
|
||||
|
||||
protected function handleRollOut (event :MouseEvent) :void
|
||||
{
|
||||
showHUD(false);
|
||||
}
|
||||
|
||||
protected function handleClick (event :MouseEvent) :void
|
||||
{
|
||||
// the buck stops here!
|
||||
@@ -142,49 +81,11 @@ public class SimpleVideoDisplay extends Sprite
|
||||
break;
|
||||
|
||||
default:
|
||||
log.info("Click while player in unhandled state: " + _player.getState());
|
||||
trace("Click while player in unhandled state: " + _player.getState());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected function handleTrackClick (event :MouseEvent) :void
|
||||
{
|
||||
event.stopImmediatePropagation();
|
||||
|
||||
adjustSeek(event.localX);
|
||||
}
|
||||
|
||||
protected function handleKnobDown (event :MouseEvent) :void
|
||||
{
|
||||
event.stopImmediatePropagation();
|
||||
|
||||
_dragging = true;
|
||||
_knob.startDrag(false, new Rectangle(0, TRACK_HEIGHT/2, TRACK_WIDTH, 0));
|
||||
addEventListener(Event.ENTER_FRAME, handleKnobSeekCheck);
|
||||
addEventListener(MouseEvent.MOUSE_UP, handleKnobUp);
|
||||
}
|
||||
|
||||
protected function handleKnobUp (event :MouseEvent) :void
|
||||
{
|
||||
event.stopImmediatePropagation();
|
||||
|
||||
_dragging = false;
|
||||
_knob.stopDrag();
|
||||
removeEventListener(Event.ENTER_FRAME, handleKnobSeekCheck);
|
||||
removeEventListener(MouseEvent.MOUSE_UP, handleKnobUp);
|
||||
handleKnobSeekCheck(null);
|
||||
}
|
||||
|
||||
protected function handleKnobSeekCheck (event :Event) :void
|
||||
{
|
||||
adjustSeek(_knob.x);
|
||||
}
|
||||
|
||||
protected function handlePlayerState (event :ValueEvent) :void
|
||||
{
|
||||
redrawHUD();
|
||||
}
|
||||
|
||||
protected function handlePlayerSize (event :ValueEvent) :void
|
||||
{
|
||||
const size :Point = Point(event.value);
|
||||
@@ -200,123 +101,6 @@ public class SimpleVideoDisplay extends Sprite
|
||||
dispatchEvent(event);
|
||||
}
|
||||
|
||||
protected function handlePlayerDuration (event :ValueEvent) :void
|
||||
{
|
||||
// TODO: temporarily disabled
|
||||
// _hud.addChild(_track);
|
||||
}
|
||||
|
||||
protected function handlePlayerPosition (event :ValueEvent) :void
|
||||
{
|
||||
if (_dragging) {
|
||||
return;
|
||||
}
|
||||
_lastKnobX = int.MIN_VALUE;
|
||||
const pos :Number = Number(event.value);
|
||||
_knob.x = (pos / _player.getDuration()) * TRACK_WIDTH;
|
||||
if (_knob.parent == null) {
|
||||
_track.addChild(_knob);
|
||||
}
|
||||
}
|
||||
|
||||
protected function handlePlayerError (event :ValueEvent) :void
|
||||
{
|
||||
// TODO.. maybe just redispatch
|
||||
log.warning("player error: " + event.value);
|
||||
}
|
||||
|
||||
protected function adjustSeek (trackX :Number) :void
|
||||
{
|
||||
// see if we can seek to a position
|
||||
const dur :Number = _player.getDuration();
|
||||
if (isNaN(dur)) {
|
||||
log.debug("Duration is NaN, not seeking.");
|
||||
return;
|
||||
}
|
||||
if (trackX == _lastKnobX) {
|
||||
return;
|
||||
}
|
||||
_lastKnobX = trackX;
|
||||
var perc :Number = trackX / TRACK_WIDTH;
|
||||
perc = Math.max(0, Math.min(1, perc));
|
||||
log.debug("Seek", "x", trackX, "perc", perc, "pos", (perc * dur));
|
||||
_player.seek(perc * dur);
|
||||
}
|
||||
|
||||
protected function showHUD (show :Boolean) :void
|
||||
{
|
||||
if (show == (_hud.parent == null)) {
|
||||
if (show) {
|
||||
addChild(_hud);
|
||||
} else {
|
||||
removeChild(_hud);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function redrawHUD () :void
|
||||
{
|
||||
const state :int = _player.getState();
|
||||
|
||||
const g :Graphics = _hud.graphics;
|
||||
g.clear();
|
||||
|
||||
if ((state != MediaPlayerCodes.STATE_READY) &&
|
||||
(state != MediaPlayerCodes.STATE_PLAYING) &&
|
||||
(state != MediaPlayerCodes.STATE_PAUSED)) {
|
||||
// draw something loading-like
|
||||
// TODO animated swf
|
||||
g.beginFill(0x000033);
|
||||
g.drawCircle(5, 5, 10);
|
||||
g.drawCircle(-5, 5, 10);
|
||||
g.drawCircle(-5, -5, 10);
|
||||
g.drawCircle(5, -5, 10);
|
||||
g.endFill();
|
||||
return;
|
||||
}
|
||||
|
||||
// draw a nice circle
|
||||
g.beginFill(0x000000, .7);
|
||||
g.drawCircle(0, 0, 20);
|
||||
g.endFill();
|
||||
g.lineStyle(2, 0xFFFFFF);
|
||||
g.drawCircle(0, 0, 20);
|
||||
|
||||
if (state == MediaPlayerCodes.STATE_PLAYING) {
|
||||
g.lineStyle(2, 0x00FF00);
|
||||
g.moveTo(-4, -10);
|
||||
g.lineTo(-4, 10);
|
||||
g.moveTo(4, -10);
|
||||
g.lineTo(4, 10);
|
||||
|
||||
} else { // READY or PAUSED
|
||||
g.lineStyle(0, 0, 0);
|
||||
g.beginFill(0x00FF00);
|
||||
g.moveTo(-4, -10);
|
||||
g.lineTo(4, 0);
|
||||
g.lineTo(-4, 10);
|
||||
g.lineTo(-4, -10);
|
||||
g.endFill();
|
||||
}
|
||||
}
|
||||
|
||||
protected const log :Log = Log.getLog(this);
|
||||
|
||||
protected var _player :VideoPlayer;
|
||||
|
||||
protected var _hud :Sprite;
|
||||
|
||||
protected var _track :Sprite;
|
||||
|
||||
/** The seek selector knob, positioned on the hud. */
|
||||
protected var _knob :Sprite;
|
||||
|
||||
protected var _lastKnobX :int = int.MIN_VALUE;
|
||||
|
||||
protected var _dragging :Boolean;
|
||||
|
||||
protected static const PAD :int = 10;
|
||||
protected static const TRACK_HEIGHT :int = 20;
|
||||
protected static const TRACK_WIDTH :int = NATIVE_WIDTH - (PAD * 2);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user