package seng302.Controllers; 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.Model.*; import seng302.RaceXMLReader; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.ResourceBundle; /** * Created by fwy13 on 15/03/2017. */ public class RaceController extends Controller { @FXML GridPane canvasBase; ResizableRaceCanvas raceMap; @FXML SplitPane race; @FXML CheckBox showFPS; @FXML CheckBox showAnnotations; @FXML Label timer; @FXML Label FPS; @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) { BoatInRace[] boatInRaces = new BoatInRace[boats.size()]; raceMap.setBoats(boats.toArray(boatInRaces)); 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(new ChangeListener() { public void changed(ObservableValue ov, Boolean old_val, Boolean 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 scaleFactor scale value of race */ public void startRace(int scaleFactor) { RaceXMLReader raceXMLReader = null; try { raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml"); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } BoatInRace[] boats = new BoatInRace[raceXMLReader.getBoats().size()]; boats = raceXMLReader.getBoats().toArray(boats); double lat1 = raceXMLReader.getMapTopLeft().getLatitude(); double long1 = raceXMLReader.getMapTopLeft().getLongitude(); double lat2 = raceXMLReader.getMapBottomRight().getLatitude(); double long2 = raceXMLReader.getMapBottomRight().getLongitude(); ArrayList legs = raceXMLReader.getLegs(); ConstantVelocityRace newRace = new ConstantVelocityRace(boats, legs, this, scaleFactor); newRace.initialiseBoats(); BoatInRace[] startingBoats = new BoatInRace[newRace.getStartingBoats().size()]; int i = 0; for (BoatInRace boat : newRace.getStartingBoats()) { startingBoats[i] = boat; i++; } raceMap = new ResizableRaceCanvas(lat1, long1, lat2, long2); raceMap.setMouseTransparent(true); raceMap.widthProperty().bind(canvasBase.widthProperty()); raceMap.heightProperty().bind(canvasBase.heightProperty()); raceMap.setBoats(startingBoats); raceMap.setRaceBoundaries(raceXMLReader.getBoundary()); raceMap.drawRaceMap(); raceMap.setVisible(true); canvasBase.getChildren().add(raceMap); race.setVisible(true); 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(new ChangeListener() { public void changed(ObservableValue ov, Boolean old_val, Boolean new_val) { if (showFPS.isSelected()) { FPS.setVisible(true); } else { FPS.setVisible(false); } } }); } /** * Set up boat annotations */ private void initializeAnnotations() { //listener for annotation showAnnotations.selectedProperty().addListener(new ChangeListener() { public void changed(ObservableValue ov, Boolean old_val, Boolean new_val) { raceMap.toggleAnnotations(); raceMap.update(); } }); } }