Skip to content

Commit

Permalink
Merge pull request #636 from frank-weinberg/feature/625
Browse files Browse the repository at this point in the history
Add game summary to the IGRF tab
  • Loading branch information
frank-weinberg authored May 19, 2023
2 parents 3e44c9d + 59d2712 commit fbddcd0
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 0 deletions.
7 changes: 7 additions & 0 deletions html/components/igrf-tab.css
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@
#Igrf tr.Files .ui-button { margin: 1px 5px; }
#Igrf tr.Files .Warning { color: red; }

#Igrf table.Summary { border: 1px solid black; border-collapse: collapse; background-color: white; font-weight: bold; font-size: 80%; margin: auto; }
#Igrf table.Summary td { border: 1px solid black; border-collapse: collapse; width: 80px; }
#Igrf table.Summary .Head, #Igrf table.Summary .Total { background-color: #ffd0ff; }
#Igrf table.Summary .Label { background-color: #ffe8ff; }
#Igrf table.Summary .Small { font-weight: initial; }
#Igrf table.Summary .Value { font-size: 125%; }

#Igrf .Expulsions th { font-size: 150%; }
#Igrf .Expulsions table { width: 100%; }

Expand Down
65 changes: 65 additions & 0 deletions html/components/igrf-tab.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ function createIgrfTab(tab, gameId) {
.append($('<tr><td/><td/><td/></tr>').addClass('Time'))
.append($('<tr><td colspan="3"><hr/></td></tr>').addClass('Separator Abort'))
.append($('<tr><td colspan="3"/></tr>').addClass('Abort Info'))
.append($('<tr><td colspan="3"><hr/></td></tr>').addClass('Separator'))
.append($('<tr><td colspan="3"/></tr>').addClass('Summary'))
.append($('<tr><td colspan="3"><hr/></td></tr>').addClass('Separator Expulsions Hide'))
.append($('<tr><td colspan="3"><table><tr><th colspan="3">Expulsions</th></tr></table></td></tr>').addClass('Expulsions Hide'))
.append($('<tr><td colspan="3"><hr/></td></tr>').addClass('Separator'))
Expand Down Expand Up @@ -158,6 +160,69 @@ function createIgrfTab(tab, gameId) {
}
);

var summaryTable = $('<table>')
.addClass('Summary')
.append(
$('<tr>')
.attr('nr', 0)
.addClass('Head')
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Team(1).Name', $('<td colspan="5">').addClass('Value')))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Team(2).Name', $('<td colspan="5">').addClass('Value')))
)
.append(
$('<tr>')
.addClass('Total')
.append($('<td colspan="2">').text('TOTAL POINTS:'))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Team(1).Score', $('<td>').addClass('Value')))
.append($('<td>').text('PENALTIES:'))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Team(1).TotalPenalties', $('<td>').addClass('Value')))
.append($('<td colspan="2">').text('TOTAL POINTS:'))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Team(2).Score', $('<td>').addClass('Value')))
.append($('<td>').text('PENALTIES:'))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Team(2).TotalPenalties', $('<td>').addClass('Value')))
)
.appendTo(table.find('tr.Summary>td'));

function addSummaryPeriodRow(nr) {
if (nr == 0) {
return summaryTable.children('tr[nr=0]');
}
var previousRow = summaryTable.children('tr[nr=' + (nr - 1) + ']');
if (!previousRow.length) {
previousRow = addSummaryPeriodRow(nr - 1);
}
return $('<tr>')
.attr('nr', nr)
.addClass('Period')
.append(
$('<td>')
.addClass('Label')
.text('Period ' + nr)
)
.append($('<td>').addClass('Label Small').text('Points'))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Period(' + nr + ').Team1Points', $('<td>').addClass('Value')))
.append($('<td>').addClass('Label Small').text('Penalties'))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Period(' + nr + ').Team1PenaltyCount', $('<td>').addClass('Value')))
.append(
$('<td>')
.addClass('Label')
.text('Period ' + nr)
)
.append($('<td>').addClass('Label Small').text('Points'))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Period(' + nr + ').Team2Points', $('<td>').addClass('Value')))
.append($('<td>').addClass('Label Small').text('Penalties'))
.append(WSDisplay('ScoreBoard.Game(' + gameId + ').Period(' + nr + ').Team2PenaltyCount', $('<td>').addClass('Value')))
.insertAfter(previousRow);
}

WS.Register('ScoreBoard.Game(' + gameId + ').Period(*).Number', function (k, v) {
if (v == null) {
summaryTable.children('tr[nr=' + k.Period + ']').remove();
} else {
addSummaryPeriodRow(v);
}
});

