Lots of work towards team and player panels.

Created graphics for player panel.
Fleshed out team and player panels.
This commit is contained in:
Jonathan Bernard 2010-08-29 23:29:38 -05:00
parent 73284c6fea
commit b3e09493f4
24 changed files with 257 additions and 26 deletions

View File

@ -66,7 +66,7 @@
destfile="${build.dir}/${app.name}-${app.version}.${build.number}.jar" destfile="${build.dir}/${app.name}-${app.version}.${build.number}.jar"
basedir="${build.dir}/classes"> basedir="${build.dir}/classes">
<manifest> <manifest>
<attribute name="Main-Class" value="com.jdbernard.teammaker.TeamMaker"/> <attribute name="Main-Class" value="com.jdbernard.teammaker.ProfessionalPickup"/>
<attribute name="SplashScreen-Image" value="splash.png"/> <attribute name="SplashScreen-Image" value="splash.png"/>
</manifest> </manifest>
</jar> </jar>

BIN
lib/slf4j-api-1.6.1.jar Executable file

Binary file not shown.

BIN
lib/slf4j-log4j12-1.6.1.jar Executable file

Binary file not shown.

View File

@ -1,7 +1,7 @@
#Fri, 27 Aug 2010 05:37:05 -0500 #Sun, 29 Aug 2010 22:59:56 -0500
#Mon Jul 05 23:10:39 CDT 2010 #Mon Jul 05 23:10:39 CDT 2010
app.version=0.4.0 app.version=0.4.0
build.number=9 build.number=36
src.dir=src src.dir=src
lib.dir=lib lib.dir=lib
build.dir=build build.dir=build

BIN
resources/board.xcf Normal file

Binary file not shown.

View File

@ -0,0 +1,2 @@
base-point-value=1
team.size=4

BIN
resources/plus1T1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
resources/plus1T2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
resources/plus2T1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
resources/plus2T2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
resources/plus3T1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
resources/plus3T2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
resources/reboundT1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
resources/reboundT2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
resources/turnover.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

BIN
resources/turnoverT1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

BIN
resources/turnoverT2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

View File

