Bye-bye extensible player lists. Your functionality will be simplified and

supplanted by the one true player list.


git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@458 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
Ray Greenwell
2007-10-18 02:31:03 +00:00
parent 2736d652e3
commit f1a511d80c
4 changed files with 0 additions and 368 deletions
@@ -1,189 +0,0 @@
//
// $Id$
package com.threerings.ezgame {
import mx.core.ClassFactory;
import mx.collections.ArrayCollection;
import mx.collections.Sort;
import mx.containers.VBox;
import mx.controls.List;
/**
* A players display in flex.
* Feel free to subclass/rewrite/copy/alter/tweak/whatever as much as you want.
* Check out ScorePlayersFlexDisplay for an example of a subclass.
*/
public class PlayersFlexDisplay extends VBox
{
public function PlayersFlexDisplay ()
{
super();
}
/**
* Called to configure this display to start displaying. This is separated from the
* constructor to make subclassing easier.
*/
public function configure (gameCtrl :EZGameControl, playersOnly :Boolean = false) :void
{
_ctrl = gameCtrl;
_playersOnly = playersOnly;
_ourId = _ctrl.getMyId();
// set up the UI
createInterface();
// add listeners
_ctrl.addEventListener(StateChangedEvent.TURN_CHANGED, handleTurnChanged);
_ctrl.addEventListener(OccupantChangedEvent.OCCUPANT_ENTERED, handleOccupantEntered);
_ctrl.addEventListener(OccupantChangedEvent.OCCUPANT_LEFT, handleOccupantLeft);
// set up the sort for the collection
var sort :Sort = new Sort();
sort.compareFunction = sortFunction;
_players.sort = sort;
// find all the current occupants and add them to our list of players
var list :Array;
if (_playersOnly) {
list = _ctrl.seating.getPlayerIds();
} else {
list = _ctrl.getOccupantIds();
}
for each (var occupantId :int in list) {
_players.addItem(createRecord(occupantId));
}
updateList();
}
/**
* Create the UI.
*/
protected function createInterface () :void
{
_list = new List();
_list.itemRenderer = new ClassFactory(getRendererClass());
_list.dataProvider = _players;
addChild(_list);
}
/**
* Return the class to use as our List itemRenderer.
*/
protected function getRendererClass () :Class
{
return SimplePlayerRenderer;
}
/**
* Handle an update to the current turn.
* This is only applicable for turn-based games.
*/
protected function handleTurnChanged (event :StateChangedEvent) :void
{
// TODO
}
/**
* Handle the addition of a new occupant to the game.
*/
protected function handleOccupantEntered (event :OccupantChangedEvent) :void
{
// if we're only displaying players, and this isn't, then don't show 'em!
if (_playersOnly && !event.player) {
return;
}
_players.addItem(createRecord(event.occupantId));
}
/**
* Handle the removal of an occupant to the game.
*/
protected function handleOccupantLeft (event :OccupantChangedEvent) :void
{
for (var ii :int = _players.length - 1; ii >= 0; ii--) {
var rec :Object = _players.getItemAt(ii);
if (rec.id == event.occupantId) {
_players.removeItemAt(ii);
return;
}
}
// don't worry if we never found the record..
}
/**
* Should be called when records are added to the list, or list data has changed such
* that it should be re-sorted.
*/
protected function updateList () :void
{
_players.refresh();
}
/**
* Create an associative hash to hold properties related to a player or occupant.
* This class assumes that 'id' will hold the occupantId, and that 'name' will hold
* the name. Other fields can be added and a custom renderer can be used to display those
* fields.
*
* @return an Object populated with the occupant's properties, or null if the occupant
* should be ommitted
*/
protected function createRecord (occupantId :int) :Object
{
var record :Object = new Object();
record.id = occupantId;
record.name = _ctrl.getOccupantName(occupantId);
return record;
}
/**
* The sort function that will be used to display occupant records.
*
* @return -1 if rec1 should be first, 0 if they are equal (?), 1 if rec2 should be first.
*/
protected function sortFunction (rec1 :Object, rec2 :Object, fields :Array = null) :int
{
// make our record always on top..
if (rec1.id == _ourId) {
return -1;
}
if (rec2.id == _ourId) {
return 1;
}
// otherwise, sort by name
if (rec1.name < rec2.name) {
return -1;
}
if (rec1.name > rec2.name) {
return 1;
}
return 0; // huh.. same damn name
}
/** The game control. */
protected var _ctrl :EZGameControl;
/** The occupantId of the occupant that's instatiated this widget. */
protected var _ourId :int;
/** Are we only displaying players (not occupants)? */
protected var _playersOnly :Boolean;
/** The List widget that displays the players. */
protected var _list :List;
/** The list of player data. */
protected var _players :ArrayCollection = new ArrayCollection();
}
}
@@ -1,28 +0,0 @@
//
// $Id$
package com.threerings.ezgame {
import mx.controls.Label;
public class ScorePlayerRenderer extends SimplePlayerRenderer
{
override protected function createUI () :void
{
super.createUI();
addChild(_scoreLabel = new Label());
_scoreLabel.maxWidth = 100;
}
override protected function configureUI () :void
{
super.configureUI();
_scoreLabel.text = String(data.score);
}
/* The label used to display the player's score. */
protected var _scoreLabel :Label;
}
}
@@ -1,79 +0,0 @@
//
// $Id$
package com.threerings.ezgame {
/**
* Displays a player list with integer scores, sorting players according to their score.
*/
// TODO: retain scores for players that are absent?
public class ScorePlayersFlexDisplay extends PlayersFlexDisplay
{
public function ScorePlayersFlexDisplay ()
{
super();
}
/**
* Update the score for a single player.
*/
public function setScore (occupantId :int, score :int) :void
{
for (var ii :int = _players.length - 1; ii >= 0; ii--) {
var rec :Object = _players.getItemAt(ii);
if (rec.id == occupantId) {
rec.score = score;
updateList();
return;
}
}
// hmm, never found...
}
/**
* Mass-update scores for players.
*
* @param mapping a hash mapping occupantId -> score.
*/
public function setScores (mapping :Object) :void
{
for (var ii :int = _players.length - 1; ii >= 0; ii--) {
var rec :Object = _players.getItemAt(ii);
trace("Examining " + rec.id);
if (String(rec.id) in mapping) {
rec.score = int(mapping[String(rec.id)]);
trace("Set score of " + rec.id + " to " + rec.score);
}
}
updateList();
}
override protected function getRendererClass () :Class
{
return ScorePlayerRenderer;
}
override protected function createRecord (occupantId :int) :Object
{
var record :Object = super.createRecord(occupantId);
record.score = 0;
return record;
}
override protected function sortFunction (rec1 :Object, rec2 :Object, fields :Array = null) :int
{
// always sort on score
if (rec1.score > rec2.score) {
return -1;
}
if (rec1.score < rec2.score) {
return 1;
}
// if two players have the same score then sort according to the superclass rules
return super.sortFunction(rec1, rec2, fields);
}
}
}
@@ -1,72 +0,0 @@
//
// $Id$
package com.threerings.ezgame {
import mx.containers.HBox;
import mx.controls.Label;
import mx.core.ScrollPolicy;
public class SimplePlayerRenderer extends HBox
{
public function SimplePlayerRenderer ()
{
super();
configureProperties();
}
override public function set data (value :Object) :void
{
super.data = value;
if (processedDescriptors) {
configureUI();
}
}
override protected function createChildren () :void
{
super.createChildren();
createUI();
if (data != null) {
data = data; // re-set
}
}
/**
* Configure any UI properties of this renderer.
*/
protected function configureProperties () :void
{
verticalScrollPolicy = ScrollPolicy.OFF;
horizontalScrollPolicy = ScrollPolicy.OFF;
}
/**
* Create any UI elements needed.
*/
protected function createUI () :void
{
addChild(_nameLabel = new Label());
_nameLabel.maxWidth = 100;
}
/**
* Configure the actual UI elements with the data.
*/
protected function configureUI () :void
{
_nameLabel.text = String(data.name);
}
/** The label used to display the player's name. */
protected var _nameLabel :Label;
}
}