Skip to content

Commit

Permalink
Finished GUI controls
Browse files Browse the repository at this point in the history
  • Loading branch information
MatiPl01 committed Dec 28, 2021
1 parent af172dc commit e4f6b42
Show file tree
Hide file tree
Showing 28 changed files with 709 additions and 265 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,50 @@
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import my.project.gui.charts.ChartDrawer;
import my.project.gui.enums.TrackingButtonState;
import my.project.gui.simulation.visualization.SimulationVisualizer;
import my.project.simulation.engine.IEngine;
import my.project.simulation.engine.SimulationEngine;
import my.project.simulation.enums.SimulationState;
import my.project.gui.enums.SimulationState;
import my.project.simulation.maps.AbstractMap;
import my.project.simulation.maps.IMap;
import my.project.simulation.sprites.Animal;
import my.project.simulation.stats.StatsMeter;
import my.project.simulation.utils.AnimalTracker;
import my.project.simulation.utils.Vector2D;

import java.util.concurrent.atomic.AtomicReference;
import java.util.Set;
import java.util.stream.Collectors;

public class AbstractContainerController {
private static final int DEFAULT_REFRESH_INTERVAL = 300; // ms
private static final int MIN_REFRESH_INTERVAL = 1; // ms
private static final int MAX_REFRESH_INTERVAL = 1000; // ms

private AnchorPane simulationBox;
private AnchorPane chartBox;
private Slider refreshSlider;
private Label refreshLabel;
protected Side legendSide;
private Button pauseButton;
private Button trackButton;
private Button dominantGenomesButton;
private AnchorPane simulationBox;
private AnchorPane chartBox;
private VBox dominantGenomesBox;
private VBox trackedAnimalBox;
private Label trackedAnimalID;
private Label trackedAnimalChildren;
private Label trackedAnimalDescendants;
private Label trackedAnimalDeath;

private IMap map;
private IEngine engine;
private SimulationVisualizer simulationVisualizer;

private boolean isShowingDominantGenomesAnimals = false;
private boolean isShowingAnimalsPicker = false;
private TrackingButtonState trackingButtonState = TrackingButtonState.CHOOSE;

public void setSimulationBox(AnchorPane simulationBox) {
this.simulationBox = simulationBox;
Expand All @@ -35,6 +58,10 @@ public void setChartBox(AnchorPane chartBox) {
this.chartBox = chartBox;
}

public void setPauseButton(Button pauseButton) {
this.pauseButton = pauseButton;
}

public void setRefreshSlider(Slider refreshSlider) {
this.refreshSlider = refreshSlider;
}
Expand All @@ -43,37 +70,146 @@ public void setRefreshLabel(Label refreshLabel) {
this.refreshLabel = refreshLabel;
}

public void setDominantGenomesBox(VBox dominantGenomesBox) {
this.dominantGenomesBox = dominantGenomesBox;
}

public void setTrackButton(Button trackButton) {
this.trackButton = trackButton;
}

public void setDominantGenomesButton(Button dominantGenomesButton) {
this.dominantGenomesButton = dominantGenomesButton;
}

public void setTrackedAnimalBoxes(VBox trackedAnimalBox,
Label trackedAnimalID,
Label trackedAnimalChildren,
Label trackedAnimalDescendants,
Label trackedAnimalDeath) {
this.trackedAnimalBox = trackedAnimalBox;
this.trackedAnimalID = trackedAnimalID;
this.trackedAnimalChildren = trackedAnimalChildren;
this.trackedAnimalDescendants = trackedAnimalDescendants;
this.trackedAnimalDeath = trackedAnimalDeath;
}

public void launch(IMap map) {
map.setChartDrawer(new ChartDrawer(this.chartBox, null, "Day", "Count", legendSide));
SimulationVisualizer simulationVisualizer = new SimulationVisualizer(map, simulationBox);
this.engine = new SimulationEngine(map, simulationVisualizer);
Thread engineThread = new Thread((Runnable) this.engine);
this.map = map;
StatsMeter statsMeter = map.getStatsMeter();
statsMeter.setChartDrawer(new ChartDrawer(chartBox, null, "Day", "Count", legendSide));
statsMeter.setDominantGenomesBox(dominantGenomesBox);
simulationVisualizer = new SimulationVisualizer(map, simulationBox);
engine = new SimulationEngine(map, simulationVisualizer);
Thread engineThread = new Thread((Runnable) engine);
setupRefreshInterval();
engineThread.start();
}

protected void pauseButtonClicked(Button pauseButton) {
if (engine.getState() == SimulationState.PAUSED) {
engine.start();
pauseButton.setText("Pause");
} else {
engine.pause();
pauseButton.setText("Start");
}
map.getGridBuilder().setEventsController(this);
System.out.println(map.getGridBuilder());
}

private void setupRefreshInterval() {
double ratio = 1. * (DEFAULT_REFRESH_INTERVAL - MIN_REFRESH_INTERVAL)
/ (MAX_REFRESH_INTERVAL - MIN_REFRESH_INTERVAL);
refreshSlider.setValue(100. * (1 - ratio));
refreshLabel.setText(String.valueOf(DEFAULT_REFRESH_INTERVAL));
this.engine.setRefreshInterval(DEFAULT_REFRESH_INTERVAL);
engine.setRefreshInterval(DEFAULT_REFRESH_INTERVAL);

refreshSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
int refreshInterval = (int) ((1 - refreshSlider.getValue() / 100)
* (MAX_REFRESH_INTERVAL - MIN_REFRESH_INTERVAL) + MIN_REFRESH_INTERVAL);
refreshLabel.setText(String.valueOf(refreshInterval));
this.engine.setRefreshInterval(refreshInterval);
engine.setRefreshInterval(refreshInterval);
});
}