function createExpulsionRow(id) {
$('.Expulsions').removeClass('Hide');
return $('<tr>')
Expand Down
46 changes: 46 additions & 0 deletions src/com/carolinarollergirls/scoreboard/core/game/PeriodImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@
import com.carolinarollergirls.scoreboard.core.interfaces.Jam;
import com.carolinarollergirls.scoreboard.core.interfaces.Penalty;
import com.carolinarollergirls.scoreboard.core.interfaces.Period;
import com.carolinarollergirls.scoreboard.core.interfaces.Skater;
import com.carolinarollergirls.scoreboard.core.interfaces.Team;
import com.carolinarollergirls.scoreboard.core.interfaces.TeamJam;
import com.carolinarollergirls.scoreboard.core.interfaces.Timeout;
import com.carolinarollergirls.scoreboard.event.Child;
import com.carolinarollergirls.scoreboard.event.Command;
import com.carolinarollergirls.scoreboard.event.NumberedScoreBoardEventProviderImpl;
import com.carolinarollergirls.scoreboard.event.RecalculateScoreBoardListener;
import com.carolinarollergirls.scoreboard.event.ScoreBoardEventProvider;
import com.carolinarollergirls.scoreboard.event.Value;
import com.carolinarollergirls.scoreboard.event.ValueWithId;
import com.carolinarollergirls.scoreboard.rules.Rule;
import com.carolinarollergirls.scoreboard.utils.ScoreBoardClock;

Expand All @@ -21,6 +26,7 @@ public PeriodImpl(Game g, int p) {
setCopy(CURRENT_JAM_NUMBER, this, CURRENT_JAM, Jam.NUMBER, true);
setRecalculated(FIRST_JAM).addSource(this, JAM);
setCopy(FIRST_JAM_NUMBER, this, FIRST_JAM, Jam.NUMBER, true);
penaltyListener = setRecalculated(TEAM_1_PENALTY_COUNT).addSource(this, JAM);
if (hasPrevious()) {
set(CURRENT_JAM, getPrevious().get(CURRENT_JAM));
set(SUDDEN_SCORING, getPrevious().isSuddenScoring());
Expand All @@ -31,6 +37,12 @@ public PeriodImpl(Game g, int p) {
addWriteProtectionOverride(RUNNING, Source.NON_WS);
addWriteProtectionOverride(JAM, Source.NON_WS);
addWriteProtectionOverride(RUNNING, Source.NON_WS);
setRecalculated(TEAM_1_POINTS)
.addSource(g.getTeam(Team.ID_1), Team.SCORE)
.addSource(g.getTeam(Team.ID_1), Team.SCORE_ADJUSTMENT);
setRecalculated(TEAM_2_POINTS)
.addSource(g.getTeam(Team.ID_2), Team.SCORE)
.addSource(g.getTeam(Team.ID_2), Team.SCORE_ADJUSTMENT);
}

@Override
Expand All @@ -43,6 +55,33 @@ protected Object computeValue(Value<?> prop, Object value, Object last, Source s
return getWalltimeEnd() - getWalltimeStart();
}
}
if (prop == TEAM_1_PENALTY_COUNT) {
int t1Count = 0;
int t2Count = 0;
for (Jam jam : getAll(JAM)) {
for (Penalty p : jam.getAll(Jam.PENALTY)) {
if (!Skater.FO_EXP_ID.equals(p.getProviderId())) {
if (Team.ID_1.equals(p.getParent().getParent().getProviderId())) {
t1Count++;
} else {
t2Count++;
}
}
}
}
set(TEAM_2_PENALTY_COUNT, t2Count);
return t1Count;
}
if (prop == TEAM_1_POINTS) {
return getAll(JAM).size() > 0 ? getCurrentJam().getTeamJam(Team.ID_1).get(TeamJam.TOTAL_SCORE) -
getFirst(JAM).getTeamJam(Team.ID_1).get(TeamJam.LAST_SCORE)
: 0;
}
if (prop == TEAM_2_POINTS) {
return getAll(JAM).size() > 0 ? getCurrentJam().getTeamJam(Team.ID_2).get(TeamJam.TOTAL_SCORE) -
getFirst(JAM).getTeamJam(Team.ID_2).get(TeamJam.LAST_SCORE)
: 0;
}
return value;
}
@Override
Expand All @@ -64,6 +103,11 @@ protected void valueChanged(Value<?> prop, Object value, Object last, Source sou
}
}

@Override
protected void itemAdded(Child<?> prop, ValueWithId item, Source source) {
if (prop == JAM) { penaltyListener.addSource((ScoreBoardEventProvider) item, Jam.PENALTY); }
}

