Merge branch 'Story1248_Game_App_Scaling' into 'develop'

Story1248 Race view scaling

# Changes
* Added listener to widthProperty and heightProperty in GameView.fxml.
* Changed some of the race view fxml hierarchy to support resizing.

# Testing
* Manual test log completed.

See merge request !70
This commit is contained in:
William Muir
2017-09-11 17:11:27 +12:00
3 changed files with 231 additions and 107 deletions
+39 -3
View File
@@ -11,6 +11,8 @@ import javafx.animation.KeyFrame;
import javafx.animation.KeyValue; import javafx.animation.KeyValue;
import javafx.animation.Timeline; import javafx.animation.Timeline;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.geometry.Point2D; import javafx.geometry.Point2D;
import javafx.scene.Group; import javafx.scene.Group;
@@ -25,6 +27,7 @@ import javafx.scene.paint.Paint;
import javafx.scene.shape.Circle; import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon; import javafx.scene.shape.Polygon;
import javafx.scene.text.Text; import javafx.scene.text.Text;
import javafx.scene.transform.Scale;
import javafx.util.Duration; import javafx.util.Duration;
import seng302.gameServer.messages.RoundingSide; import seng302.gameServer.messages.RoundingSide;
import seng302.model.ClientYacht; import seng302.model.ClientYacht;
@@ -51,7 +54,7 @@ import seng302.visualiser.map.CanvasMap;
public class GameView extends Pane { public class GameView extends Pane {
private double bufferSize = 50; private double bufferSize = 50;
private double panelWidth = 1260; // it should be 1280 but, minors 40 to cancel the bias. private double panelWidth = 1280;
private double panelHeight = 960; private double panelHeight = 960;
private double canvasWidth = 1100; private double canvasWidth = 1100;
private double canvasHeight = 920; private double canvasHeight = 920;
@@ -63,7 +66,6 @@ public class GameView extends Pane {
private double referencePointX, referencePointY; private double referencePointX, referencePointY;
private double metersPerPixelX, metersPerPixelY; private double metersPerPixelX, metersPerPixelY;
final double SCALE_DELTA = 1.1;
private boolean isZoom = false; private boolean isZoom = false;
private Text fpsDisplay = new Text(); private Text fpsDisplay = new Text();
@@ -110,7 +112,7 @@ public class GameView extends Pane {
} }
private void zoomIn() { private void zoomIn() {
scaleFactor = 0.10; scaleFactor = 0.1;
if (this.isZoom && this.getScaleX() < 2.5) { if (this.isZoom && this.getScaleX() < 2.5) {
this.setScaleX(this.getScaleX() + scaleFactor); this.setScaleX(this.getScaleX() + scaleFactor);
this.setScaleY(this.getScaleY() + scaleFactor); this.setScaleY(this.getScaleY() + scaleFactor);
@@ -152,6 +154,40 @@ public class GameView extends Pane {
disableZoom(); disableZoom();
} }
})); }));
this.widthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue,
Number newValue) {
scaleFactor = getWidth() / panelWidth;
if (panelHeight * scaleFactor < getHeight()) {
Scale scale = new Scale(scaleFactor, scaleFactor, 0, 0);
getTransforms().remove(0, getTransforms().size());
getTransforms().add(scale);
setPrefWidth(getWidth() / scaleFactor);
setPrefHeight(getHeight() / scaleFactor);
}
}
});
this.heightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue,
Number newValue) {
scaleFactor = getHeight() / panelHeight;
if (panelWidth * scaleFactor < getWidth()) {
Scale scale = new Scale(scaleFactor, scaleFactor, 0, 0);
getTransforms().remove(0, getTransforms().size());
getTransforms().add(scale);
setPrefWidth(getWidth() / scaleFactor);
setPrefHeight(getHeight() / scaleFactor);
}
}
});
} }
private void initializeTimer() { private void initializeTimer() {
@@ -27,7 +27,7 @@ import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox; import javafx.scene.control.ComboBox;
import javafx.scene.control.Slider; import javafx.scene.control.Slider;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
@@ -43,7 +43,6 @@ import seng302.model.RaceState;
import seng302.model.mark.CompoundMark; import seng302.model.mark.CompoundMark;
import seng302.model.mark.Mark; import seng302.model.mark.Mark;
import seng302.model.stream.xml.parser.RaceXMLData; import seng302.model.stream.xml.parser.RaceXMLData;
import seng302.model.token.Token;
import seng302.utilities.Sounds; import seng302.utilities.Sounds;
import seng302.visualiser.GameView; import seng302.visualiser.GameView;
import seng302.visualiser.controllers.annotations.Annotation; import seng302.visualiser.controllers.annotations.Annotation;
@@ -79,7 +78,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
@FXML @FXML
private Text timerLabel; private Text timerLabel;
@FXML @FXML
private AnchorPane contentAnchorPane; private GridPane contentGridPane;
@FXML @FXML
private Text windArrowText, windDirectionText; private Text windArrowText, windDirectionText;
@FXML @FXML
@@ -115,9 +114,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
importantAnnotations = new ImportantAnnotationsState(); importantAnnotations = new ImportantAnnotationsState();
//Formatting the y axis of the sparkline //Formatting the y axis of the sparkline
raceSparkLine.getYAxis().setRotate(180); // raceSparkLine.getYAxis().setRotate(180);
raceSparkLine.getYAxis().setTickLabelRotation(180); // raceSparkLine.getYAxis().setTickLabelRotation(180);
raceSparkLine.getYAxis().setTranslateX(-5); // raceSparkLine.getYAxis().setTranslateX(-5);
raceSparkLine.visibleProperty().setValue(false); raceSparkLine.visibleProperty().setValue(false);
raceSparkLine.getYAxis().setAutoRanging(false); raceSparkLine.getYAxis().setAutoRanging(false);
sparklineYAxis.setTickMarkVisible(false); sparklineYAxis.setTickMarkVisible(false);
@@ -142,8 +141,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
// chatHistory.textProperty().addListener((obs, oldValue, newValue) -> { // chatHistory.textProperty().addListener((obs, oldValue, newValue) -> {
// chatHistory.setScrollTop(Double.MAX_VALUE); // chatHistory.setScrollTop(Double.MAX_VALUE);
// }); // });
contentAnchorPane.setOnMouseClicked((event) -> contentGridPane.setOnMouseClicked((event) ->
contentAnchorPane.requestFocus() contentGridPane.requestFocus()
); );
} }
@@ -168,12 +167,12 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
updateOrder(raceState.getPlayerPositions()); updateOrder(raceState.getPlayerPositions());
gameView = new GameView(); gameView = new GameView();
gameView.setFrameRateFXText(fpsDisplay); gameView.setFrameRateFXText(fpsDisplay);
Platform.runLater(() -> contentAnchorPane.getChildren().add(0, gameView)); Platform.runLater(() -> contentGridPane.getChildren().add(0, gameView));
gameView.setBoats(new ArrayList<>(participants.values())); gameView.setBoats(new ArrayList<>(participants.values()));
gameView.updateBorder(raceData.getCourseLimit()); gameView.updateBorder(raceData.getCourseLimit());
gameView.updateTokens(raceData.getTokens()); gameView.updateTokens(raceData.getTokens());
gameView.updateCourse( gameView.updateCourse(
new ArrayList<>(raceData.getCompoundMarks().values()), raceData.getMarkSequence() new ArrayList<>(raceData.getCompoundMarks().values()), raceData.getMarkSequence()
); );
gameView.setBoatAsPlayer(player); gameView.setBoatAsPlayer(player);
gameView.startRace(); gameView.startRace();
@@ -590,9 +589,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
FXMLLoader loader = new FXMLLoader(getClass().getResource("/views/FinishView.fxml")); FXMLLoader loader = new FXMLLoader(getClass().getResource("/views/FinishView.fxml"));
try { try {
contentAnchorPane.getChildren().removeAll(); contentGridPane.getChildren().removeAll();
contentAnchorPane.getChildren().clear(); contentGridPane.getChildren().clear();
contentAnchorPane.getChildren().addAll((Pane) loader.load()); contentGridPane.getChildren().addAll((Pane) loader.load());
} catch (javafx.fxml.LoadException e) { } catch (javafx.fxml.LoadException e) {
System.err.println(e.getCause().toString()); System.err.println(e.getCause().toString());
+176 -87
View File
@@ -1,97 +1,186 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import java.lang.*?> <?import java.lang.*?>
<?import javafx.scene.chart.*?> <?import javafx.scene.chart.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.shape.*?> <?import javafx.scene.shape.*?>
<?import javafx.scene.text.*?> <?import javafx.scene.text.*?>
<?import javafx.scene.chart.CategoryAxis?>
<?import javafx.scene.chart.LineChart?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="998.0" prefWidth="1530.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.visualiser.controllers.RaceViewController"> <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
<children> prefHeight="998.0" prefWidth="1530.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
<AnchorPane fx:id="basePane" layoutX="322.0" layoutY="130.0" prefHeight="998.0" prefWidth="1281.0" style="-fx-background-color: skyblue;" AnchorPane.bottomAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/8"
<children> xmlns:fx="http://javafx.com/fxml/1"
<GridPane prefHeight="998.0" prefWidth="1281.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> fx:controller="seng302.visualiser.controllers.RaceViewController">
<columnConstraints> <children>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="630.0" minWidth="10.0" prefWidth="68.0" /> <GridPane prefHeight="998.0" prefWidth="1530.0" AnchorPane.bottomAnchor="0.0"
<ColumnConstraints hgrow="SOMETIMES" maxWidth="1213.0" minWidth="10.0" prefWidth="1213.0" /> AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
</columnConstraints> <columnConstraints>
<rowConstraints> <ColumnConstraints hgrow="SOMETIMES" maxWidth="250.0" minWidth="250.0"
<RowConstraints maxHeight="489.0" minHeight="1.0" prefHeight="24.0" vgrow="SOMETIMES" /> prefWidth="250.0"/>
<RowConstraints maxHeight="997.0" minHeight="10.0" prefHeight="974.0" vgrow="SOMETIMES" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="1283.0"/>
</rowConstraints> </columnConstraints>
<children> <rowConstraints>
<AnchorPane fx:id="contentAnchorPane" prefHeight="200.0" prefWidth="200.0" GridPane.columnSpan="2" GridPane.rowSpan="2"> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
<children> </rowConstraints>
<AnchorPane layoutX="799.0" layoutY="702.0" prefHeight="214.0" prefWidth="468.0"> <children>
<children> <AnchorPane fx:id="basePane" prefHeight="998.0" prefWidth="1281.0"
<VBox prefHeight="214.0" prefWidth="468.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> style="-fx-background-color: skyblue;" GridPane.columnIndex="1">
<children> <children>
<Pane fx:id="chatHistoryHolder" maxHeight="9.9999999999E10" maxWidth="1.7976931348623157E308" prefHeight="9.9999999999E10" /> <GridPane minHeight="10.0" prefHeight="998.0" prefWidth="1281.0"
<HBox VBox.vgrow="NEVER"> AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
<children> AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<TextField fx:id="chatInput" focusTraversable="false" prefHeight="25.0" HBox.hgrow="ALWAYS" /> <columnConstraints>
<Button fx:id="chatSend" focusTraversable="false" mnemonicParsing="false" text="Send" /> <ColumnConstraints hgrow="SOMETIMES" maxWidth="68.0" minWidth="68.0"
</children> prefWidth="68.0"/>
</HBox> <ColumnConstraints hgrow="SOMETIMES"/>
</children> </columnConstraints>
</VBox> <rowConstraints>
</children> <RowConstraints maxHeight="24.0" minHeight="24.0" prefHeight="24.0"
</AnchorPane> vgrow="SOMETIMES"/>
</children> <RowConstraints vgrow="SOMETIMES"/>
</AnchorPane> <RowConstraints minHeight="10.0" prefHeight="30.0"
<Text fx:id="fpsDisplay" strokeType="OUTSIDE" strokeWidth="0.0" text="60 FPS" GridPane.halignment="CENTER" GridPane.valignment="CENTER" /> vgrow="SOMETIMES"/>
</children> </rowConstraints>
</GridPane> <children>
</children> <GridPane fx:id="contentGridPane" GridPane.columnSpan="2"
</AnchorPane> GridPane.rowSpan="3">
<AnchorPane prefHeight="960.0" prefWidth="250.0" style="-fx-background-color: #2C2c36;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0"> <columnConstraints>
<children> <ColumnConstraints hgrow="SOMETIMES"/>
<Label layoutX="11.0" layoutY="283.0" text="Team Position" textFill="WHITE" /> </columnConstraints>
<Label layoutX="13.0" layoutY="432.0" text="Settings" textFill="WHITE" /> <rowConstraints>
<Label layoutX="11.0" layoutY="41.0" text="Timer" textFill="WHITE" /> <RowConstraints vgrow="SOMETIMES"/>
<Label layoutX="11.0" layoutY="112.0" text="Wind direction" textFill="WHITE" /> </rowConstraints>
<Circle fx:id="windBackgroundCircle" blendMode="DARKEN" fill="#3dcdc8" layoutX="110.0" layoutY="190.0" radius="35.0" stroke="#d7d7d7" strokeType="INSIDE" strokeWidth="3.0" /> </GridPane>
<Text fx:id="windArrowText" fill="#a8a8a8" layoutX="86.0" layoutY="210.0" strokeType="OUTSIDE" strokeWidth="0.0" text="↓"> <Text fx:id="fpsDisplay" strokeType="OUTSIDE" strokeWidth="0.0"
<font> text="60 FPS" GridPane.halignment="CENTER"
<Font name="AdobeArabic-Regular" size="55.0" /> GridPane.valignment="CENTER"/>
</font> <VBox maxHeight="214.0" maxWidth="468.0" minHeight="214.0"
</Text> minWidth="200.0" nodeOrientation="LEFT_TO_RIGHT"
<Text fx:id="windDirectionText" fill="#d3d3d3" layoutX="171.0" layoutY="238.0" strokeType="OUTSIDE" strokeWidth="0.0" text="0.0°" textAlignment="RIGHT"> prefHeight="214.0" prefWidth="468.0" GridPane.columnIndex="1"
<font> GridPane.halignment="RIGHT" GridPane.rowIndex="2"
<Font name="System Bold" size="13.0" /> GridPane.valignment="BOTTOM">
</font> <children>
</Text> <Pane fx:id="chatHistoryHolder" maxHeight="9.9999999999E10"
<Text fx:id="windSpeedText" fill="#d3d3d3" layoutX="12.0" layoutY="237.0" strokeType="OUTSIDE" strokeWidth="0.0" text="0.0 Knot" textAlignment="RIGHT"> maxWidth="1.7976931348623157E308"
<font> prefHeight="9.9999999999E10"/>
<Font name="System Bold" size="13.0" /> <HBox VBox.vgrow="NEVER">
</font> <children>
</Text> <TextField fx:id="chatInput"
<CheckBox fx:id="toggleFps" focusTraversable="false" graphicTextGap="0.0" layoutX="21.0" layoutY="453.0" mnemonicParsing="false" prefHeight="18.0" prefWidth="143.0" selected="true" styleClass="ui-checkbox" text="Show FPS" textFill="WHITE" /> focusTraversable="false" prefHeight="25.0"
<VBox fx:id="positionVbox" layoutX="12.0" layoutY="304.0" prefHeight="116.0" prefWidth="200.0" styleClass="text-white" /> HBox.hgrow="ALWAYS"/>
<Pane layoutX="11.0" layoutY="39.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="51.0" prefWidth="193.0"> <Button fx:id="chatSend" focusTraversable="false"
<children> mnemonicParsing="false" text="Send"/>
<Text fx:id="timerLabel" fill="#f8f8f8" layoutX="-26.0" layoutY="51.0" strokeType="OUTSIDE" strokeWidth="0.0" text="00:00" textAlignment="CENTER" wrappingWidth="246.0"> </children>
<font> </HBox>
<Font size="25.0" /> </children>
</font> <GridPane.margin>
</Text> <Insets bottom="10.0" right="10.0"/>
</children> </GridPane.margin>
</Pane> </VBox>
<Slider fx:id="annotationSlider" blockIncrement="1.0" layoutX="38.0" layoutY="527.0" majorTickUnit="1.0" max="2.0" minorTickCount="0" prefHeight="51.0" prefWidth="170.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" styleClass="ui-slider" /> </children>
<Label layoutX="10.0" layoutY="499.0" text="Annotations" textFill="WHITE" /> </GridPane>
<Button fx:id="selectAnnotationBtn" focusTraversable="false" layoutX="35.0" layoutY="578.0" mnemonicParsing="false" prefHeight="18.0" prefWidth="170.0" styleClass="blue-ui-btn" text="Select Annotations" textFill="WHITE" /> </children>
<Text fill="WHITE" layoutX="11.0" layoutY="649.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Boat Selection" /> </AnchorPane>
<ComboBox fx:id="yachtSelectionComboBox" focusTraversable="false" layoutX="37.0" layoutY="664.0" prefHeight="25.0" prefWidth="170.0" promptText="Select Yacht" styleClass="combo-box-base" /> <AnchorPane minHeight="10.0" minWidth="250.0" prefHeight="960.0" prefWidth="250.0"
<LineChart fx:id="raceSparkLine" layoutX="-1.0" layoutY="719.0" legendVisible="false" prefHeight="277.0" prefWidth="246.0" title="Boat Positions"> style="-fx-background-color: #2C2c36;">
<xAxis> <children>
<CategoryAxis label="Leg Number" side="BOTTOM" styleClass="spark-line-xaxis" /> <Label layoutX="11.0" layoutY="283.0" text="Team Position"
</xAxis> textFill="WHITE"/>
<yAxis> <Label layoutX="13.0" layoutY="432.0" text="Settings" textFill="WHITE"/>
<NumberAxis fx:id="sparklineYAxis" minorTickCount="1" minorTickLength="1.0" side="LEFT" styleClass="spark-line-yaxis" tickLabelGap="1.0" tickUnit="1.0" upperBound="7.0" /> <Label layoutX="11.0" layoutY="41.0" text="Timer" textFill="WHITE"/>
</yAxis> <Label layoutX="11.0" layoutY="112.0" text="Wind direction"
</LineChart> textFill="WHITE"/>
</children> <Circle fx:id="windBackgroundCircle" blendMode="DARKEN" fill="#3dcdc8"
</AnchorPane> layoutX="110.0" layoutY="190.0" radius="35.0" stroke="#d7d7d7"
</children> strokeType="INSIDE" strokeWidth="3.0"/>
<Text fx:id="windArrowText" fill="#a8a8a8" layoutX="86.0" layoutY="210.0"
strokeType="OUTSIDE" strokeWidth="0.0" text="↓">
<font>
<Font name="AdobeArabic-Regular" size="55.0"/>
</font>
</Text>
<Text fx:id="windDirectionText" fill="#d3d3d3" layoutX="171.0"
layoutY="238.0" strokeType="OUTSIDE" strokeWidth="0.0" text="0.0°"
textAlignment="RIGHT">
<font>
<Font name="System Bold" size="13.0"/>
</font>
</Text>
<Text fx:id="windSpeedText" fill="#d3d3d3" layoutX="12.0" layoutY="237.0"
strokeType="OUTSIDE" strokeWidth="0.0" text="0.0 Knot"
textAlignment="RIGHT">
<font>
<Font name="System Bold" size="13.0"/>
</font>
</Text>
<CheckBox fx:id="toggleFps" focusTraversable="false" graphicTextGap="0.0"
layoutX="21.0" layoutY="453.0" mnemonicParsing="false" prefHeight="18.0"
prefWidth="143.0" selected="true" styleClass="ui-checkbox" text="Show FPS"
textFill="WHITE"/>
<VBox fx:id="positionVbox" layoutX="12.0" layoutY="304.0" prefHeight="116.0"
prefWidth="200.0" styleClass="text-white"/>
<Pane layoutX="11.0" layoutY="39.0" maxHeight="-Infinity"
maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
prefHeight="51.0" prefWidth="193.0">
<children>
<Text fx:id="timerLabel" fill="#f8f8f8" layoutX="-26.0"
layoutY="51.0" strokeType="OUTSIDE" strokeWidth="0.0" text="00:00"
textAlignment="CENTER" wrappingWidth="246.0">
<font>
<Font size="25.0"/>
</font>
</Text>
</children>
</Pane>
<Slider fx:id="annotationSlider" blockIncrement="1.0" layoutX="38.0"
layoutY="527.0" majorTickUnit="1.0" max="2.0" minorTickCount="0"
prefHeight="51.0" prefWidth="170.0" showTickLabels="true"
showTickMarks="true" snapToTicks="true" styleClass="ui-slider"/>
<Label layoutX="10.0" layoutY="499.0" text="Annotations" textFill="WHITE"/>
<Button fx:id="selectAnnotationBtn" focusTraversable="false" layoutX="35.0"
layoutY="578.0" mnemonicParsing="false" prefHeight="18.0"
prefWidth="170.0" styleClass="blue-ui-btn" text="Select Annotations"
textFill="WHITE"/>
<Text fill="WHITE" layoutX="11.0" layoutY="649.0" strokeType="OUTSIDE"
strokeWidth="0.0" text="Boat Selection"/>
<ComboBox fx:id="yachtSelectionComboBox" focusTraversable="false"
layoutX="37.0" layoutY="664.0" prefHeight="25.0" prefWidth="170.0"
promptText="Select Yacht" styleClass="combo-box-base"/>
<LineChart fx:id="raceSparkLine" layoutX="-1.0" layoutY="719.0"
legendVisible="false" prefHeight="277.0" prefWidth="246.0"
title="Boat Positions">
<xAxis>
<CategoryAxis label="Leg Number" side="BOTTOM"
styleClass="spark-line-xaxis"/>
</xAxis>
<yAxis>
<NumberAxis fx:id="sparklineYAxis" minorTickCount="1"
minorTickLength="1.0" side="LEFT" styleClass="spark-line-yaxis"
tickLabelGap="1.0" tickUnit="1.0" upperBound="7.0"/>
</yAxis>
</LineChart>
</children>
</AnchorPane>
</children>
</GridPane>
</children>
</AnchorPane> </AnchorPane>