package seng302.Controllers; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.layout.GridPane; import org.xml.sax.SAXException; import seng302.Mock.StreamedRace; import seng302.Model.*; import seng302.RaceDataSource; import seng302.RaceXMLReader; import seng302.VisualiserInput; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.ResourceBundle; /** * Created by fwy13 on 15/03/2017. */ public class RaceController extends Controller { @FXML GridPane canvasBase; //user saved data for annotation display private ArrayList presetAnno; ResizableRaceCanvas raceMap; @FXML SplitPane race; @FXML CheckBox showFPS; @FXML CheckBox showBoatPath; @FXML CheckBox showAnnotations; @FXML Label timer; @FXML Label FPS; @FXML Label timeZone; @FXML CheckBox showName; @FXML CheckBox showAbbrev; @FXML CheckBox showSpeed; @FXML Button saveAnno; @FXML Button showSetAnno; @FXML TableView boatInfoTable; @FXML TableColumn boatPlacingColumn; @FXML TableColumn boatTeamColumn; @FXML TableColumn boatMarkColumn; @FXML TableColumn boatSpeedColumn; /** * Updates the ResizableRaceCanvas (raceMap) with most recent data * * @param boats boats that are to be displayed in the race * @see ResizableRaceCanvas */ public void updateMap(ObservableList boats) { raceMap.setBoats(boats); raceMap.update(); } /** * Updates the array listened by the TableView (boatInfoTable) that displays the boat information. * * @param race Race to listen to. */ public void setInfoTable(Race race) { //boatInfoTable.getItems().clear(); boatInfoTable.setItems(race.getStartingBoats()); boatTeamColumn.setCellValueFactory(cellData -> cellData.getValue().getName()); boatSpeedColumn.setCellValueFactory(cellData -> cellData.getValue().getVelocityProp()); boatMarkColumn.setCellValueFactory(cellData -> cellData.getValue().getCurrentLegName()); boatPlacingColumn.setCellValueFactory(cellData -> cellData.getValue().positionProperty()); } @Override public void initialize(URL location, ResourceBundle resources) { //listener for fps showFPS.selectedProperty().addListener((ov, old_val, new_val) -> { if (showFPS.isSelected()) { FPS.setVisible(true); } else { FPS.setVisible(false); } }); } /** * Initializes and runs the race, based on the user's chosen scale factor * Currently uses an example racecourse * * @param visualiserInput */ public void startRace(VisualiserInput visualiserInput) { StreamedRace newRace = new StreamedRace(visualiserInput, this); //newRace.initialiseBoats(); raceMap = new ResizableRaceCanvas(visualiserInput.getCourse()); raceMap.setMouseTransparent(true); raceMap.widthProperty().bind(canvasBase.widthProperty()); raceMap.heightProperty().bind(canvasBase.heightProperty()); //raceMap.setBoats(newRace.getStartingBoats()); raceMap.drawRaceMap(); raceMap.setVisible(true); canvasBase.getChildren().add(raceMap); race.setVisible(true); //Initialize save annotation array, fps listener, and annotation listeners //timezone // RaceClock raceClock = new RaceClock(visualiserInput.getCourse().getZonedDateTime()); // timeZone.setText(raceClock.getTimeZone()); initializeFPS(); initializeAnnotations(); new Thread((newRace)).start(); } /** * Set the value for the race clock label * * @param time time that the label will be updated to */ public void setTimer(String time) { timer.setText(time); } /** * Set the value for the fps label * * @param fps fps that the label will be updated to */ public void setFrames(String fps) { FPS.setText((fps)); } /** * Set up FPS display at bottom of screen */ private void initializeFPS() { showFPS.setVisible(true); showFPS.selectedProperty().addListener((ov, old_val, new_val) -> { if (showFPS.isSelected()) { FPS.setVisible(true); } else { FPS.setVisible(false); } }); } /** * Set up boat annotations */ private void initializeAnnotations() { presetAnno = new ArrayList<>(); //listener for annotation showAnnotations.selectedProperty().addListener((ov, old_val, new_val) -> { raceMap.toggleAnnotations(); raceMap.update(); }); //listener for show name in annotation showName.selectedProperty().addListener((ov, old_val, new_val) -> { raceMap.toggleAnnoName(); raceMap.update(); }); //listener for show abbreviation for annotation showAbbrev.selectedProperty().addListener((ov, old_val, new_val) -> { raceMap.toggleAnnoAbbrev(); raceMap.update(); }); //listener for show boat path for annotation showBoatPath.selectedProperty().addListener((ov, old_val, new_val) -> { raceMap.toggleBoatPath(); raceMap.update(); }); //listener to show speed for annotation showSpeed.selectedProperty().addListener((ov, old_val, new_val) -> { raceMap.toggleAnnoSpeed(); raceMap.update(); }); //listener to save currently selected annotation saveAnno.setOnAction(event -> { presetAnno.clear(); presetAnno.add(showName.isSelected()); presetAnno.add(showAbbrev.isSelected()); presetAnno.add(showSpeed.isSelected()); presetAnno.add(showBoatPath.isSelected()); }); //listener to show saved annotation showSetAnno.setOnAction(event -> { if (presetAnno.size() > 0) { showName.setSelected(presetAnno.get(0)); showAbbrev.setSelected(presetAnno.get(1)); showSpeed.setSelected(presetAnno.get(2)); showBoatPath.setSelected(presetAnno.get(3)); raceMap.update(); } }); } }