diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index 2420c9df..2ec5784d 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -10,12 +10,12 @@ import javafx.scene.control.*; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; +import javafx.scene.paint.Color; import seng302.Mock.StreamedRace; import seng302.Model.*; import seng302.VisualiserInput; -import java.awt.Color; import java.net.URL; import java.util.*; import java.util.List; @@ -32,7 +32,8 @@ public class RaceController extends Controller { private Integer sparkLineNumber = 0; private ResizableRaceCanvas raceMap; private ResizableRaceMap raceBoundaries; - private ArrayList colours; + private ArrayList colours; + private Map boatColours = new HashMap<>(); @FXML SplitPane race; @FXML CheckBox showFPS; @FXML CheckBox showBoatPath; @@ -104,14 +105,12 @@ public class RaceController extends Controller { //int [] boats = {1, 2, 3, 4, 5, 6}; // set a line for each boat makeColours(); - System.out.println(colours.get(0)); - for (Boat boat : boats){ - startBoats.add(boat); - } + startBoats.addAll(boats); + mapBoatColours(); for (int i=0; i series = new XYChart.Series(); - series.getData().add(new XYChart.Data(0, startPos)); + series.getData().add(new XYChart.Data(0, i + 1)); sparklineChart.getData().add(series); } @@ -133,6 +132,8 @@ public class RaceController extends Controller { lookup(".axis-minor-tick-mark").setVisible(false); sparklineChart.getYAxis(). lookup(".axis-minor-tick-mark").setVisible(false); + + updateSparkline(boats); } /** @@ -214,20 +215,19 @@ public class RaceController extends Controller { } public void updateSparkline(ObservableList boatsInRace){ + System.out.println(sparklineChart.getData().size()); // TODO replace for loops with correct boats - Done //int [] startingBoats = {1, 2, 3, 4, 5, 6}; //int [] boatsInRace = {1, 2, 3, 4, 5, 6}; - int colourIndex = 0; int placingVal = boatsInRace.size(); //System.out.println(boatsInRace.get(0).toString()); sparkLineNumber++; - for (int i=0; i= 0; i--){ + for (int j = startBoats.size() - 1; j >= 0; j--){ if (boatsInRace.get(i)==startBoats.get(j)){ sparklineChart.getData().get(j).getData().add(new XYChart.Data<> (sparkLineNumber, placingVal)); - sparklineChart.getData().get(j).getNode().setStyle("-fx-stroke: "+colours.get(colourIndex)+";"); - colourIndex+=1; + sparklineChart.getData().get(j).getNode().setStyle("-fx-stroke: "+boatColours.get(boatsInRace.get(i).getSourceID())+";"); placingVal-=1; } } @@ -237,18 +237,28 @@ public class RaceController extends Controller { private void makeColours() { colours = new ArrayList<>(Arrays.asList( - "#8A2BE2", - "#000000", - "#FF0000", - "#FFA500", - "#556B2F", - "#32CD32", - "#800080", - "#A9A9A9", - "#FFFF00" + colourToHex(Color.BLUEVIOLET), + colourToHex(Color.BLACK), + colourToHex(Color.RED), + colourToHex(Color.ORANGE), + colourToHex(Color.DARKOLIVEGREEN), + colourToHex(Color.LIMEGREEN), + colourToHex(Color.PURPLE), + colourToHex(Color.DARKGRAY), + colourToHex(Color.YELLOW) )); } + private void mapBoatColours() { + int currentColour = 0; + for (Boat boat : startBoats) { + if (!boatColours.containsKey(boat.getSourceID())) { + boatColours.put(boat.getSourceID(), colours.get(currentColour)); + } + currentColour = (currentColour + 1) % colours.size(); + } + } + /** * Set up boat annotations */ @@ -299,4 +309,11 @@ public class RaceController extends Controller { } }); } + + private String colourToHex(Color color) { + return String.format( "#%02X%02X%02X", + (int)( color.getRed() * 255 ), + (int)( color.getGreen() * 255 ), + (int)( color.getBlue() * 255 ) ); + } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index 99a2fde3..12b13639 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -76,6 +76,7 @@ public class StreamedRace implements Runnable { * @param timeElapsed Time that has elapse since the start of the the race. */ private void checkPosition(Boat boat, long timeElapsed) { + boolean legChanged = false; StreamedCourse raceData = visualiserInput.getCourse(); BoatStatus boatStatusMessage = visualiserInput.getBoatStatusMap().get(boat.getSourceID()); if (boatStatusMessage != null) { @@ -86,7 +87,7 @@ public class StreamedRace implements Runnable { if (legNumber >= 1 && legNumber < legs.size()) { if (boat.getCurrentLeg() != legs.get(legNumber)){ boat.setCurrentLeg(legs.get(legNumber)); - controller.updateSparkline(startingBoats); + legChanged = true; } } @@ -101,8 +102,11 @@ public class StreamedRace implements Runnable { //System.out.println("Boat finished"); } } - //Update the boat display table in the GUI to reflect the leg change - updatePositions(); + if (legChanged) { + //Update the boat display table in the GUI to reflect the leg change + updatePositions(); + controller.updateSparkline(startingBoats); + } } /** diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index b4815d22..e7b53d6f 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -10,9 +10,7 @@ import seng302.Mock.StreamedCourse; import seng302.RaceDataSource; import seng302.RaceMap; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; /** * This creates a JavaFX Canvas that is fills it's parent. @@ -31,6 +29,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { private List colours; private final List markers; private final RaceDataSource raceData; + private Map boatColours = new HashMap<>(); public ResizableRaceCanvas(RaceDataSource raceData) { super(); @@ -54,6 +53,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { */ public void setBoats(List boats) { this.boats = boats; + mapBoatColours(); } @@ -276,27 +276,27 @@ public class ResizableRaceCanvas extends ResizableCanvas { * Draws boats while race in progress, when leg heading is set. */ private void updateBoats() { - int currentColour = 0; if (boats != null) { + if (boatColours.size() < boats.size()) mapBoatColours(); for (Boat boat : boats) { boolean finished = boat.getCurrentLeg().getName().equals("Finish") || boat.getCurrentLeg().getName().equals("DNF"); boolean isStart = boat.isStarted(); + int sourceID = boat.getSourceID(); if (!finished && isStart) { - displayBoat(boat, boat.getHeading(), colours.get(currentColour)); + displayBoat(boat, boat.getHeading(), boatColours.get(sourceID)); GraphCoordinate wakeFrom = this.map.convertGPS(boat.getCurrentPosition()); GraphCoordinate wakeTo = this.map.convertGPS(boat.getWake()); - displayLine(wakeFrom, wakeTo, colours.get(currentColour)); + displayLine(wakeFrom, wakeTo, boatColours.get(sourceID)); } else if (!isStart) { - displayBoat(boat, boat.getHeading(), colours.get(currentColour)); + displayBoat(boat, boat.getHeading(), boatColours.get(sourceID)); } else { - displayBoat(boat, 0, colours.get(currentColour)); + displayBoat(boat, 0, boatColours.get(sourceID)); } if (raceAnno) displayText(boat.toString(), boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition())); //TODO this needs to be fixed. - drawTrack(boat, colours.get(currentColour)); - currentColour = (currentColour + 1) % colours.size(); + drawTrack(boat, boatColours.get(sourceID)); } } } @@ -330,4 +330,14 @@ public class ResizableRaceCanvas extends ResizableCanvas { )); } + private void mapBoatColours() { + int currentColour = 0; + for (Boat boat : boats) { + if (!boatColours.containsKey(boat.getSourceID())) { + boatColours.put(boat.getSourceID(), colours.get(currentColour)); + } + currentColour = (currentColour + 1) % colours.size(); + } + } + } \ No newline at end of file