protected void pauseButtonClicked() {
if (engine.getState() == SimulationState.PAUSED) {
engine.start();
pauseButton.setText("Pause");
dominantGenomesButton.setDisable(true);
trackButton.setDisable(true);
} else {
engine.pause();
pauseButton.setText("Start");
dominantGenomesButton.setDisable(false);
trackButton.setDisable(false);
}
}

protected void dominantButtonClicked() {
if (isShowingDominantGenomesAnimals) {
simulationVisualizer.hideDominantGenomesAnimals();
dominantGenomesButton.setText("Show");
trackButton.setDisable(false);
pauseButton.setDisable(false);
} else {
simulationVisualizer.showDominantGenomesAnimals();
dominantGenomesButton.setText("Hide");
trackButton.setDisable(true);
pauseButton.setDisable(true);
}
isShowingDominantGenomesAnimals = !isShowingDominantGenomesAnimals;
}

protected void trackButtonClicked() {
System.out.println("State " + trackingButtonState);
switch (trackingButtonState) {
case CHOOSE -> {
enableAnimalPicker();
pauseButton.setDisable(true);
dominantGenomesButton.setDisable(true);
trackButton.setText("Cancel");
trackingButtonState = TrackingButtonState.CANCEL;
}
case CANCEL -> {
disableAnimalsPicker();
pauseButton.setDisable(false);
dominantGenomesButton.setDisable(false);
trackButton.setText("Choose");
trackingButtonState = TrackingButtonState.CHOOSE;
}
case STOP -> {
map.removeAnimalTracker();
trackButton.setText("Choose");
trackingButtonState = TrackingButtonState.CHOOSE;
}
}
}

private void enableAnimalPicker() {
isShowingAnimalsPicker = true;
Set<Animal> maxEnergyAnimals = map.getMaxEnergyFieldAnimals();
simulationVisualizer.bringAnimalsToTop(maxEnergyAnimals);
simulationVisualizer.showAnimalsIDs(map.getMaxEnergyFieldAnimals());
}

private void disableAnimalsPicker() {
isShowingAnimalsPicker = false;
simulationVisualizer.hideAnimalsIDs(map.getMaxEnergyFieldAnimals());
}

private void setAnimalTracker(Animal animal) {
map.setAnimalTracker(new AnimalTracker(animal, trackedAnimalID,
trackedAnimalChildren,
trackedAnimalDescendants,
trackedAnimalDeath));
}

