From 8f81060a18526507a604bf891f84ad8f08316b3f Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sun, 21 May 2017 19:49:11 +1200 Subject: [PATCH] Managed to make the sparklines coordinate with their colour. However the symbols had to be removed. The sparkline can also be intialised at any time now but this might need to be tested further to ensure that it works. #story[952] --- .../seng302/controllers/CanvasController.java | 2 +- .../controllers/RaceViewController.java | 76 +++++++++---------- src/main/java/seng302/models/Yacht.java | 6 +- src/main/resources/css/master.css | 20 ++++- src/main/resources/views/RaceView.fxml | 16 ++-- 5 files changed, 68 insertions(+), 52 deletions(-) diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index 7d0db4ed..c5609cad 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -128,7 +128,7 @@ public class CanvasController { long elapsedNanosPerFrame = elapsedNanos / frameTimes.length ; Double frameRate = 1_000_000_000.0 / elapsedNanosPerFrame ; drawFps(frameRate.intValue()); -// raceViewController.checkForPositionChange(); + raceViewController.updateSparkLine(); } // TODO: 1/05/17 cir27 - Make the RaceObjects update on the actual delay. diff --git a/src/main/java/seng302/controllers/RaceViewController.java b/src/main/java/seng302/controllers/RaceViewController.java index e7eb3b90..0f2fabef 100644 --- a/src/main/java/seng302/controllers/RaceViewController.java +++ b/src/main/java/seng302/controllers/RaceViewController.java @@ -1,17 +1,13 @@ package seng302.controllers; -import java.time.Year; -import java.util.concurrent.ConcurrentLinkedQueue; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; -import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.chart.LineChart; -import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.chart.XYChart.Series; import javafx.scene.control.Button; @@ -37,7 +33,6 @@ import seng302.models.parsers.StreamParser; import java.io.IOException; import java.util.*; -import java.util.stream.Collectors; /** * Created by ptg19 on 29/03/17. @@ -70,7 +65,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel private Timeline timerTimeline; private Race race; private Stage stage; - private static HashMap> sparklineData = new HashMap<>(); + private static HashMap> sparkLineData = new HashMap<>(); private ArrayList positions; private int time; @@ -188,54 +183,57 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel annotationSlider.setValue(2); } - private void initializeSparkline(){ - raceSparkLine.setTitle("Boat Positions"); + public void updateSparkLine(){ + ArrayList sparkLineCandidates = new ArrayList<>(); for (Yacht yacht: startingBoats){ + if (!sparkLineData.containsKey(yacht.getSourceID()) && yacht.getPosition() != "-") { + sparkLineCandidates.add(yacht); + } + } + for (Yacht yacht: sparkLineCandidates){ XYChart.Series yachtData = new XYChart.Series<>(); yachtData.setName(yacht.getBoatName()); - yachtData.getData().add(new XYChart.Data<>(Integer.toString(yacht.getLegNumber()), Double.parseDouble(yacht.getPosition()))); - sparklineData.put(yacht.getSourceID(),yachtData); - } - List> positions = new ArrayList>(sparklineData.values()); + yachtData.getData().add(new XYChart.Data<>(Integer.toString(yacht.getLegNumber()),1 + sparkLineCandidates.size() - Double.parseDouble(yacht.getPosition()))); + sparkLineData.put(yacht.getSourceID(), yachtData); + } - Collections.sort(positions, new Comparator() { - @Override - public int compare(Series o1, Series o2) { - Integer leg1 = Integer.parseInt( ((XYChart.Data) o1.getData().get(o1.getData().size()-1)).getXValue()); - Integer leg2 = Integer.parseInt( ((XYChart.Data) o2.getData().get(o2.getData().size()-1)).getXValue()); - if (leg2 < leg1){ - return 1; - } else { - return -1; - } + // Lambda function to sort the series in order of leg (later legs shown more to the right) + List> positions = new ArrayList<>(sparkLineData.values()); + Collections.sort(positions, (o1, o2) -> { + Integer leg1 = Integer.parseInt( ((XYChart.Data) o1.getData().get(o1.getData().size()-1)).getXValue()); + Integer leg2 = Integer.parseInt( ((XYChart.Data) o2.getData().get(o2.getData().size()-1)).getXValue()); + if (leg2 < leg1){ + return 1; + } else { + return -1; } }); + raceSparkLine.setCreateSymbols(false); for (Series spark: positions){ - raceSparkLine.getData().add(spark); + if (!raceSparkLine.getData().contains(spark)) { + raceSparkLine.getData().add(spark); + spark.getNode().lookup(".chart-series-line").setStyle("-fx-stroke:" + getBoatColorAsRGB(spark.getName()).toString()); + } } - } public static void updateYachtPositionSparkline(Yacht yacht, Integer legNumber){ - XYChart.Series positionData = sparklineData.get(yacht.getSourceID()); - positionData.getData().add(new XYChart.Data<>(Integer.toString(legNumber), Double.parseDouble(yacht.getPosition()))); + XYChart.Series positionData = sparkLineData.get(yacht.getSourceID()); + positionData.getData().add(new XYChart.Data<>(Integer.toString(legNumber), 1 + sparkLineData.size() - Double.parseDouble(yacht.getPosition()))); } - - public void checkForPositionChange(){ - // initialize position array - if (startingBoats.size() == 6 && raceSparkLine.getData().size() != 6){ - Boolean positionsAssigned = true; - for (Yacht yacht: startingBoats){ - if (Objects.equals(yacht.getPosition(), "-")) { - positionsAssigned = false; - } - } - if (positionsAssigned){ - initializeSparkline(); + private String getBoatColorAsRGB(String boatName){ + Color color = Color.WHITE; + for (Yacht yacht: startingBoats){ + if (yacht.getBoatName() == boatName){ + color = yacht.getColour(); } } + return String.format( "#%02X%02X%02X", + (int)( color.getRed() * 255 ), + (int)( color.getGreen() * 255 ), + (int)( color.getBlue() * 255 ) ); } @@ -524,7 +522,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } public static boolean sparkLineStatus(Integer yachtId) { - if (sparklineData.containsKey(yachtId)){ + if (sparkLineData.containsKey(yachtId)){ return true; } return false; diff --git a/src/main/java/seng302/models/Yacht.java b/src/main/java/seng302/models/Yacht.java index 5b19046f..22472810 100644 --- a/src/main/java/seng302/models/Yacht.java +++ b/src/main/java/seng302/models/Yacht.java @@ -107,9 +107,9 @@ public class Yacht { } public void setLegNumber(Integer legNumber) { -// if (colour != null && position != "-" && legNumber != this.legNumber&& RaceViewController.sparkLineStatus(sourceID)) { -// RaceViewController.updateYachtPositionSparkline(this, legNumber); -// } + if (colour != null && position != "-" && legNumber != this.legNumber&& RaceViewController.sparkLineStatus(sourceID)) { + RaceViewController.updateYachtPositionSparkline(this, legNumber); + } this.legNumber = legNumber; } diff --git a/src/main/resources/css/master.css b/src/main/resources/css/master.css index 8223fc00..a97dcfa5 100644 --- a/src/main/resources/css/master.css +++ b/src/main/resources/css/master.css @@ -181,4 +181,22 @@ Remove scroll bars -fx-background-radius: 0; -fx-background-insets: 0; -fx-padding: 0; -} \ No newline at end of file +} + +/** +SparkLine elements + */ + + +/*.spark-line-yaxis{*/ + /*-fx-font-color: white;*/ + /*-fx-tick-label-fill: #ffffff;}*/ + +/*.spark-line-xaxis{*/ + /*-fx-font-color: white;*/ + /*-fx-tick-label-fill: #ffffff;*/ +/*}*/ + +.chart{ + -fx-background-color: #ffffff; +} diff --git a/src/main/resources/views/RaceView.fxml b/src/main/resources/views/RaceView.fxml index 3260cec2..970f8200 100644 --- a/src/main/resources/views/RaceView.fxml +++ b/src/main/resources/views/RaceView.fxml @@ -62,19 +62,19 @@