Skip to content
Snippets Groups Projects
Controller.java 3.08 KiB
Newer Older
  • Learn to ignore specific revisions
  • package controller;
    
    
    Guyslain's avatar
    Guyslain committed
    import matrix.Coordinate;
    
    Guyslain's avatar
    Guyslain committed
    import javafx.animation.Animation;
    import javafx.animation.KeyFrame;
    import javafx.animation.Timeline;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    
    import javafx.fxml.FXML;
    import javafx.scene.control.Label;
    import javafx.scene.control.ToggleButton;
    import javafx.scene.control.ToggleGroup;
    
    Guyslain's avatar
    Guyslain committed
    import javafx.util.Duration;
    
    import view.MatrixPane;
    
    import static java.util.Objects.requireNonNull;
    
    /**
     * Controller for <i>The Game of Life</i> application.
     */
    public class Controller {
    
    
    Guyslain's avatar
    Guyslain committed
        public static final int PERIOD_IN_MILLISECONDS = 100;
    
        @FXML
        private ToggleButton playToggleButton;
        @FXML
        private ToggleButton pauseToggleButton;
        @FXML
        private Label generationNumberLabel;
        @FXML
        private MatrixPane matrixPane;
    
    Guyslain's avatar
    Guyslain committed
        private Timeline timeline;
    
    Guyslain's avatar
    Guyslain committed
        public Simulation getSimulation() {
            return simulation;
        }
    
        private Simulation simulation;
    
    
        @FXML
        private void initialize() {
            initializePlayAndPauseToggleButtons();
    
    Guyslain's avatar
    Guyslain committed
            updateTimeline();
    
        }
    
        private void initializePlayAndPauseToggleButtons() {
            ToggleGroup toggleGroup = new PersistentToggleGroup();
            toggleGroup.getToggles().addAll(playToggleButton, pauseToggleButton);
            pauseToggleButton.setSelected(true);
        }
    
    
    
    Guyslain's avatar
    Guyslain committed
        public void setSimulation(Simulation simulation) {
            this.simulation = requireNonNull(simulation, "game of life is null");
    
            setGenerationNumberLabelTextProperty();
            initializeMatrixPane();
        }
    
        private void setGenerationNumberLabelTextProperty() {
    
            updateGenerationNumber(0);
            this.simulation.setGenerationNumberChangeListener(
                    (oldValue, newValue) -> updateGenerationNumber(newValue)
            );
        }
    
        private void updateGenerationNumber(int newValue) {
            generationNumberLabel.textProperty().set(String.valueOf(newValue));
    
        }
    
        private void initializeMatrixPane() {
    
    Guyslain's avatar
    Guyslain committed
            matrixPane.initialize(this);
    
        }
    
        @FXML
        private void playToggleButtonAction() {
    
    Guyslain's avatar
    Guyslain committed
            this.play();
    
        }
    
        @FXML
        private void pauseToggleButtonAction() {
    
    Guyslain's avatar
    Guyslain committed
            this.pause();
    
        }
    
        @FXML
        private void resetButtonAction() {
    
    Guyslain's avatar
    Guyslain committed
            this.pause();
            simulation.reset();
    
            pauseToggleButton.setSelected(true);
        }
    
        @FXML
        private void clearButtonAction() {
    
    Guyslain's avatar
    Guyslain committed
            this.pause();
            simulation.clear();
    
            pauseToggleButton.setSelected(true);
        }
    
    Guyslain's avatar
    Guyslain committed
    
    
    
        public Iterable<Coordinate> coordinates() {
            return simulation;
        }
    
        private void updateTimeline() {
            Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
            EventHandler<ActionEvent> eventHandler =
                    event -> simulation.updateToNextGeneration();
            KeyFrame keyFrame = new KeyFrame(duration, eventHandler);
            timeline = new Timeline(keyFrame);
            timeline.setCycleCount(Animation.INDEFINITE);
        }
    
        /**
         * Plays the game.
         */
        public void play() {
            timeline.play();
        }
    
        /**
         * Pauses the game.
         */
        public void pause() {
            timeline.pause();
        }