Skip to content
Snippets Groups Projects
Select Git revision
  • 8f3a4ef2ee2b5da6585b5fe78994f5b3e5c07590
  • main default protected
  • variant
3 results

Controller.java

Blame
  • Forked from COUETOUX Basile / FirefighterStarter
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Controller.java 4.13 KiB
    package controller;
    
    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.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.ToggleButton;
    import javafx.scene.control.ToggleGroup;
    import javafx.util.Duration;
    import javafx.util.Pair;
    import model.*;
    import util.Position;
    import view.Grid;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import static java.util.Objects.requireNonNull;
    
    public class Controller {
    
      public static final int PERIOD_IN_MILLISECONDS = 50;
      @FXML
      public Button restartButton;
      @FXML
      public Button oneStepButton;
      @FXML
      public Label generationNumberLabel;
      @FXML
      private ToggleButton pauseToggleButton;
      @FXML
      private ToggleButton playToggleButton;
      @FXML
      private Grid<BoardElement> grid;
      private Timeline timeline;
      private GameBoard board;
    
      @FXML
      private void initialize() {
        initializePlayAndPauseToggleButtons();
        initializeTimeline();
      }
    
      private void initializePlayAndPauseToggleButtons() {
        ToggleGroup toggleGroup = new PersistentToggleGroup();
        toggleGroup.getToggles().addAll(playToggleButton, pauseToggleButton);
        pauseToggleButton.setSelected(true);
      }
    
      private void setModel(GameBoard gameBoard) {
        this.board = requireNonNull(gameBoard, "GameBoard.model is null");
      }
    
      private void updateBoard(){
        List<Position> updatedPositions = board.updateToNextGeneration();
        List<Pair<Position, BoardElement>> updatedSquares = new ArrayList<>();
        for(Position updatedPosition : updatedPositions){
          //List<ModelElement> squareState = board.getState(updatedPosition);
          //BoardElement viewElement = getViewElement(squareState);
          //updatedSquares.add(new Pair<>(updatedPosition, viewElement));
        }
        grid.repaint(updatedSquares);
        updateGenerationLabel(board.stepNumber());
      }
    
      private void repaintGrid(){
        int columnCount = board.columnCount();
        int rowCount = board.rowCount();
        model.BoardElement[][] boardElements = new model.BoardElement[rowCount][columnCount];
        for(int column = 0; column < columnCount; column++)
          for(int row = 0; row < rowCount; row++){
            if(board.getElementPosition().containsKey(new Position(row,column))){
              boardElements[row][column] = board.getElementPosition().get(new Position(row,column)).get(0);
            }else{
              boardElements[row][column]=new EmptyElement();
            }
          }
        grid.repaint(boardElements);
        updateGenerationLabel(board.stepNumber());
      }
    
      /*private BoardElement getViewElement(List<ModelElement> squareState) {
        if(squareState.contains(ModelElement.FIREFIGHTER)){
          return BoardElement.FIREFIGHTER;
        }
        if (squareState.contains(ModelElement.FIRE)){
          return BoardElement.FIRE;
        }
        return BoardElement.EMPTY;
      }*/
    
      private void initializeTimeline() {
        Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
        EventHandler<ActionEvent> eventHandler =
                event -> updateBoard();
        KeyFrame keyFrame = new KeyFrame(duration, eventHandler);
        timeline = new Timeline(keyFrame);
        timeline.setCycleCount(Animation.INDEFINITE);
      }
    
      public void play() {
        timeline.play();
      }
    
      public void pause() {
        timeline.pause();
      }
    
      public void pauseToggleButtonAction() {
        this.pause();
      }
    
      public void playToggleButtonAction() {
        this.play();
      }
    
      public void restartButtonAction() {
        this.pause();
        board.reset();
        pauseToggleButton.setSelected(true);
        repaintGrid();
      }
    
      public void initialize(int squareWidth, int squareHeight, int columnCount,
                                    int rowCount, int initialFireCount, int initialFirefighterCount) {
        grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
        this.setModel(new GameBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
        repaintGrid();
      }
    
      public void oneStepButtonAction() {
        this.pause();
        updateBoard();
      }
    
      private void updateGenerationLabel(int value){
        generationNumberLabel.setText(Integer.toString(value));
      }
    }