diff --git a/src/main/java/edu/ntnu/stud/chaosgame/view/ChaosGameGui.java b/src/main/java/edu/ntnu/stud/chaosgame/view/ChaosGameGui.java index 6a5d009060770077b56e77d745c579a0bcf14791..1db254616a3dc3467dcdadd8587eee3b71087f6f 100644 --- a/src/main/java/edu/ntnu/stud/chaosgame/view/ChaosGameGui.java +++ b/src/main/java/edu/ntnu/stud/chaosgame/view/ChaosGameGui.java @@ -14,6 +14,7 @@ import javafx.animation.Timeline; import javafx.animation.TranslateTransition; import javafx.application.Platform; import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; @@ -21,11 +22,9 @@ import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; -import javafx.scene.layout.BorderPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Region; -import javafx.scene.layout.VBox; +import javafx.scene.layout.*; import javafx.scene.paint.Color; +import javafx.scene.text.Font; import javafx.stage.Stage; import javafx.stage.Window; import javafx.util.Duration; @@ -149,7 +148,14 @@ public ChaosGameGui(Stage primaryStage) throws IOException { scene.heightProperty().addListener((observable, oldValue, newValue) -> { resizeCanvas(); - });} + }); + +// Bind the width of the sideMenu to the width of the scene +sideMenu.prefWidthProperty().bind(scene.widthProperty().multiply(0.2)); // 20% of the scene width + +// Bind the height of the sideMenu to the height of the scene +sideMenu.prefHeightProperty().bind(scene.heightProperty()); +} /** * Initialize the components of the GUI. */ @@ -285,7 +291,18 @@ public ChaosGameGui(Stage primaryStage) throws IOException { */ private void initializeSideMenu() { - // Create Buttons + // Create a Border style + Border blackBorder = new Border(new BorderStroke(Color.BLACK, + BorderStrokeStyle.SOLID, + new CornerRadii(10), + new BorderWidths(5))); + + // Create Canvas Header + Label canvasLabel = new Label("Play Controls"); + canvasLabel.setAlignment(Pos.CENTER); + canvasLabel.setFont(new Font("Arial",20)); + + // Create Canvas Buttons this.startButton = new Button("Start"); this.stopButton = new Button("Stop"); this.newButton = new Button("New"); @@ -312,23 +329,43 @@ public ChaosGameGui(Stage primaryStage) throws IOException { // Parameters VBox parameterBox = new VBox(); VBox controlButtonBox = new VBox(); + controlButtonBox.setBorder(blackBorder); + controlButtonBox.setPadding(new Insets(5,5,5,5)); VBox radioButtonBox = new VBox(); + radioButtonBox.setBorder(blackBorder); + radioButtonBox.setPadding(new Insets(5,5,5,5)); VBox bottomButtonBox = new VBox(); // Step Count GUI VBox stepCountBox = new VBox(); Label stepCountLabel = new Label("Step Count"); + stepCountLabel.setFont(new Font("Arial",20)); + stepCountLabel.setAlignment(Pos.CENTER); this.stepCountTextField = new TextField(); - this.stepCountTextField.setTextFormatter(Formatter.getIntFormatter()); // Set formatter + this.stepCountTextField.setTextFormatter(Formatter.getIntFormatter()); stepCountTextField.setPrefHeight(5); stepCountTextField.setPrefWidth(50); stepCountBox.getChildren().addAll(stepCountLabel,stepCountTextField); + stepCountBox.setAlignment(Pos.CENTER); + stepCountBox.setPadding(new Insets(5,5,5,5)); + stepCountBox.setBorder(blackBorder); + + // Create a Box for Coordinate Controls + VBox coordinateControlBox = new VBox(); + coordinateControlBox.setPadding(new Insets(5, 5, 5, 5)); + + + // Coordinate Control GUI + Label coordinateHeader = new Label("Coordinate Control"); + coordinateHeader.setFont(new Font("Arial", 20)); + coordinateHeader.setAlignment(Pos.CENTER); + coordinateControlBox.getChildren().add(coordinateHeader); // Minimum Coordinates GUI - VBox minCoordinatesBox = new VBox(); - Label minCoordinatesLabel = new Label("Min. Coordinates"); + Label minCoordinatesLabel = new Label("Min. Coordinates"); + VBox minCoordinatesBox = new VBox(); TextField minimumCoordinatesTextFieldX = createCoordinateTextField("x"); TextField minimumCoordinatesTextFieldY = createCoordinateTextField("y"); @@ -354,51 +391,80 @@ public ChaosGameGui(Stage primaryStage) throws IOException { Tooltip.install(changeMaximumCoordinatesButton,changeMaximumCoordinatesButtonTooltip); maxCoordinatesBox.getChildren().addAll(maxCoordinatesLabel, maxCoordsHBox,changeMaximumCoordinatesButton); + coordinateControlBox.getChildren().addAll(minCoordinatesBox,maxCoordinatesBox); + coordinateControlBox.setAlignment(Pos.CENTER); + coordinateControlBox.setBorder(blackBorder); + + Label colorHeaderLabel = new Label("Color Control"); + colorHeaderLabel.setFont(new Font("Arial",20)); + colorHeaderLabel.setAlignment(Pos.CENTER); + VBox colorVBox = new VBox(); HBox colorBox = new HBox(); - Label colorLabel = new Label("Use color"); + Label colorLabel = new Label("Show Redrawn Pixels"); this.colorCheckBox = new CheckBox(); Tooltip colorCheckBoxTooltip = new Tooltip("Change pixel color for pixels drawn multiple times"); Tooltip.install(colorCheckBox,colorCheckBoxTooltip); Region colorRegion = new Region(); colorRegion.setMinWidth(30); colorBox.getChildren().addAll(colorCheckBox, colorRegion, colorLabel); + colorVBox.setPadding(new Insets(5,5,5,5)); + colorVBox.getChildren().addAll(colorHeaderLabel,colorBox); + colorVBox.setAlignment(Pos.CENTER); + colorVBox.setBorder(blackBorder); Region separator1 = new Region(); separator1.setMinHeight(10); Region separator2 = new Region(); separator2.setMinHeight(10); + //Create spacing + Region space = new Region(); + Region spacer = new Region(); + space.setMinHeight(10); + spacer.setMinHeight(10); + // Fill parameter box - parameterBox.getChildren().addAll(stepCountBox, minCoordinatesBox, maxCoordinatesBox); + parameterBox.getChildren().addAll(stepCountBox, spacer, coordinateControlBox); parameterBox.setPadding(new Insets(10)); // Add basic control buttons - controlButtonBox.getChildren().addAll(startButton,stopButton,newButton,clearButton); + controlButtonBox.getChildren().addAll(canvasLabel,startButton, stopButton,newButton,clearButton); + controlButtonBox.setAlignment(Pos.CENTER); controlButtonBox.setSpacing(5); sideMenu.getChildren().add(controlButtonBox); // Add spacing - Region space = new Region(); - space.setMinHeight(10); sideMenu.getChildren().add(space); - // Add fractal radio buttons - radioButtonBox.getChildren().addAll(sierpinskiRadioButton, barnsleyRadioButton, juliaRadioButton, + + + //Radio Button header label + Label chaosGameTypeLabel = new Label("Chaos Game Selection"); + chaosGameTypeLabel.setFont(new Font("Arial",20)); + chaosGameTypeLabel.setAlignment(Pos.CENTER); + // Add fractal radio buttons + radioButtonBox.getChildren().addAll(chaosGameTypeLabel,sierpinskiRadioButton, barnsleyRadioButton, juliaRadioButton, improvedBarnsleyButton); radioButtonBox.setSpacing(5); sideMenu.getChildren().add(radioButtonBox); - sideMenu.getChildren().addAll(separator1, colorBox, separator2); + sideMenu.getChildren().addAll(separator1, colorVBox, separator2); //this.initializeColorButtonHandler(); // Add parameter VBox sideMenu.getChildren().add(parameterBox); // Add file buttons and quit button - bottomButtonBox.getChildren().addAll(loadFractalFromFileButton,writeFractalToFileButton,quitButton); + Label menuButtonLabel = new Label("Menu Controls"); + menuButtonLabel.setFont(new Font("Arial",20)); + menuButtonLabel.setAlignment(Pos.CENTER); + bottomButtonBox.getChildren().addAll(menuButtonLabel,loadFractalFromFileButton,writeFractalToFileButton,quitButton); bottomButtonBox.setSpacing(5); + bottomButtonBox.setBorder(blackBorder); + bottomButtonBox.setAlignment(Pos.CENTER); + bottomButtonBox.setPadding(new Insets(5,5,5,5)); sideMenu.getChildren().add(bottomButtonBox); // Add padding @@ -420,7 +486,7 @@ public ChaosGameGui(Stage primaryStage) throws IOException { VBox rightVBox = new VBox(); rightVBox.getChildren().addAll(sideMenuButtonBox, sideMenu); - this.sideMenu.setStyle("-fx-background-color: lightgrey; -fx-background-radius: 3;"); + this.sideMenu.setStyle("-fx-background-color: lightblue; -fx-background-radius: 5;"); this.borderPane = new BorderPane(); this.borderPane.setCenter(imageView);