From def62f54ed71198b24f5f77f94cd1a3171a2f428 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Fri, 3 Jun 2022 22:57:57 +0200
Subject: [PATCH] Add progress / gain indicator

---
 android/gradle.properties  |  4 +--
 lib/layout/game.dart       | 52 ++++++++++++++++++++++++++++++--------
 lib/provider/data.dart     | 22 ++++++++++++++++
 lib/utils/board_utils.dart |  9 +++++++
 4 files changed, 75 insertions(+), 12 deletions(-)

diff --git a/android/gradle.properties b/android/gradle.properties
index 14eed39..aa51064 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.4
-app.versionCode=4
+app.versionName=0.0.5
+app.versionCode=5
diff --git a/lib/layout/game.dart b/lib/layout/game.dart
index 342f1a2..0c70fe6 100644
--- a/lib/layout/game.dart
+++ b/lib/layout/game.dart
@@ -18,16 +18,7 @@ class Game {
         crossAxisAlignment: CrossAxisAlignment.center,
         children: [
           SizedBox(height: 8),
-          Container(
-            child: Text(
-              myProvider.movesCount.toString(),
-              style: TextStyle(
-                fontSize: 40,
-                fontWeight: FontWeight.w600,
-                color: Colors.black,
-              ),
-            ),
-          ),
+          Game.buildTopIndicatorWidget(myProvider),
           SizedBox(height: 2),
           Expanded(
             child: Board.buildGameBoard(myProvider),
@@ -43,6 +34,47 @@ class Game {
     );
   }
 
+  static Widget buildTopIndicatorWidget(Data myProvider) {
+    String progressIndicator = myProvider.progress.toString() + '/' + myProvider.progressTotal.toString();
+
+    if (myProvider.movesCount > 0) {
+      progressIndicator += ' (+' + myProvider.progressDelta.toString() + ')';
+    }
+
+    return Table(
+      children: [
+        TableRow(
+          children: [
+            Column(
+              children: [
+                Text(
+                  myProvider.movesCount.toString(),
+                  style: TextStyle(
+                    fontSize: 40,
+                    fontWeight: FontWeight.w600,
+                    color: Colors.black,
+                  ),
+                ),
+              ]
+            ),
+            Column(
+              children: [
+                Text(
+                  progressIndicator,
+                  style: TextStyle(
+                    fontSize: 20,
+                    fontWeight: FontWeight.w600,
+                    color: Colors.green,
+                  ),
+                ),
+              ]
+            ),
+          ],
+        ),
+      ],
+    );
+  }
+
   static Container buildSelectColorBar(Data myProvider) {
     List cells = myProvider.cells;
 
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 4f044ed..3ecfa09 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -24,6 +24,10 @@ class Data extends ChangeNotifier {
   int _movesCount = 0;
   List _cells = [];
 
+  int _progress = 0;
+  int _progressTotal = 0;
+  int _progressDelta = 0;
+
   String get level => _level;
   void updateLevel(String level) {
     _level = level;
@@ -80,6 +84,7 @@ class Data extends ChangeNotifier {
   int get boardSize => _boardSize;
   void updateBoardSize(int boardSize) {
     _boardSize = boardSize;
+    _progressTotal = boardSize * boardSize;
   }
 
   int get colorsCount => _colorsCount;
@@ -135,6 +140,22 @@ class Data extends ChangeNotifier {
     updateMovesCount(movesCount + 1);
   }
 
+  int get progress => _progress;
+  int get progressTotal => _progressTotal;
+  int get progressDelta => _progressDelta;
+  void updateProgress(int progress) {
+    _progress = progress;
+    notifyListeners();
+  }
+  void updateProgressTotal(int progressTotal) {
+    _progressTotal = progressTotal;
+    notifyListeners();
+  }
+  void updateProgressDelta(int progressDelta) {
+    _progressDelta = progressDelta;
+    notifyListeners();
+  }
+
   bool get gameIsRunning => _gameIsRunning;
   void updateGameIsRunning(bool gameIsRunning) {
     _gameIsRunning = gameIsRunning;
@@ -155,6 +176,7 @@ class Data extends ChangeNotifier {
     _gameIsRunning = false;
     _gameWon = false;
     _movesCount = 0;
+    _progress = 0;
     notifyListeners();
   }
 
diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart
index 6971073..405685c 100644
--- a/lib/utils/board_utils.dart
+++ b/lib/utils/board_utils.dart
@@ -39,15 +39,24 @@ class BoardUtils {
 
     myProvider.resetGame();
     myProvider.updateCells(grid);
+
+    int initProgress = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [[0, 0]]).length;
+    myProvider.updateProgress(initProgress);
   }
 
   static fillBoardFromFirstCell(Data myProvider, int value) {
     List cellsToFill = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [[0, 0]]);
+    int progressBeforeMove = cellsToFill.length;
 
     for (var cellIndex = 0; cellIndex < cellsToFill.length; cellIndex++) {
       myProvider.updateCellValue(cellsToFill[cellIndex][1], cellsToFill[cellIndex][0], value);
     }
 
+    int progressAfterMove = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [[0, 0]]).length;
+    int progressDelta = progressAfterMove - progressBeforeMove;
+    myProvider.updateProgressDelta(progressDelta);
+    myProvider.updateProgress(progressAfterMove);
+
     myProvider.incrementMovesCount();
   }
 
-- 
GitLab