@ -3,6 +3,16 @@ package com.jdbernard.teammaker
public class Game { public class Game {
static int BASE_POINT_VALUE = 1 static int BASE_POINT_VALUE = 1
public static enum Team {
TEAM1("T1"), TEAM2("T2");
public final String suffix;
private Team(String suffix) { this.suffix = suffix }
public String toString() { return "Team ${ordinal() + 1}" }
}
// lists of players for each team // lists of players for each team
List team1 List team1
List team2 List team2
@ -33,4 +43,9 @@ public class Game {
public int getTeamTurnovers(List team) { public int getTeamTurnovers(List team) {
return team.sum { turnovers[(it.name)] ?: 0 } return team.sum { turnovers[(it.name)] ?: 0 }
} }
public List getTeam(Team team) {
if (team == Team.TEAM1) return team1
else return team2
}
} }

View File

@ -11,8 +11,8 @@ public class Player implements Comparable<Player> {
public int getPlusMinus() { public int getPlusMinus() {
if (games.size() == 0) return 0 if (games.size() == 0) return 0
int plusMinus games.sum { game -> int plusMinus = games.sum { game ->
if (game.team1.contains(this)) { if (game.team1.contains(this))
return game.team1Score - game.team2Score return game.team1Score - game.team2Score
else return game.team2Score - game.team1Score else return game.team2Score - game.team1Score
} }
@ -26,7 +26,7 @@ public class Player implements Comparable<Player> {
points += (game.twoPointers[(name)] ?: 0) * (Game.BASE_POINT_VALUE) points += (game.twoPointers[(name)] ?: 0) * (Game.BASE_POINT_VALUE)
} }
return (games.size() == 0 ? 0 : points /= games.size()) return (games.size() == 0 ? 0 : points / games.size())
} }
public float getReboundsPerGame() { public float getReboundsPerGame() {

View File

@ -14,7 +14,7 @@ public class PlayerListCellRenderer extends JPanel implements ListCellRenderer {
boolean showStats boolean showStats
boolean colored boolean colored
private TeamMaker teamMaker private ProfessionalPickup teamMaker
private JLabel nameLabel private JLabel nameLabel
private JLabel statsLabel private JLabel statsLabel

View File

@ -1,19 +1,124 @@
package com.jdbernard.teammaker package com.jdbernard.teammaker
import groovy.beans.Bindable
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import static java.awt.event.MouseEvent.BUTTON1 as LEFT_BUTTON
import static java.awt.event.MouseEvent.BUTTON2 as RIGHT_BUTTON
public class PlayerPanel { public class PlayerPanel {
/* ======== MODEL ======== */ /* ======== MODEL ======== */
static def swing = ProfessionalPickup.swing
static def icons = [:]
TeamPanel teamPanel
Logger log = LoggerFactory.getLogger(getClass())
// GUI Components // GUI Components
class View { class View {
def panel def panel
def nameLabel
def twoPtrButton
def twoPtAttemptsButton
def threePtrButton
def threePtAttemptsButton
def rebsButton
def toversButton
} }
View view View view = new View()
class Model { class Model {
@Bindable Player player
@Bindable Game game
@Bindable Game.Team team
} }
Model model Model model = new Model()
/* ======== VIEW ======== */ /* ======== VIEW ======== */
private void initGUI() {
view.panel = swing.hbox {
hstrut(5)
view.nameLabel = label(model.player.name)
hstrut(5)
view.twoPtrButton = button(
icon: getIcon("plus${Game.BASE_POINT_VALUE}"),
iconTextGap: 0, margin: [0, 0, 0, 0],
actionPerformed: { evt ->
if (LEFT_BUTTON == evt.button) {
model.game.twoPointers[(model.player.name)]++
model.game.twoPointAttemps[(model.player.name)]++
} else {
model.game.twoPointers[(model.player.name)]--
model.game.twoPointAttemps[(model.player.name)]--
}},
toolTipText: "Click to add a successful " +
Game.BASE_POINT_VALUE + " point shot.\nRight-click to " +
"undo (remove the shot).")
hstrut(5)
view.threePtrButton = button(
icon: getIcon("plus${Game.BASE_POINT_VALUE + 1}"),
iconTextGap: 0, margin: [0, 0, 0, 0],
actionPerformed: { evt ->
if (LEFT_BUTTON == evt.button) {
model.game.threePointers[(model.player.name)]++
model.game.threePointAttempts[(model.player.name)]++
} else {
model.game.threePointers[(model.player.name)]--
model.game.threePointAttempts[(model.player.name)]--
}},
toolTipText: "Click to add a successful " +
(Game.BASE_POINT_VALUE + 1) + " point shot.\nRight-click " +
"to undo (remove the shot).")
hstrut(5)
view.rebsButton = button(
icon: getIcon("rebound"),
iconTextGap: 0, margin: [0, 0, 0, 0],
actionPerformed: { evt ->
if (LEFT_BUTTON == evt.button)
model.game.rebounds[(model.player.name)]++
else model.game.rebounds[(model.player.name)]-- },
toolTipText: "Click to add a rebound.\nRight-click to undo.")
hstrut(5)
view.toversButton = button(
icon: getIcon("turnover"),
iconTextGap: 0, margin: [0, 0, 0, 0],
actionPerformed: { evt ->
if (LEFT_BUTTON == evt.button)
model.game.turnovers[(model.player.name)]++
else model.game.turnovers[(model.player.name)]-- },
toolTipText: "Click to add a turnover.\nRight click to undo.")
hglue()
}
}
private def getIcon(String type) {
String iconKey = type + model.team.suffix
if (!icons[iconKey]) {
if (log.isDebugEnabled())
log.debug("Looking for icon resources: /${iconKey}.png")
icons[iconKey] = swing.imageIcon("/${iconKey}.png")
}
return icons[iconKey]
}
/* ======== CONTROLLER ======== */
public PlayerPanel(TeamPanel teamPanel, Player player) {
this.teamPanel = teamPanel
model.player = player
model.game = teamPanel.model.game
model.team = teamPanel.model.team
initGUI()
}
}

View File

@ -11,6 +11,8 @@ import javax.swing.JFrame
import javax.swing.JOptionPane import javax.swing.JOptionPane
import org.apache.log4j.Logger import org.apache.log4j.Logger
import static com.jdbernard.teammaker.Game.Team.*
public class ProfessionalPickup { public class ProfessionalPickup {
/* ======== MODEL ======== */ /* ======== MODEL ======== */
@ -233,7 +235,7 @@ public class ProfessionalPickup {
.withInputStream { is -> teammakerrc.text = is.text } .withInputStream { is -> teammakerrc.text = is.text }
// load config // load config
teammakerrc.withInputStream { model.config.load(is) } teammakerrc.withInputStream { model.config.load(it) }
// set configured properties // set configured properties
Game.BASE_POINT_VALUE = model.config.getProperty('base-point-value', Game.BASE_POINT_VALUE = model.config.getProperty('base-point-value',
@ -253,11 +255,11 @@ public class ProfessionalPickup {
} }
private void setTeamSize() { private void setTeamSize() {
def newSize = JOptionPane.showMessageDialog(view.frame, def newSize = JOptionPane.showInputDialog(view.frame,
"Enter the new team size: ", "Set Team Size...", "Enter the new team size: ", "Set Team Size...",
JOptionPane.QUESTION_MESSAGE) JOptionPane.QUESTION_MESSAGE)
if (newSize.isInteger()) model.teamSize = newSize.toInteger() if (newSize && newSize.isInteger()) model.teamSize = newSize.toInteger()
else JOptionPane.showMessageDialog(view.frame, else JOptionPane.showMessageDialog(view.frame,
"$newSize is not a valid team size (it is not a number...).", "$newSize is not a valid team size (it is not a number...).",
"Set Team Size...", JOptionPane.ERROR_MESSAGE) "Set Team Size...", JOptionPane.ERROR_MESSAGE)
@ -291,9 +293,14 @@ public class ProfessionalPickup {
} }
private void declareLoser(int teamNum) { public void declareWinner(Game.Team team) {
if (team == TEAM1) declareLoser(TEAM2)
else declareLoser(TEAM1)
}
public void declareLoser(Game.Team team) {
model.sittingPlayers.each { it.gamesSat++ } model.sittingPlayers.each { it.gamesSat++ }
def teamPlayers = playersForTeam(teamNum) def teamPlayers = playersForTeam(team)
teamPlayers.each { player -> teamPlayers.each { player ->
player.gamesSat = 0 player.gamesSat = 0
model.sittingPlayers << player model.sittingPlayers << player
@ -337,8 +344,8 @@ public class ProfessionalPickup {
} }
private void populate(int teamNum) { private void populate(Game.Team team) {
def teamPlayers = playersForTeam(teamNum) def teamPlayers = playersForTeam(team)
while (teamPlayers.size() < model.teamSize) { while (teamPlayers.size() < model.teamSize) {
def player = model.playerChooser.choose(model.sittingPlayers) def player = model.playerChooser.choose(model.sittingPlayers)
teamPlayers << player teamPlayers << player
@ -348,15 +355,15 @@ public class ProfessionalPickup {
refreshGUI(); refreshGUI();
} }
private benchPlayer(Player p, int teamNum) { private benchPlayer(Player p, Game.Team team) {
def teamPlayers = playersForTeam(teamNum) def teamPlayers = playersForTeam(team)
teamPlayers.remove(p) teamPlayers.remove(p)
model.sittingPlayers << p model.sittingPlayers << p
refreshGUI() refreshGUI()
} }
private assignPlayer(Player p, int teamNum) { private assignPlayer(Player p, Game.Team team) {
def teamPlayers = playersForTeam(teamNum) def teamPlayers = playersForTeam(team)
model.sittingPlayers.remove(p) model.sittingPlayers.remove(p)
teamPlayers << p teamPlayers << p
refreshGUI() refreshGUI()
@ -410,13 +417,13 @@ public class ProfessionalPickup {
refreshGUI() refreshGUI()
} }
private List playersForTeam(int teamNum) { private List playersForTeam(Game.Team team) {
if (teamNum == 1) return model.team1Players if (team == Game.Team.TEAM1) return model.team1Players
else return model.team2Players else return model.team2Players
} }
private List listForTeam(int teamNum) { private List listForTeam(Game.Team team) {
if (teamNum == 1) return view.team1List if (team == Game.Team.TEAM11) return view.team1List
else return view.team2List else return view.team2List
} }
} }

View File

@ -1,23 +1,97 @@
package com.jdbernard.teammaker package com.jdbernard.teammaker
import groovy.beans.Bindable
import javax.swing.BoxLayout
import static com.jdbernard.teammaker.Game.Team.*
public class TeamPanel { public class TeamPanel {
/* ======== MODEL ======== */ /* ======== MODEL ======== */
private static def swing = ProfessionalPickup.swing
ProfessionalPickup main
// GUI components // GUI components
class View { class View {
def panel def panel
def teamStatsBox
def scoreLabel
def reboundsLabel
def turnoversLabel
def playerPanels
def winsButton
} }
View view = new View() View view = new View()
class Model { class Model {
@Bindable String name //@Bindable String name
@Bindable Game game
@Bindable Game.Team team
@Bindable List players
} }
Model model = new Model() Model model = new Model()
/* ======== VIEW ======== */ /* ======== VIEW ======== */
view.panel = swing.panel(border: titledBorder(model.name)) { private void initGUI() {
view.panel = swing.vbox {
view.teamStatsBox = hbox {
vstrut(5)
view.scoreLabel = label("0")
vstrut(5)
view.reboundsLabel = label("Rebs: 0")
vstrut(5)
view.turnoversLabel = label("T/Os: 0")
hglue()
view.winsButton = button("Winners",
actionPerformed: { main.declareWinner(model.team) })
vstrut(5)
}
}
view.playerPanels = []
}
private void initPlayerPanels(List players) {
view.playerPanels.each { view.panel.remove(it.view.panel) }
view.playerPanels.clear()
// create and add player panels
model.players.each { player ->
def playerPanel = new PlayerPanel(this, player)
view.panel << playerPanel.view.panel
view.playerPanels << playerPanel.view.panel
}
}
/* ======== CONTROLLER ======== */
public TeamPanel(ProfessionalPickup main, Game.Team team) {
this.main = main
model.team = team
initGUI()
}
public void newGame(Game game) {
model.game = game
model.players = game.getTeam(model.team)
view.panel.border = swing.titledBorder(model.team.toString())
initPlayerPanels(model.players)
}
public void updateStats() {
view.scoreLabel = model.game.getTeamScore(model.players)
view.reboundsLabel = model.game.getTeamRebounds(model.players)
view.turnoversLabel = model.game.getTeamTurnovers(model.players)
}
} }

View File

@ -0,0 +1,28 @@
package com.jdbernard.teammaker
import groovy.swing.SwingBuilder
public class Test {
public static void main(String[] args) {
Game.BASE_POINT_VALUE = 2
Player bob = new Player(name: "Bob", games: [], gamesSat: 0, benched: false)
Player stan = new Player(name: "Stan", games: [], gamesSat: 0, benched: false)
Game game = new Game(team1: [bob], team2: [stan])
def tp = new TeamPanel(null, Game.Team.TEAM1)
tp.newGame(game)
def pp = new PlayerPanel(tp, bob)
def swing = new SwingBuilder()
def frame = swing.frame(size: [400, 400]) {
vbox {
widget(pp.view.panel)
}
}
frame.show()
}
}