@Override
public ScoreBoardEventProvider create(Child<? extends ScoreBoardEventProvider> prop, String id, Source source) {
synchronized (coreLock) {
Expand Down Expand Up @@ -188,6 +232,8 @@ public long getWalltimeEnd() {

private Game game;

private RecalculateScoreBoardListener<?> penaltyListener;

public static class PeriodSnapshotImpl implements PeriodSnapshot {
private PeriodSnapshotImpl(Period period) {
id = period.getId();
Expand Down
13 changes: 13 additions & 0 deletions src/com/carolinarollergirls/scoreboard/core/game/TeamImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.carolinarollergirls.scoreboard.core.interfaces.Fielding;
import com.carolinarollergirls.scoreboard.core.interfaces.FloorPosition;
import com.carolinarollergirls.scoreboard.core.interfaces.Game;
import com.carolinarollergirls.scoreboard.core.interfaces.Penalty;
import com.carolinarollergirls.scoreboard.core.interfaces.Period;
import com.carolinarollergirls.scoreboard.core.interfaces.Position;
import com.carolinarollergirls.scoreboard.core.interfaces.PreparedTeam;
Expand Down Expand Up @@ -67,6 +68,7 @@ public TeamImpl(Game g, String i) {
scoreListener = setRecalculated(SCORE)
.addIndirectSource(this, RUNNING_OR_ENDED_TEAM_JAM, TeamJam.TOTAL_SCORE)
.addSource(this, SCORE_ADJUSTMENT);
penaltyListener = setRecalculated(TOTAL_PENALTIES).addSource(this, SKATER);
setRecalculated(IN_TIMEOUT)
.addIndirectSource(g, Game.CURRENT_TIMEOUT, Timeout.OWNER)
.addIndirectSource(g, Game.CURRENT_TIMEOUT, Timeout.REVIEW)
Expand Down Expand Up @@ -233,6 +235,15 @@ public void run() {
return last;
}
}
if (prop == TOTAL_PENALTIES) {
int count = 0;
for (Skater s : getAll(SKATER)) {
for (Penalty p : s.getAll(Skater.PENALTY)) {
if (!Skater.FO_EXP_ID.equals(p.getProviderId())) { count++; }
}
}
return count;
}
return value;
}

Expand Down Expand Up @@ -301,6 +312,7 @@ public ScoreBoardEventProvider create(Child<? extends ScoreBoardEventProvider> p
protected void itemAdded(Child<?> prop, ValueWithId item, Source source) {
if (prop == TIME_OUT) { recountTimeouts(); }
if (prop == SCORE_ADJUSTMENT) { scoreListener.addSource(((ScoreAdjustment) item), ScoreAdjustment.AMOUNT); }
if (prop == SKATER) { penaltyListener.addSource((Skater) item, Skater.PENALTY); }
}

@Override
Expand Down Expand Up @@ -907,6 +919,7 @@ public void run() {} // dummy, so the variable is not
private String nextSkaterId;

private RecalculateScoreBoardListener<?> scoreListener;
private RecalculateScoreBoardListener<?> penaltyListener;

public static final String DEFAULT_NAME_PREFIX = "Team ";
public static final String DEFAULT_LOGO = "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ public interface Period extends NumberedScoreBoardEventProvider<Period> {
public static final Value<Long> WALLTIME_START = new Value<>(Long.class, "WalltimeStart", 0L, props);
public static final Value<Long> WALLTIME_END = new Value<>(Long.class, "WalltimeEnd", 0L, props);
public static final Value<String> LOCAL_TIME_START = new Value<>(String.class, "LocalTimeStart", "", props);
public static final Value<Integer> TEAM_1_PENALTY_COUNT = new Value<>(Integer.class, "Team1PenaltyCount", 0, props);
public static final Value<Integer> TEAM_2_PENALTY_COUNT = new Value<>(Integer.class, "Team2PenaltyCount", 0, props);
public static final Value<Integer> TEAM_1_POINTS = new Value<>(Integer.class, "Team1Points", 0, props);
public static final Value<Integer> TEAM_2_POINTS = new Value<>(Integer.class, "Team2Points", 0, props);

public static final Child<Timeout> TIMEOUT = new Child<>(Timeout.class, "Timeout", props);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ public interface Team extends ScoreBoardEventProvider, TimeoutOwner {
new Value<>(ScoreAdjustment.class, "ActiveScoreAdjustment", null, props);
public static final Value<Integer> ACTIVE_SCORE_ADJUSTMENT_AMOUNT =
new Value<>(Integer.class, "ActiveScoreAdjustmentAmount", 0, props);
public static final Value<Integer> TOTAL_PENALTIES = new Value<>(Integer.class, "TotalPenalties", 0, props);

public static final Child<ValWithId> ALTERNATE_NAME = new Child<>(ValWithId.class, "AlternateName", preparedProps);
public static final Child<ValWithId> COLOR = new Child<>(ValWithId.class, "Color", preparedProps);
Expand Down

0 comments on commit fbddcd0

Please sign in to comment.