public void notifyClick(Vector2D position) {
if (trackingButtonState == TrackingButtonState.CANCEL) {
Animal animal = map.getMaxEnergyFieldAnimal(position);
if (animal == null) return;
setAnimalTracker(animal);
disableAnimalsPicker();
pauseButton.setDisable(false);
dominantGenomesButton.setDisable(false);
trackingButtonState = TrackingButtonState.STOP;
trackButton.setText("Stop");
}
}

protected void saveStatsFile() {
map.getStatsMeter().generateCSVFile();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,19 @@
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;

public class ContainerLeftController extends AbstractContainerController {
@FXML
private AnchorPane simulationBox;
protected AnchorPane simulationBox;

@FXML
private AnchorPane chartBox;
protected AnchorPane chartBox;

@FXML
private VBox dominantGenomesBox;

@FXML
private Slider refreshSlider;
Expand All @@ -23,17 +28,62 @@ public class ContainerLeftController extends AbstractContainerController {
@FXML
private Label refreshLabel;

@FXML
private Button dominantGenomesButton;

@FXML
private Button trackButton;

@FXML
private VBox trackedAnimalBox;

@FXML
private Label trackedAnimalID;

@FXML
private Label trackedAnimalChildren;

@FXML
private Label trackedAnimalDescendants;

@FXML
private Label trackedAnimalDeath;

@FXML
private void initialize() {
this.legendSide = Side.LEFT;
setSimulationBox(simulationBox);
setChartBox(chartBox);
setPauseButton(pauseButton);
setRefreshSlider(refreshSlider);
setRefreshLabel(refreshLabel);
setDominantGenomesBox(dominantGenomesBox);
setDominantGenomesButton(dominantGenomesButton);
setTrackButton(trackButton);
setTrackedAnimalBoxes(trackedAnimalBox,
trackedAnimalID,
trackedAnimalChildren,
trackedAnimalDescendants,
trackedAnimalDeath);
}

@FXML
private void onPause() {
pauseButtonClicked(pauseButton);
pauseButtonClicked();
}

@FXML
private void onDominantShow() {
dominantButtonClicked();
}

@FXML
private void onTrackChoose() {
trackButtonClicked();
}

@FXML
private void onStatsFileSave() {
saveStatsFile();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;

public class ContainerRightController extends AbstractContainerController {
@FXML
Expand All @@ -14,6 +15,9 @@ public class ContainerRightController extends AbstractContainerController {
@FXML
protected AnchorPane chartBox;

@FXML
private VBox dominantGenomesBox;

@FXML
private Slider refreshSlider;

Expand All @@ -23,17 +27,62 @@ public class ContainerRightController extends AbstractContainerController {
@FXML
private Label refreshLabel;

@FXML
private Button dominantGenomesButton;

@FXML
private Button trackButton;

@FXML
private VBox trackedAnimalBox;

@FXML
private Label trackedAnimalID;

@FXML
private Label trackedAnimalChildren;

@FXML
private Label trackedAnimalDescendants;

@FXML
private Label trackedAnimalDeath;

@FXML
private void initialize() {
this.legendSide = Side.RIGHT;
setSimulationBox(simulationBox);
setChartBox(chartBox);
setPauseButton(pauseButton);
setRefreshSlider(refreshSlider);
setRefreshLabel(refreshLabel);
setDominantGenomesBox(dominantGenomesBox);
setDominantGenomesButton(dominantGenomesButton);
setTrackButton(trackButton);
setTrackedAnimalBoxes(trackedAnimalBox,
trackedAnimalID,
trackedAnimalChildren,
trackedAnimalDescendants,
trackedAnimalDeath);
}

@FXML
private void onPause() {
pauseButtonClicked(pauseButton);
pauseButtonClicked();
}

@FXML
private void onDominantShow() {
dominantButtonClicked();
}

@FXML
private void onTrackChoose() {
trackButtonClicked();
}

@FXML
private void onStatsFileSave() {
saveStatsFile();
}
}
Loading

0 comments on commit e4f6b42

Please sign in to comment.