You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
6.7 KiB
227 lines
6.7 KiB
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 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<Boolean> 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<Boat> boatInfoTable;
|
|
@FXML
|
|
TableColumn<Boat, String> boatPlacingColumn;
|
|
@FXML
|
|
TableColumn<Boat, String> boatTeamColumn;
|
|
@FXML
|
|
TableColumn<Boat, String> boatMarkColumn;
|
|
@FXML
|
|
TableColumn<Boat, String> 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<Boat> 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 scaleFactor scale value of race
|
|
*/
|
|
public void startRace(int scaleFactor, RaceDataSource raceData) {
|
|
StreamedRace newRace = new StreamedRace(raceData, this, scaleFactor);
|
|
//newRace.initialiseBoats();
|
|
|
|
raceMap = new ResizableRaceCanvas(raceData);
|
|
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(raceData.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();
|
|
}
|
|
});
|
|
}
|
|
} |