diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index de66ea24..fec6217a 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -11,6 +11,8 @@ import seng302.VisualiserInput; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.ResourceBundle; /** @@ -21,9 +23,25 @@ public class RaceController extends Controller { //user saved data for annotation display private ArrayList presetAnno; + private Map importantAnno; + private Map annoShownBeforeHide; + private int buttonChecked;//button currently checked allows the checkboxes to know whether or not to put it's state in history (if not hidden then store) + private int prevBtnChecked;//button to keep track of previous pressed button incase we want to check a checkbox straight from hidden we do not wish for all previous to come on. + + private static String nameCheckAnno = "name"; + private static String abbrevCheckAnno = "abbrev"; + private static String speedCheckAnno = "speed"; + private static String pathCheckAnno = "path"; + + private static int noBtn = 0; + private static int hideBtn = 1; + private static int showBtn = 2; + private static int partialBtn = 3; + private static int importantBtn = 4; private ResizableRaceCanvas raceMap; private ResizableRaceMap raceBoundaries; + private ToggleGroup annotationGroup; @FXML SplitPane race; @FXML CheckBox showFPS; @FXML CheckBox showBoatPath; @@ -86,7 +104,7 @@ public class RaceController extends Controller { } }); //adds all radios buttons for annotations to a group - ToggleGroup annotationGroup = new ToggleGroup(); + annotationGroup = new ToggleGroup(); hideAnnoRBTN.setToggleGroup(annotationGroup); showAnnoRBTN.setToggleGroup(annotationGroup); partialAnnoRBTN.setToggleGroup(annotationGroup); @@ -165,31 +183,103 @@ public class RaceController extends Controller { }); } + private void storeCurrentAnnotationState(){ + annoShownBeforeHide.put(nameCheckAnno, showName.isSelected()); + annoShownBeforeHide.put(abbrevCheckAnno, showAbbrev.isSelected()); + annoShownBeforeHide.put(pathCheckAnno, showBoatPath.isSelected()); + annoShownBeforeHide.put(speedCheckAnno, showSpeed.isSelected()); + } + /** * Set up boat annotations */ private void initializeAnnotations() { presetAnno = new ArrayList<>(); + + importantAnno = new HashMap<>(); + importantAnno.put(nameCheckAnno, false); + importantAnno.put(abbrevCheckAnno, false); + importantAnno.put(pathCheckAnno, false); + importantAnno.put(speedCheckAnno, false); + + annoShownBeforeHide = new HashMap<>(); + annoShownBeforeHide.put(nameCheckAnno, true); + annoShownBeforeHide.put(abbrevCheckAnno, true); + annoShownBeforeHide.put(pathCheckAnno, true); + annoShownBeforeHide.put(speedCheckAnno, true); //listener for show name in annotation showName.selectedProperty().addListener((ov, old_val, new_val) -> { - raceMap.toggleAnnoName(); + if (old_val != new_val) { + raceMap.toggleAnnoName(); + } + if (buttonChecked != hideBtn) { + //if we are checking the box straight out of hide instead of using the radio buttons + if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ + storeCurrentAnnotationState(); + } else { + annoShownBeforeHide.put(nameCheckAnno, showName.isSelected()); + } + if (buttonChecked == noBtn) { + annotationGroup.selectToggle(showAnnoRBTN); + } + } raceMap.update(); + prevBtnChecked = noBtn; }); //listener for show abbreviation for annotation showAbbrev.selectedProperty().addListener((ov, old_val, new_val) -> { - raceMap.toggleAnnoAbbrev(); + if (old_val != new_val) { + raceMap.toggleAnnoAbbrev(); + } + if (buttonChecked != hideBtn) { + if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ + storeCurrentAnnotationState(); + } else { + annoShownBeforeHide.put(abbrevCheckAnno, showAbbrev.isSelected()); + } + if (buttonChecked == noBtn) { + annotationGroup.selectToggle(showAnnoRBTN); + } + } raceMap.update(); + prevBtnChecked = noBtn; }); //listener for show boat path for annotation showBoatPath.selectedProperty().addListener((ov, old_val, new_val) -> { - raceMap.toggleBoatPath(); + if (old_val != new_val) { + raceMap.toggleBoatPath(); + } + if (buttonChecked != hideBtn) { + if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ + storeCurrentAnnotationState(); + } else { + annoShownBeforeHide.put(pathCheckAnno, showBoatPath.isSelected()); + } + if (buttonChecked == noBtn) { + annotationGroup.selectToggle(showAnnoRBTN); + } + } raceMap.update(); + prevBtnChecked = noBtn; }); //listener to show speed for annotation showSpeed.selectedProperty().addListener((ov, old_val, new_val) -> { - raceMap.toggleAnnoSpeed(); + if (old_val != new_val) { + raceMap.toggleAnnoSpeed(); + } + if (buttonChecked != hideBtn) { + if (prevBtnChecked == hideBtn && buttonChecked != showBtn){ + storeCurrentAnnotationState(); + } else { + annoShownBeforeHide.put(speedCheckAnno, showSpeed.isSelected()); + } + if (buttonChecked == noBtn) { + annotationGroup.selectToggle(showAnnoRBTN); + } + } raceMap.update(); + prevBtnChecked = noBtn; }); //listener to save currently selected annotation saveAnno.setOnAction(event -> { @@ -201,33 +291,55 @@ public class RaceController extends Controller { }); //listener for hiding hideAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ - raceMap.hideAnnotations(); + buttonChecked = hideBtn; + //raceMap.hideAnnotations(); + showName.setSelected(false); + showAbbrev.setSelected(false); + showBoatPath.setSelected(false); + showSpeed.setSelected(false); + annotationGroup.selectToggle(hideAnnoRBTN); raceMap.update(); + buttonChecked = noBtn; + prevBtnChecked = hideBtn; }); //listener for showing all annotations showAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ - raceMap.showAnnotations(); + buttonChecked = showBtn; + showName.setSelected(annoShownBeforeHide.get(nameCheckAnno)); + showAbbrev.setSelected(annoShownBeforeHide.get(abbrevCheckAnno)); + showBoatPath.setSelected(annoShownBeforeHide.get(pathCheckAnno)); + showSpeed.setSelected(annoShownBeforeHide.get(speedCheckAnno)); raceMap.update(); + buttonChecked = noBtn; + prevBtnChecked = showBtn; }); //listener for showing all important partialAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ + buttonChecked = partialBtn; showName.setSelected(false); showAbbrev.setSelected(true); showSpeed.setSelected(true); showBoatPath.setSelected(false); - raceMap.showAnnotations(); + //partialAnnoRBTN.setSelected(true);//as the others will set the show button back to visible then we need to make it so that this is rechecked. + annotationGroup.selectToggle(partialAnnoRBTN); raceMap.update(); + buttonChecked = noBtn; + prevBtnChecked = partialBtn; }); //listener for showing all important importantAnnoRBTN.selectedProperty().addListener((ov, old_val, new_val) ->{ + buttonChecked = importantBtn; 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.showAnnotations(); + annotationGroup.selectToggle(importantAnnoRBTN); raceMap.update(); } + buttonChecked = noBtn; + prevBtnChecked = importantBtn; }); + annotationGroup.selectToggle(showAnnoRBTN); } } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index 0b87a734..3df5055c 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -23,7 +23,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { private RaceMap map; private List boats; private List boatMarkers; - private boolean raceAnno = true; private boolean annoName = true; private boolean annoAbbrev = true; private boolean annoSpeed = true; @@ -240,26 +239,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { } } - /** - * Toggle the raceAnno value - */ - public void toggleAnnotations() { - raceAnno = !raceAnno; - } - - /** - * Shows the race Annotations - */ - public void showAnnotations(){ - raceAnno = true; - } - - /** - * Hides the Race ANnotations - */ - public void hideAnnotations(){ - raceAnno = false; - } /** * Toggle name display in annotation @@ -309,8 +288,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { displayBoat(boat, 0, colours.get(currentColour)); } - if (raceAnno) - displayText(boat.toString(), boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition())); + displayText(boat.toString(), boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition())); //TODO this needs to be fixed. drawTrack(boat, colours.get(currentColour)); currentColour = (currentColour + 1) % colours.size(); @@ -324,7 +302,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { * @see seng302.Model.TrackPoint */ private void drawTrack(Boat boat, Color colour) { - if (annoPath && raceAnno) { + if (annoPath) { for (TrackPoint point : boat.getTrack()) { GraphCoordinate scaledCoordinate = this.map.convertGPS(point.getCoordinate()); gc.setFill(new Color(colour.getRed(), colour.getGreen(), colour.getBlue(), point.getAlpha()));