Added basic framework for providing game configuration interfaces that can

be used by a matchmaking interface when setting up a game.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1617 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2002-07-25 23:20:22 +00:00
parent d06aeb2cc7
commit b7b44f5f14
4 changed files with 191 additions and 56 deletions
@@ -0,0 +1,56 @@
//
// $Id: TableGameConfigurator.java,v 1.1 2002/07/25 23:20:22 mdb Exp $
package com.threerings.micasa.lobby.table;
import javax.swing.JPanel;
import javax.swing.JSlider;
import com.samskivert.swing.HGroupLayout;
import com.samskivert.swing.VGroupLayout;
import com.samskivert.swing.SimpleSlider;
import com.threerings.parlor.client.GameConfigurator;
import com.threerings.parlor.data.TableConfig;
import com.threerings.parlor.util.ParlorContext;
/**
* Extends the basic game configurator with elements to support the
* configuration of standard table game configurations.
*/
public class TableGameConfigurator extends GameConfigurator
{
// documentation inherited
protected void createConfigInterface ()
{
// create a slider and associated label for configuring the number
// of people at the table
add(_pslide = new SimpleSlider("Seats:", 0, 10, 0), VGroupLayout.FIXED);
// TODO: get a message bundle and translate "Seats"
}
// documentation inherited
protected void gotGameConfig ()
{
TableConfig tconfig = (TableConfig)_config;
// configure our slider
_pslide.setMinimum(tconfig.getMinimumPlayers());
_pslide.setMaximum(tconfig.getMaximumPlayers());
_pslide.setValue(tconfig.getDesiredPlayers());
// if the min == the max, hide the slider because it's pointless
_pslide.setVisible(tconfig.getMinimumPlayers() !=
tconfig.getMaximumPlayers());
}
// documentation inherited
protected void flushGameConfig ()
{
TableConfig tconfig = (TableConfig)_config;
tconfig.setDesiredPlayers(_pslide.getValue());
}
/** Our number of players slider. */
protected SimpleSlider _pslide;
}
@@ -1,5 +1,5 @@
// //
// $Id: TableListView.java,v 1.4 2002/03/18 23:21:26 mdb Exp $ // $Id: TableListView.java,v 1.5 2002/07/25 23:20:22 mdb Exp $
package com.threerings.micasa.lobby.table; package com.threerings.micasa.lobby.table;
@@ -25,9 +25,10 @@ import com.samskivert.swing.VGroupLayout;
import com.threerings.crowd.client.PlaceView; import com.threerings.crowd.client.PlaceView;
import com.threerings.crowd.data.PlaceObject; import com.threerings.crowd.data.PlaceObject;
import com.threerings.parlor.client.GameConfigurator;
import com.threerings.parlor.client.SeatednessObserver;
import com.threerings.parlor.client.TableDirector; import com.threerings.parlor.client.TableDirector;
import com.threerings.parlor.client.TableObserver; import com.threerings.parlor.client.TableObserver;
import com.threerings.parlor.client.SeatednessObserver;
import com.threerings.parlor.data.Table; import com.threerings.parlor.data.Table;
import com.threerings.parlor.data.TableConfig; import com.threerings.parlor.data.TableConfig;
import com.threerings.parlor.game.GameConfig; import com.threerings.parlor.game.GameConfig;
@@ -43,10 +44,8 @@ import com.threerings.micasa.util.MiCasaContext;
* the matchmaking process. UI mechanisms for creating and joining tables * the matchmaking process. UI mechanisms for creating and joining tables
* are also provided. * are also provided.
*/ */
public class TableListView public class TableListView extends JPanel
extends JPanel implements PlaceView, TableObserver, ActionListener, SeatednessObserver
implements PlaceView, TableObserver, ActionListener, SeatednessObserver,
ChangeListener
{ {
/** /**
* Creates a new table list view, suitable for providing the user * Creates a new table list view, suitable for providing the user
@@ -82,32 +81,33 @@ public class TableListView
_matchList.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); _matchList.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panel.add(new JScrollPane(_matchList)); panel.add(new JScrollPane(_matchList));
// create a prototype game config to configure our slider // create our configurator interface
GameConfig gconfig = null;
try { try {
TableConfig tconfig = (TableConfig)config.getGameConfig(); gconfig = config.getGameConfig();
JPanel cpanel = Class cclass = gconfig.getConfiguratorClass();
new JPanel(new HGroupLayout(HGroupLayout.STRETCH)); if (cclass != null) {
cpanel.add(new JLabel("Seats:"), HGroupLayout.FIXED); // create and initialize the configurator interface
_figger = (GameConfigurator)cclass.newInstance();
int min = tconfig.getMinimumPlayers(); _figger.init(_ctx);
_pslide = new JSlider(JSlider.HORIZONTAL, min, // give it the game config
tconfig.getMaximumPlayers(), min); _figger.setGameConfig(gconfig);
_pslide.addChangeListener(this); // and add the whole business to the main UI
cpanel.add(_pslide); panel.add(_figger, VGroupLayout.FIXED);
}
_pcount = new JLabel(Integer.toString(min));
cpanel.add(_pcount, HGroupLayout.FIXED);
_create = new JButton("Create table"); _create = new JButton("Create table");
_create.addActionListener(this); _create.addActionListener(this);
cpanel.add(_create, HGroupLayout.FIXED); panel.add(_create, VGroupLayout.FIXED);
panel.add(cpanel, VGroupLayout.FIXED);
} catch (Exception e) { } catch (Exception e) {
Log.warning("Unable to obtain prototype game config to " + Log.warning("Unable to create configurator interface " +
"configure matchmaking interface."); "[config=" + gconfig + "].");
Log.logStackTrace(e); Log.logStackTrace(e);
// stick something in the UI to let them know we're hosed
panel.add(new JLabel("Aiya! Can't create tables. " +
"Configuration borked."), VGroupLayout.FIXED);
} }
add(panel); add(panel);
@@ -216,24 +216,9 @@ public class TableListView
// documentation inherited // documentation inherited
public void actionPerformed (ActionEvent event) public void actionPerformed (ActionEvent event)
{ {
// the create table button was clicked. pass the word on to the // the create table button was clicked. use the game config as
// table director // configured by the configurator to create a table
GameConfig config = null; _tdtr.createTable(_figger.getGameConfig());
try {
config = _config.getGameConfig();
} catch (Exception e) {
Log.warning("Unable to resolve game config class " +
"[lconfig=" + _config + ", error=" + e + "].");
return;
}
if (config instanceof TableConfig) {
// set the desired number of players
((TableConfig)config).setDesiredPlayers(_pslide.getValue());
}
// and create a table with these values
_tdtr.createTable(config);
} }
// documentation inherited // documentation inherited
@@ -243,15 +228,6 @@ public class TableListView
_create.setEnabled(!isSeated); _create.setEnabled(!isSeated);
} }
// documentation inherited
public void stateChanged (ChangeEvent e)
{
JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting()) {
_pcount.setText(Integer.toString(source.getValue()));
}
}
/** /**
* Fetches the table item component associated with the specified * Fetches the table item component associated with the specified
* table id. * table id.
@@ -296,12 +272,12 @@ public class TableListView
/** The list of tables that are in play. */ /** The list of tables that are in play. */
protected JPanel _playList; protected JPanel _playList;
/** The interface used to configure a table before creating it. */
protected GameConfigurator _figger;
/** Our create table button. */ /** Our create table button. */
protected JButton _create; protected JButton _create;
/** Our number of players slider. */
protected JSlider _pslide;
/** Our number of players indicator. */ /** Our number of players indicator. */
protected JLabel _pcount; protected JLabel _pcount;
} }
@@ -0,0 +1,94 @@
//
// $Id: GameConfigurator.java,v 1.1 2002/07/25 23:20:22 mdb Exp $
package com.threerings.parlor.client;
import javax.swing.JPanel;
import com.samskivert.swing.VGroupLayout;
import com.threerings.parlor.game.GameConfig;
import com.threerings.parlor.util.ParlorContext;
/**
* Provides the base from which interfaces can be built to configure games
* prior to starting them. Derived classes would extend the base
* configurator adding interface elements and wiring them up properly to
* allow the user to configure an instance of their game.
*
* <p> Clients that use the game configurator will want to instantiate one
* based on the class returned from the {@link GameConfig} and then
* initialize it with a call to {@link #init}.
*/
public class GameConfigurator extends JPanel
{
/**
* Initializes this game configurator, creates its user interface
* elements and prepares it for display.
*/
public void init (ParlorContext ctx)
{
// save this for later
_ctx = ctx;
// set up our layout manager
VGroupLayout layout = new VGroupLayout(VGroupLayout.NONE);
layout.setOffAxisPolicy(VGroupLayout.STRETCH);
setLayout(layout);
// create our interface elements
createConfigInterface();
}
/**
* The default implementation creates a label indicating that no game
* specific configurations are available.
*/
protected void createConfigInterface ()
{
}
/**
* Provides this configurator with its configuration. It should set up
* all of its user interface elements to reflect the configuration.
*/
public void setGameConfig (GameConfig config)
{
_config = config;
// set up the user interface
gotGameConfig();
}
/**
* Derived classes will likely want to override this method and
* configure their user interface elements accordingly.
*/
protected void gotGameConfig ()
{
}
/**
* Obtains a configured game configuration.
*/
public GameConfig getGameConfig ()
{
// flush our changes to the config object
flushGameConfig();
return _config;
}
/**
* Derived classes will want to override this method, flushing values
* from the user interface to the game config object so that it is
* properly configured prior to being returned to the {@link
* #getGameConfig} caller.
*/
protected void flushGameConfig ()
{
}
/** Provides access to client services. */
protected ParlorContext _ctx;
/** Our game configuration. */
protected GameConfig _config;
}
@@ -1,9 +1,10 @@
// //
// $Id: GameConfig.java,v 1.10 2002/07/23 05:54:52 mdb Exp $ // $Id: GameConfig.java,v 1.11 2002/07/25 23:20:22 mdb Exp $
package com.threerings.parlor.game; package com.threerings.parlor.game;
import com.threerings.crowd.data.PlaceConfig; import com.threerings.crowd.data.PlaceConfig;
import com.threerings.parlor.client.GameConfigurator;
/** /**
* The game config class encapsulates the configuration information for a * The game config class encapsulates the configuration information for a
@@ -27,6 +28,14 @@ public abstract class GameConfig extends PlaceConfig
/** Indicates whether or not this game is rated. */ /** Indicates whether or not this game is rated. */
public boolean rated = true; public boolean rated = true;
/**
* Returns the class that should be used to create a user interface
* that can be used to configure this instance prior to starting the
* game. The configurator class must derive from {@link
* GameConfigurator}.
*/
public abstract Class getConfiguratorClass ();
/** /**
* Returns true if this game config object is equal to the supplied * Returns true if this game config object is equal to the supplied
* object (meaning it is also a game config object and its * object (meaning it is also a game config object and its