From ba6f794399d2b6810015cd68554b55dded260dfb Mon Sep 17 00:00:00 2001
From: arnaudlabourel <arnaud.labourel@univ-amu.fr>
Date: Tue, 24 Oct 2023 15:56:57 +0200
Subject: [PATCH] added generation number on the GUI

---
 .../firefighter/controller/Controller.java    | 11 ++++-
 src/main/java/firefighter/model/Board.java    | 46 +++++++++++++++++++
 .../firefighter/model/FirefighterBoard.java   |  8 ++++
 .../firefighter/{model => util}/Position.java |  2 +-
 .../firefighter/view/FirefighterGrid.java     |  2 +-
 src/main/java/firefighter/view/Grid.java      | 35 +++++++++++++-
 src/main/resources/firefighter/view/view.fxml | 10 ++++
 7 files changed, 109 insertions(+), 5 deletions(-)
 rename src/main/java/firefighter/{model => util}/Position.java (64%)

diff --git a/src/main/java/firefighter/controller/Controller.java b/src/main/java/firefighter/controller/Controller.java
index 335bf3e..277888d 100644
--- a/src/main/java/firefighter/controller/Controller.java
+++ b/src/main/java/firefighter/controller/Controller.java
@@ -7,6 +7,7 @@ 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;
@@ -14,7 +15,7 @@ import javafx.util.Pair;
 import firefighter.model.Board;
 import firefighter.model.ModelElement;
 import firefighter.model.FirefighterBoard;
-import firefighter.model.Position;
+import firefighter.util.Position;
 import firefighter.view.FirefighterGrid;
 import firefighter.view.ViewElement;
 
@@ -31,6 +32,8 @@ public class Controller {
   @FXML
   public Button oneStepButton;
   @FXML
+  public Label generationNumberLabel;
+  @FXML
   private ToggleButton pauseToggleButton;
   @FXML
   private ToggleButton playToggleButton;
@@ -64,6 +67,7 @@ public class Controller {
       updatedSquares.add(new Pair<>(updatedPosition, viewElement));
     }
     grid.repaint(updatedSquares);
+    updateLabel(board.stepNumber());
   }
 
   private void repaintBoard(){
@@ -74,6 +78,7 @@ public class Controller {
       for(int row = 0; row < rowCount; row++)
         viewElements[row][column] = getViewElement(board.getState(new Position(row, column)));
     grid.repaint(viewElements);
+    updateLabel(board.stepNumber());
   }
 
   private ViewElement getViewElement(List<ModelElement> squareState) {
@@ -129,4 +134,8 @@ public class Controller {
     this.pause();
     updateBoard();
   }
+
+  private void updateLabel(int value){
+    generationNumberLabel.setText(Integer.toString(value));
+  }
 }
\ No newline at end of file
diff --git a/src/main/java/firefighter/model/Board.java b/src/main/java/firefighter/model/Board.java
index a17de30..df5996d 100644
--- a/src/main/java/firefighter/model/Board.java
+++ b/src/main/java/firefighter/model/Board.java
@@ -1,11 +1,57 @@
 package firefighter.model;
 
+import firefighter.util.Position;
+
 import java.util.List;
 
+/**
+ * This interface represents a generic board for modeling various state-based systems.
+ *
+ * @param <S> The type of state represented on the board.
+ */
 public interface Board<S> {
+
+  /**
+   * Get the state of the board at a specific position.
+   *
+   * @param position The position on the board for which to retrieve the state.
+   * @return The state at the specified position.
+   */
   S getState(Position position);
+
+  /**
+   * Get the number of rows in the board.
+   *
+   * @return The number of rows in the board.
+   */
   int rowCount();
+
+  /**
+   * Get the number of columns in the board.
+   *
+   * @return The number of columns in the board.
+   */
   int columnCount();
+
+  /**
+   * Update the board to its next generation or state. This method may modify the
+   * internal state of the board and return a list of positions that have changed
+   * during the update.
+   *
+   * @return A list of positions that have changed during the update.
+   */
   List<Position> updateToNextGeneration();
+
+  /**
+   * Reset the board to its initial state.
+   */
   void reset();
+
+  /**
+   * Get the current step number or generation of the board.
+   *
+   * @return The current step number or generation.
+   */
+  int stepNumber();
 }
+
diff --git a/src/main/java/firefighter/model/FirefighterBoard.java b/src/main/java/firefighter/model/FirefighterBoard.java
index 29af45a..8bdf8b2 100644
--- a/src/main/java/firefighter/model/FirefighterBoard.java
+++ b/src/main/java/firefighter/model/FirefighterBoard.java
@@ -1,5 +1,7 @@
 package firefighter.model;
 
+import firefighter.util.Position;
+
 import java.util.*;
 
 
@@ -76,6 +78,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
 
   }
 
