From 3fef91402381f81162086546e7cc89ca33cc9bf6 Mon Sep 17 00:00:00 2001
From: Nimrod Abramovich <grumpydormin@gmail.com>
Date: Fri, 28 Feb 2020 17:32:47 +0000
Subject: [PATCH] Created GameState class and started with undo/redo

---
 bin/coursework/GameState.class | Bin 0 -> 871 bytes
 bin/coursework/Main.class      | Bin 13673 -> 16710 bytes
 src/coursework/GameState.java  |  25 ++++++++++
 src/coursework/Main.java       |  87 ++++++++++++++++++++++++++++++---
 4 files changed, 106 insertions(+), 6 deletions(-)
 create mode 100644 bin/coursework/GameState.class
 create mode 100644 src/coursework/GameState.java

diff --git a/bin/coursework/GameState.class b/bin/coursework/GameState.class
new file mode 100644
index 0000000000000000000000000000000000000000..05a8e904dce51e954e51bf717fb058b235294275
GIT binary patch
literal 871
zcmX^0Z`VEs1_l!bb#?|OMh21O{L-T0)bjkIY<>5{+|=Nb#FA8Y1{OvJfvm)`ME#t^
zymWp4q^#8B5=I8D^rFm^u*96w)M7>k;b<R(ir|u>%)E4KMg}&U%)HDJJ4OaE4J`7S
zVT=qc&iN^+Tnx+%+&m2I3_Oes%o>_uoD7T%d^`-S3~Y=H{63j^seYxoNvTC4iAg!B
zj0{3P`N@enVTnbVAU;%(r6eP>n2|xu2b&M985wxeQ%m4JVq_52(8S^(Mh4;Z)Dq{?
zqN3D1WYuO+*QZtJ7bmCYrRpc==am%Y=jex|R+PA9rskwrV>6DOK>{V<Ai=`LAjKfV
z&LGXmAO{LD+-CAH$TG+=GO(womVoSGWDwEN#1_chpm>0UP%$HeBE(;~jkRWEV9aJ@
zVDw~U;0-QGOwRUAEC2^0J1Drhg7Zs@l2hF>K_Sft4>3KEQyCN)7#Wxu7#J8Cm_U)k
zz`(%Fz{tSPz`?-Cz{$YC;Ksnjz{J47z@@dFflEt!D+BLF1_lNu27U$x20pM(P6ieR
zE(T5pZUzAc1_m*RY6d|DAqEiO0-MUnz{nuXAOba0p8>>YU|`kS!oa%$ZX6o}BiK-o
zF+5;4E7TZH22lnvsODM*7O=JQ0xEkM#C@1;moxBd%V^0MZDWuOZee1S(cZW4|3__*
zvCLpsiZQS<Ffa%)urUZTa5IQ7h%g8<$TEn5U8?{wib0-1fq{X6jX@IXS`G$L21N!X
c1||k&klz`Y{xWd0GpI0fGcYo!f*q^|0H(FM;Q#;t

literal 0
HcmV?d00001

diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class
index ed2ce99b3a07ae04a7b79c6a058d9939fb40ebf8..d732c086f0f50b0b91218527463bd8a5593b2706 100644
GIT binary patch
literal 16710
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

delta 8025
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
P#URPV!NkNgn?Vu)A6X}E

diff --git a/src/coursework/GameState.java b/src/coursework/GameState.java
new file mode 100644
index 0000000..092aa5e
--- /dev/null
+++ b/src/coursework/GameState.java
@@ -0,0 +1,25 @@
+package coursework;
+
+import javafx.scene.control.TextField;
+
+public class GameState {
+
+	private String[] gridValues;
+	
+	public GameState(String[] gridValues) {
+		this.gridValues = gridValues;
+	}
+	
+	public String[] getGameState() {
+		return gridValues;
+	}
+	
+	public static String[] getCurrentGameState(TextField[] gridNumbers) {
+		String[] gridValues = new String[Main.N*Main.N];
+		for (int k = 0; k < gridValues.length; k++) {
+			gridValues[k] = gridNumbers[k].getText();
+		}
+		return gridValues;
+	}
+	
+}
diff --git a/src/coursework/Main.java b/src/coursework/Main.java
index 7a28ea1..417ce75 100644
--- a/src/coursework/Main.java
+++ b/src/coursework/Main.java
@@ -5,6 +5,9 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
+import java.util.List;
+import java.util.Stack;
+import java.util.Vector;
 
 import javafx.application.*;
 import javafx.event.EventHandler;
@@ -13,7 +16,10 @@ import javafx.geometry.Pos;
 import javafx.scene.Group;
 import javafx.scene.Node;
 import javafx.scene.Scene;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.Button;
+import javafx.scene.control.ButtonType;
 import javafx.scene.control.Label;
 import javafx.scene.control.TextField;
 import javafx.scene.image.Image;
@@ -49,6 +55,13 @@ public class Main extends Application {
 	private boolean isWider;
 	private HBox previousHBox = null;
 	private Square previousSquare = null;
+	private boolean clearing = false;
+	
+	private Stack<GameState> undoStack = new Stack<GameState>();
+	private Stack<GameState> redoStack = new Stack<GameState>();
+	
+	private Button undoButton;
+	private Button redoButton;
 	
 	private GridPane setupGrid() {
 		GridPane gridPane = new GridPane();
@@ -75,6 +88,15 @@ public class Main extends Application {
 		gridPane.add(group, j, i);
 		gridPane.add(hbox, j, i);
 		
+		textField.textProperty().addListener((observable, oldValue, newValue) -> {
+			if (!clearing) {
+				undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
+				if (undoButton.isDisabled()) {
+					undoButton.setDisable(false);
+				}
+			}
+		});
+		
 		square.getRectangle().toFront();
 		return gridPane;
 	}
@@ -170,14 +192,54 @@ public class Main extends Application {
 		new Cage(ids, value, operator);
 	}
 	
+	
+	private void updateGameState(GameState gameState) {
+		String[] gameValues = gameState.getGameState();
+		for (int i = 0; i < gridNumbers.length; i++) {
+//			if (!gridNumbers[i].getText().equals("") && gameValues.equals(""))
+//				System.out.println("Current: " + gridNumbers[i].getText() + ", Previous: " + textFields[i].getText());
+			gridNumbers[i].setText(gameValues[i]);
+		}
+	}
+	
 	private HBox setupBottomHBox() {
 		HBox bottomHBox = new HBox();
 		bottomHBox.setSpacing(10);
 		bottomHBox.setAlignment(Pos.TOP_CENTER);
 		
-		Button undoButton = new Button("", new ImageView(new Image("file:Images/undo_icon.png")));
-		Button redoButton = new Button("", new ImageView(new Image("file:Images/redo_icon.png")));
+		undoButton = new Button("", new ImageView(new Image("file:Images/undo_icon.png")));
+		redoButton = new Button("", new ImageView(new Image("file:Images/redo_icon.png")));
 		Button clearButton = new Button("Clear");
+		undoButton.setOnAction(e -> {
+			// undoStack.pop() is the current GameState
+						
+			redoStack.push(undoStack.pop());
+			updateGameState(undoStack.peek());
+			
+			// 
+			if (!redoStack.empty()) {
+				redoButton.setDisable(false);
+			}
+			if (undoStack.size() == 1) {
+				undoButton.setDisable(true);
+			}
+		});
+		redoButton.setOnAction(e -> {
+			GameState gameState = redoStack.pop();
+			updateGameState(gameState);
+		
+			undoStack.push(gameState);
+			
+			if (!undoStack.empty()) {
+				undoButton.setDisable(false);
+			}
+			if (redoStack.empty()) {
+				redoButton.setDisable(true);
+			}
+		});
+		
+		undoButton.setDisable(true);
+		redoButton.setDisable(true);
 		clearButton.setPrefHeight(36);
 		clearButton.setPrefWidth(120);
 		clearButtonClickEvent(clearButton);
@@ -194,14 +256,26 @@ public class Main extends Application {
 			hbox.setStyle("-fx-border-color:red; -fx-border-width:2px;");
 			previousHBox = hbox;
 			previousSquare = square;
+			for (TextField textField : gridNumbers) {
+				textField.deselect();
+			}
 		});
 	}
 	
-	private void clearButtonClickEvent(Button clearButton) {
+	private void clearButtonClickEvent(Button clearButton) {		
 		clearButton.setOnAction(e -> {
-			for (TextField textField : gridNumbers) {
-				textField.setText("");
-			}
+			clearing = true;
+			undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
+			Alert alert = new Alert(AlertType.CONFIRMATION);
+			alert.setContentText("Are you sure you wish to clear the board?");
+			alert.showAndWait().ifPresent(type -> {
+				if (type == ButtonType.OK) {
+					for (TextField textField : gridNumbers) {
+						textField.setText("");
+					}
+				}
+			});;
+			clearing = false;
 		});
 	}
 	
@@ -284,6 +358,7 @@ public class Main extends Application {
 		vBox.setAlignment(Pos.CENTER);
 		
 		GridPane gridPane = setupGrid();
+		undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
 		
 		HBox topHBox = setupTopHBox();
 		HBox centerHBox = setupCenterHBox();
-- 
GitLab