mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 06:18:44 +00:00
Gave the boatgroups a selection attribute, allowing them to be highlighted upon clicking
Boats can be clicked on canvas or from selection drop down on the side #story[955]
This commit is contained in:
@@ -5,11 +5,15 @@ import javafx.animation.KeyFrame;
|
|||||||
import javafx.animation.Timeline;
|
import javafx.animation.Timeline;
|
||||||
import javafx.beans.value.ChangeListener;
|
import javafx.beans.value.ChangeListener;
|
||||||
import javafx.beans.value.ObservableValue;
|
import javafx.beans.value.ObservableValue;
|
||||||
|
import javafx.collections.FXCollections;
|
||||||
|
import javafx.collections.ObservableArray;
|
||||||
|
import javafx.collections.ObservableList;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.fxml.FXMLLoader;
|
import javafx.fxml.FXMLLoader;
|
||||||
import javafx.scene.Scene;
|
import javafx.scene.Scene;
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
import javafx.scene.control.CheckBox;
|
import javafx.scene.control.CheckBox;
|
||||||
|
import javafx.scene.control.ComboBox;
|
||||||
import javafx.scene.control.Slider;
|
import javafx.scene.control.Slider;
|
||||||
import javafx.scene.layout.AnchorPane;
|
import javafx.scene.layout.AnchorPane;
|
||||||
import javafx.scene.layout.Pane;
|
import javafx.scene.layout.Pane;
|
||||||
@@ -50,6 +54,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
@FXML
|
@FXML
|
||||||
private Button selectAnnotationBtn;
|
private Button selectAnnotationBtn;
|
||||||
@FXML
|
@FXML
|
||||||
|
private ComboBox boatSelectionComboBox;
|
||||||
|
@FXML
|
||||||
private CanvasController includedCanvasController;
|
private CanvasController includedCanvasController;
|
||||||
|
|
||||||
private ArrayList<Yacht> startingBoats = new ArrayList<>();
|
private ArrayList<Yacht> startingBoats = new ArrayList<>();
|
||||||
@@ -79,6 +85,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
initializeSettings();
|
initializeSettings();
|
||||||
initialiseWindDirection();
|
initialiseWindDirection();
|
||||||
initialisePositionVBox();
|
initialisePositionVBox();
|
||||||
|
initialiseBoatSelectionComboBox();
|
||||||
//set wind direction!!!!!!! can't find another place to put my code --haoming
|
//set wind direction!!!!!!! can't find another place to put my code --haoming
|
||||||
// double windDirection = new ConfigParser("/config/config.xml").getWindDirection();
|
// double windDirection = new ConfigParser("/config/config.xml").getWindDirection();
|
||||||
// windDirectionText.setText(String.format("%.1f°", windDirection));
|
// windDirectionText.setText(String.format("%.1f°", windDirection));
|
||||||
@@ -220,6 +227,16 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initialiseBoatSelectionComboBox() {
|
||||||
|
|
||||||
|
ObservableList<Yacht> observableBoats = FXCollections.observableArrayList(startingBoats);
|
||||||
|
boatSelectionComboBox.setItems(observableBoats);
|
||||||
|
boatSelectionComboBox.valueProperty().addListener((observable, oldValue, newValue) -> {
|
||||||
|
Yacht thisYacht = (Yacht) newValue;
|
||||||
|
setSelectedBoat(thisYacht);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates time line for each boat, and stores time time into timelineInfos hash map
|
* Generates time line for each boat, and stores time time into timelineInfos hash map
|
||||||
*/
|
*/
|
||||||
@@ -511,6 +528,26 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets all the annotations of the selected boat to be visible and all others to be hidden
|
||||||
|
* @param yacht The yacht for which we want to view all annotations
|
||||||
|
*/
|
||||||
|
private void setSelectedBoat(Yacht yacht) {
|
||||||
|
for (RaceObject ro : includedCanvasController.getRaceObjects()) {
|
||||||
|
if (ro instanceof BoatGroup) {
|
||||||
|
BoatGroup bg = (BoatGroup) ro;
|
||||||
|
//We need to iterate over all race groups to get the matching boat group belonging to this boat if we
|
||||||
|
//are to toggle its annotations, there is no other backwards knowledge of a yacht to its boatgroup.
|
||||||
|
if (bg.getBoat().getHullID().equals(yacht.getHullID())) {
|
||||||
|
bg.setIsSelected(true);
|
||||||
|
} else {
|
||||||
|
bg.setIsSelected(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void setStage (Stage stage) {
|
void setStage (Stage stage) {
|
||||||
this.stage = stage;
|
this.stage = stage;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
package seng302.models;
|
package seng302.models;
|
||||||
|
|
||||||
|
import javafx.event.EventHandler;
|
||||||
import javafx.geometry.Point2D;
|
import javafx.geometry.Point2D;
|
||||||
import javafx.scene.Group;
|
import javafx.scene.Group;
|
||||||
|
import javafx.scene.input.MouseEvent;
|
||||||
import javafx.scene.paint.Color;
|
import javafx.scene.paint.Color;
|
||||||
import javafx.scene.shape.Line;
|
import javafx.scene.shape.Line;
|
||||||
import javafx.scene.shape.Polygon;
|
import javafx.scene.shape.Polygon;
|
||||||
import javafx.scene.text.Text;
|
import javafx.scene.text.Text;
|
||||||
import javafx.scene.transform.Rotate;
|
import javafx.scene.transform.Rotate;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
|
import seng302.controllers.RaceViewController;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -39,6 +42,7 @@ public class BoatGroup extends RaceObject{
|
|||||||
private Text teamNameObject;
|
private Text teamNameObject;
|
||||||
private Text velocityObject;
|
private Text velocityObject;
|
||||||
private Wake wake;
|
private Wake wake;
|
||||||
|
private boolean isSelected = false;
|
||||||
//Handles boat moving when connecting to a stream
|
//Handles boat moving when connecting to a stream
|
||||||
private boolean setToInitialLocation = false;
|
private boolean setToInitialLocation = false;
|
||||||
private boolean destinationSet;
|
private boolean destinationSet;
|
||||||
@@ -80,6 +84,9 @@ public class BoatGroup extends RaceObject{
|
|||||||
private void initChildren (Color color, double... points) {
|
private void initChildren (Color color, double... points) {
|
||||||
boatPoly = new Polygon(points);
|
boatPoly = new Polygon(points);
|
||||||
boatPoly.setFill(color);
|
boatPoly.setFill(color);
|
||||||
|
boatPoly.setOnMouseEntered(event -> boatPoly.setFill(Color.FLORALWHITE));
|
||||||
|
boatPoly.setOnMouseExited(event -> boatPoly.setFill(color));
|
||||||
|
boatPoly.setOnMouseClicked(event -> setIsSelected(!isSelected)); //Toggle the selection of the boat
|
||||||
|
|
||||||
teamNameObject = new Text(boat.getShortName());
|
teamNameObject = new Text(boat.getShortName());
|
||||||
velocityObject = new Text(String.valueOf(boat.getVelocity()));
|
velocityObject = new Text(String.valueOf(boat.getVelocity()));
|
||||||
@@ -176,7 +183,7 @@ public class BoatGroup extends RaceObject{
|
|||||||
boatPoly.getLayoutY()
|
boatPoly.getLayoutY()
|
||||||
);
|
);
|
||||||
l.getStrokeDashArray().setAll(3d, 7d);
|
l.getStrokeDashArray().setAll(3d, 7d);
|
||||||
l.setStroke(boatPoly.getFill());
|
l.setStroke(boat.getColour());
|
||||||
lineGroup.getChildren().add(l);
|
lineGroup.getChildren().add(l);
|
||||||
}
|
}
|
||||||
if (destinationSet) { //Only begin drawing after the first destination is set
|
if (destinationSet) { //Only begin drawing after the first destination is set
|
||||||
@@ -279,6 +286,10 @@ public class BoatGroup extends RaceObject{
|
|||||||
wake.rotate(rotationalGoal);
|
wake.rotate(rotationalGoal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void paintBoat (Color color) {
|
||||||
|
boatPoly.setFill(color);
|
||||||
|
}
|
||||||
|
|
||||||
public void setTeamNameObjectVisible(Boolean visible) {
|
public void setTeamNameObjectVisible(Boolean visible) {
|
||||||
teamNameObject.setVisible(visible);
|
teamNameObject.setVisible(visible);
|
||||||
}
|
}
|
||||||
@@ -299,6 +310,20 @@ public class BoatGroup extends RaceObject{
|
|||||||
return boat;
|
return boat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function sets the boats isSelected property AS WELL as actually acting upon the value of that selection.
|
||||||
|
* (Painting or not painting annotations)
|
||||||
|
* @param isSelected A Boolean indicating whether or not the boat is selected
|
||||||
|
*/
|
||||||
|
public void setIsSelected(Boolean isSelected) {
|
||||||
|
this.isSelected = isSelected;
|
||||||
|
setTeamNameObjectVisible(isSelected);
|
||||||
|
setVelocityObjectVisible(isSelected);
|
||||||
|
setLineGroupVisible(isSelected);
|
||||||
|
setWakeVisible(isSelected);
|
||||||
|
paintBoat((isSelected) ? Color.WHITE : boat.getColour());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if this BoatGroup contains at least one of the given IDs.
|
* Returns true if this BoatGroup contains at least one of the given IDs.
|
||||||
*
|
*
|
||||||
@@ -355,4 +380,9 @@ public class BoatGroup extends RaceObject{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return boat.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,4 +164,9 @@ public class Yacht {
|
|||||||
public void setMarkLastPast(Integer markLastPast) {
|
public void setMarkLastPast(Integer markLastPast) {
|
||||||
this.markLastPast = markLastPast;
|
this.markLastPast = markLastPast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return boatName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,8 @@
|
|||||||
<Slider fx:id="annotationSlider" blockIncrement="1.0" layoutX="38.0" layoutY="527.0" majorTickUnit="1.0" max="3.0" minorTickCount="0" prefHeight="51.0" prefWidth="170.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" styleClass="ui-slider" />
|
<Slider fx:id="annotationSlider" blockIncrement="1.0" layoutX="38.0" layoutY="527.0" majorTickUnit="1.0" max="3.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" />
|
<Label layoutX="10.0" layoutY="499.0" text="Annotations" textFill="WHITE" />
|
||||||
<Button fx:id="selectAnnotationBtn" layoutX="35.0" layoutY="578.0" mnemonicParsing="false" prefHeight="18.0" prefWidth="170.0" styleClass="blue-ui-btn" text="Select Annotations" textFill="WHITE" />
|
<Button fx:id="selectAnnotationBtn" 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="boatSelectionComboBox" layoutX="37.0" layoutY="664.0" prefHeight="25.0" prefWidth="170.0" promptText="Select Boat" styleClass="blue" />
|
||||||
</children>
|
</children>
|
||||||
</AnchorPane>
|
</AnchorPane>
|
||||||
<AnchorPane fx:id="contentAnchorPane" prefHeight="960.0" prefWidth="1280.0" style="-fx-background-color: skyblue;" GridPane.columnIndex="1" GridPane.halignment="LEFT" GridPane.rowSpan="2147483647" GridPane.valignment="TOP">
|
<AnchorPane fx:id="contentAnchorPane" prefHeight="960.0" prefWidth="1280.0" style="-fx-background-color: skyblue;" GridPane.columnIndex="1" GridPane.halignment="LEFT" GridPane.rowSpan="2147483647" GridPane.valignment="TOP">
|
||||||
|
|||||||
Reference in New Issue
Block a user