+  @Override
+  public int stepNumber() {
+    return step;
+  }
+
   private List<Position> activateFirefighters() {
     List<Position> result = new ArrayList<>();
     firefighterNewPositions = new ArrayList<>();
@@ -96,6 +103,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
 
   @Override
   public void reset() {
+    step = 0;
     initializeElements();
   }
 
diff --git a/src/main/java/firefighter/model/Position.java b/src/main/java/firefighter/util/Position.java
similarity index 64%
rename from src/main/java/firefighter/model/Position.java
rename to src/main/java/firefighter/util/Position.java
index 9941e11..b44a78a 100644
--- a/src/main/java/firefighter/model/Position.java
+++ b/src/main/java/firefighter/util/Position.java
@@ -1,4 +1,4 @@
-package firefighter.model;
+package firefighter.util;
 
 public record Position(int row, int column) {
 
diff --git a/src/main/java/firefighter/view/FirefighterGrid.java b/src/main/java/firefighter/view/FirefighterGrid.java
index 1e46ca8..6d9a61c 100644
--- a/src/main/java/firefighter/view/FirefighterGrid.java
+++ b/src/main/java/firefighter/view/FirefighterGrid.java
@@ -3,7 +3,7 @@ package firefighter.view;
 import javafx.scene.canvas.Canvas;
 import javafx.scene.paint.Color;
 import javafx.util.Pair;
-import firefighter.model.Position;
+import firefighter.util.Position;
 
 import java.util.List;
 
diff --git a/src/main/java/firefighter/view/Grid.java b/src/main/java/firefighter/view/Grid.java
index bc0b487..6b1d7fc 100644
--- a/src/main/java/firefighter/view/Grid.java
+++ b/src/main/java/firefighter/view/Grid.java
@@ -1,13 +1,44 @@
 package firefighter.view;
 
 import javafx.util.Pair;
-import firefighter.model.Position;
+import firefighter.util.Position;
 
 import java.util.List;
 
+/**
+ * This interface represents a generic grid structure for displaying two-dimensional data.
+ *
+ * @param <E> The type of elements stored in the grid.
+ */
 public interface Grid<E> {
-  void repaint(List<Pair<Position,E>> elements);
+
+  /**
+   * Repaint the grid with a list of elements, each associated with their respective positions.
+   *
+   * @param elements A list of pairs, each containing a position and the element to be displayed at that position.
+   */
+  void repaint(List<Pair<Position, E>> elements);
+
+  /**
+   * Repaint the grid with a two-dimensional array of elements. The array's dimensions should match
+   * the row and column count of the grid.
+   *
+   * @param elements A two-dimensional array of elements to be displayed on the grid.
+   */
   void repaint(E[][] elements);
+
+  /**
+   * Get the number of columns in the grid.
+   *
+   * @return The number of columns in the grid.
+   */
   int getColumnCount();
+
+  /**
+   * Get the number of rows in the grid.
+   *
+   * @return The number of rows in the grid.
+   */
   int getRowCount();
 }
+
diff --git a/src/main/resources/firefighter/view/view.fxml b/src/main/resources/firefighter/view/view.fxml
index 9ae1576..cd4d2bd 100644
--- a/src/main/resources/firefighter/view/view.fxml
+++ b/src/main/resources/firefighter/view/view.fxml
@@ -6,10 +6,20 @@
 <?import firefighter.view.FirefighterGrid?>
 
 <?import javafx.scene.control.ToggleButton?>
+<?import javafx.scene.control.Separator?>
+<?import javafx.scene.control.Label?>
 <HBox styleClass="background" stylesheets="@DarkTheme.css"
       xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml"
       fx:controller="firefighter.controller.Controller">
   <VBox>
+    <Separator maxHeight="-Infinity" maxWidth="-Infinity"
+               prefHeight="24.0" prefWidth="200.0"/>
+    <Label maxHeight="-Infinity" maxWidth="-Infinity" alignment="CENTER" prefHeight="24.0" prefWidth="200.0"
+           text="Generation number"/>
+    <Label fx:id="generationNumberLabel" alignment="CENTER" contentDisplay="TEXT_ONLY"
+           maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="24.0" prefWidth="200.0"/>
+    <Separator maxHeight="-Infinity" maxWidth="-Infinity"
+               prefHeight="24.0" prefWidth="200.0"/>
     <Button fx:id="restartButton" maxHeight="-Infinity" maxWidth="-Infinity"
             mnemonicParsing="false" onAction="#restartButtonAction" prefHeight="24.0" prefWidth="200.0"
             text="Restart"/>
-- 
GitLab