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

Controller.java

Blame
  • Forked from COUETOUX Basile / FirefighterStarter
    117 commits ahead of the upstream repository.
    user avatar
    Sarah CHERCHEM authored
    b8ef382a
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Controller.java 4.63 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 view.ViewElement;
    
    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<ViewElement> grid;
      private Timeline timeline;
      private FirefighterBoard 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(FirefighterBoard firefighterBoard) {
        this.board = requireNonNull(firefighterBoard, "firefighter.model is null");
      }
    
      private void updateBoard(){
        List<Position> updatedPositions = board.getBehavior().updateToNextGeneration();
        List<Pair<Position, ViewElement>> updatedSquares = new ArrayList<>();
        for(Position updatedPosition : updatedPositions){
          List<ModelElement> squareState = board.getState(updatedPosition);
          ViewElement viewElement = getViewElement(squareState);
          updatedSquares.add(new Pair<>(updatedPosition, viewElement));
        }
        grid.repaint(updatedSquares);
        updateGenerationLabel(board.getBehavior().stepNumber());
      }
    
      private void repaintGrid(){
        int columnCount = board.getProperties().columnCount();
        int rowCount = board.getProperties().rowCount();
        ViewElement[][] viewElements = new ViewElement[rowCount][columnCount];
        for(int column = 0; column < columnCount; column++)
          for(int row = 0; row < rowCount; row++)
            viewElements[row][column] = getViewElement(board.getState(new Position(row, column)));
        grid.repaint(viewElements);
        updateGenerationLabel(board.getBehavior().stepNumber());
      }
      private ViewElement getViewElement(List<ModelElement> squareState) {
        for (ModelElement element : squareState) {
          if (element instanceof FireFighter) {
            return ViewElement.FIREFIGHTER;
          }
          if (element instanceof Fire) {
            return ViewElement.FIRE;
          }
          if (element instanceof Cloud) {
            return ViewElement.CLOUD;
          }
          if (element instanceof MotorizedFireFighter)
          {
            return ViewElement.MOTORIZED;
          }
          if(element instanceof Mountain)
          {
            return ViewElement.MOUNTAIN;
          }
          if (element instanceof Road)
          {
            return ViewElement.ROAD;
          }
          if (element instanceof Rocky)
          {
            return ViewElement.ROCKY;
          }
    
        }
        return ViewElement.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,int initialCloud,int initialMotorized,int initialRocky) {
        grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
        this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloud,initialMotorized,initialRocky));
        repaintGrid();
      }
    
      public void oneStepButtonAction() {
        this.pause();
        updateBoard();
      }
    
      private void updateGenerationLabel(int value){
        generationNumberLabel.setText(Integer.toString(value));
      }
    }