Skip to content
Snippets Groups Projects
ChaosGameGui.java 21 KiB
Newer Older
Magnus Eik's avatar
Magnus Eik committed
package edu.ntnu.stud.chaosgame.view;

import edu.ntnu.stud.chaosgame.controller.game.ChaosCanvas;
import edu.ntnu.stud.chaosgame.controller.game.ChaosGame;
import edu.ntnu.stud.chaosgame.controller.game.ChaosGameDescription;
import edu.ntnu.stud.chaosgame.controller.game.GuiButtonController;
import edu.ntnu.stud.chaosgame.controller.utility.Formatter;
import edu.ntnu.stud.chaosgame.model.data.Vector2D;
Magnus Eik's avatar
Magnus Eik committed
import edu.ntnu.stud.chaosgame.model.generators.ChaosGameDescriptionFactory;

import javafx.animation.Timeline;
import javafx.animation.TranslateTransition;
import javafx.geometry.Insets;
Magnus Eik's avatar
Magnus Eik committed
import javafx.geometry.Pos;
Magnus Eik's avatar
Magnus Eik committed
import javafx.scene.Scene;
import javafx.scene.control.*;
Magnus Eik's avatar
Magnus Eik committed
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
Håvard Daleng's avatar
Håvard Daleng committed

Magnus Eik's avatar
Magnus Eik committed
import javafx.scene.image.WritableImage;
Magnus Eik's avatar
Magnus Eik committed
import javafx.scene.layout.*;
Magnus Eik's avatar
Magnus Eik committed
import javafx.scene.paint.Color;
Magnus Eik's avatar
Magnus Eik committed
import javafx.scene.text.Font;
Håvard Daleng's avatar
Håvard Daleng committed

import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;

Magnus Eik's avatar
Magnus Eik committed
import javafx.stage.Stage;
import javafx.stage.Window;
Magnus Eik's avatar
Magnus Eik committed
import javafx.scene.control.ToolBar;
Magnus Eik's avatar
Magnus Eik committed
import javax.tools.Tool;
Magnus Eik's avatar
Magnus Eik committed
import java.io.IOException;
Håvard Daleng's avatar
Håvard Daleng committed
// todo: look through GUI and get rid of redundancies, clean up code
public class ChaosGameGui implements ChaosGameObserver {
Håvard Daleng's avatar
Håvard Daleng committed
  private int currentLine = 0;

Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * The primary stage for the GUI.
   */
  private Stage primaryStage;

Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * The aspect ratio of the GUI.
   */
  private double aspectRatio;

Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * The canvas for this GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * The ChaosCanvas for this GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The ChaosGameDescription.
   */
  private ChaosGameDescription description;

  /**
   * The ChaosGameDescriptionFactory.
   */
  private ChaosGameDescriptionFactory factory;

  /**
   * The ImageView for the GUI..
   */
  private ChaosGameImageView imageView;
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The Scene for the GUI..
   */
  private Scene scene;

  /**
Håvard Daleng's avatar
Håvard Daleng committed
   * The width of the GUI.
Håvard Daleng's avatar
Håvard Daleng committed
   */
  private int width;
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The height of the GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  private int height;

  /**
   * The ChaosGame for this GUI.
   */
  private ChaosGame game;

  /**
   * The Timeline for the GUI.
   */
  private Timeline timeline;

  /**
   * The BorderPane for the GUI.
   */
  private BorderPane borderPane;

  /**
   * The side menu for the GUI.
   */
  private VBox sideMenu;

  /**
   * The start, stop, new, clear, quit and show sidebar buttons for the GUI.
Håvard Daleng's avatar
Håvard Daleng committed
   */
  private Button startButton;
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The stop button for the GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  private Button stopButton;
Håvard Daleng's avatar
Håvard Daleng committed


  /**
   * The button for clearing
   */
Håvard Daleng's avatar
Håvard Daleng committed
  private Button clearButton;
Håvard Daleng's avatar
Håvard Daleng committed

Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * The quit button for the GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  private Button quitButton;
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The side menu button for the GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The load fractal from file and write fractal to file buttons for the GUI.
   */
  private Button loadFractalFromFileButton;
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The write fractal to file button for the GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  private Button writeFractalToFileButton;

  /**
   * The radio buttons for the fractal type for the GUI.
   */
  private RadioButton sierpinskiRadioButton;
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The Barnsley radio button.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  private RadioButton barnsleyRadioButton;
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The Julia radio button.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  private RadioButton juliaRadioButton;
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * The improved Barnsley radio button.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  private RadioButton improvedBarnsleyButton;

Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * The step count text field for the GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * The color check box for the GUI.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * The controller for the GUI.
   */
  private GuiButtonController controller;
Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * Constructor for the ChaosGameGui.
   *
   * @param primaryStage the primary stage for the GUI.
   * @throws IOException if the GUI fails to initialize.
   */
Håvard Daleng's avatar
Håvard Daleng committed
  public ChaosGameGui(Stage primaryStage) throws IOException {
    this.primaryStage = primaryStage;
    this.initializeComponents();
    this.initializeGameComponents();
    this.controller = new GuiButtonController(game, this); // Initialize controller here

      primaryStage.setTitle("Fractal Chaos Game");
      primaryStage.setScene(scene);
      primaryStage.setOnShown(event -> this.imageView.requestFocus());
      primaryStage.show();
    // Initialize aspect ratio based on initial dimensions
    this.aspectRatio = (double) width / height;

    // Add listeners to handle window size changes
    scene.widthProperty().addListener((observable, oldValue, newValue) -> {
      resizeCanvas();
    });


  scene.heightProperty().addListener((observable, oldValue, newValue) -> {
    resizeCanvas();
Magnus Eik's avatar
Magnus Eik committed
  });

// 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());
}
Håvard Daleng's avatar
Håvard Daleng committed


Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * Initialize the components of the GUI.
   */
  private void initializeComponents() {

    // Timeline
    //this.timeline = new Timeline(new KeyFrame(Duration.seconds(0.05), event -> controller.drawChaosGame()));
Håvard Daleng's avatar
Håvard Daleng committed
    this.initializeImageView();

    //this.initializeMainButtons();
Håvard Daleng's avatar
Håvard Daleng committed
    this.initializeFractalButtons();
    this.initializeSideMenu();

    this.scene = new Scene(this.borderPane,1700,1000);
  }
/**
 * Creates a TextField of specific size.
 */
  private TextField createCoordinateTextField(String promptText) {
    TextField textField = new TextField();
    textField.setPrefHeight(5);
    textField.setPrefWidth(90);
    textField.setPromptText(promptText);
    return textField;
  }
Håvard Daleng's avatar
Håvard Daleng committed

  /**
   * Initialize the components related to the chaos game itself.
   */
  private void initializeGameComponents() {
    // Description
    this.factory = new ChaosGameDescriptionFactory();
    this.description = factory.getDescriptions().get(0);
Håvard Daleng's avatar
Håvard Daleng committed
    this.chaosCanvas = new ChaosCanvas(1000, 1000, this.description.getMinCoords(),
    game = new ChaosGame(this.description, chaosCanvas);
    //controller.startGame(); // Start the game after it's created
}
Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * Initialize components related to the image view and zoom function.
   */
  private void initializeImageView() {
    // Image view
    this.imageView = new ChaosGameImageView(this);
Håvard Daleng's avatar
Håvard Daleng committed
    width = 1000;
    height = 1000;
    this.canvas = new Canvas(width, height);
    //this.imageView.setImage(canvas.snapshot(null, null));
    canvas.widthProperty().bind(imageView.fitWidthProperty());
    canvas.heightProperty().bind(imageView.fitHeightProperty());


   * Color the entire image view white.
  public void clearImageView() {
    GraphicsContext gc = canvas.getGraphicsContext2D();
    gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
    imageView.setImage(null);
Håvard Daleng's avatar
Håvard Daleng committed
  }

  /**
   * Initialize the buttons related to managing the fractals.
   */
  private void initializeFractalButtons() {

    // Radio buttons for choosing fractal type
    ToggleGroup group = new ToggleGroup();
    this.sierpinskiRadioButton = new RadioButton("Sierpinski");
    sierpinskiRadioButton.setToggleGroup(group);
    //sierpinskiRadioButton.setSelected(true);
Håvard Daleng's avatar
Håvard Daleng committed
    this.barnsleyRadioButton = new RadioButton("Barnsley");
    barnsleyRadioButton.setToggleGroup(group);
    this.juliaRadioButton = new RadioButton("Julia");
    juliaRadioButton.setToggleGroup(group);
    this.improvedBarnsleyButton = new RadioButton("Improved Barnsley");
    improvedBarnsleyButton.setToggleGroup(group);

Magnus Eik's avatar
Magnus Eik committed
    // Load fractal file button and tooltip
Håvard Daleng's avatar
Håvard Daleng committed
    this.loadFractalFromFileButton = new Button("Load Fractal");
Magnus Eik's avatar
Magnus Eik committed
    Tooltip loadFractalFromFileButtonTooltip = new Tooltip("Load a text file describing a new fractal chaos game");
    Tooltip.install(loadFractalFromFileButton,loadFractalFromFileButtonTooltip);
    // Write fractal to file button and tooltip
Håvard Daleng's avatar
Håvard Daleng committed
    this.writeFractalToFileButton = new Button("Write to File");
Magnus Eik's avatar
Magnus Eik committed
    Tooltip writeFractalToFileButtonTooltip = new Tooltip("Write a text file defining the current fractal chaos game to chosen location");
    Tooltip.install(writeFractalToFileButton, writeFractalToFileButtonTooltip);
Håvard Daleng's avatar
Håvard Daleng committed
  }

  /**
   * Initialize the side menu.
   */
  private void initializeSideMenu() {
Magnus Eik's avatar
Magnus Eik committed
    // 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");
Håvard Daleng's avatar
Håvard Daleng committed
    this.clearButton = new Button("New");
    this.quitButton = new Button("Quit");
Magnus Eik's avatar
Magnus Eik committed
    //this.sideMenuButton = new Button("Side Menu");

    // Create Tooltips
    Tooltip startButtonTooltip = new Tooltip("Starts drawing the current fractal from the selected chaos game");
    Tooltip stopButtonTooltip = new Tooltip("Pause drawing current fractal");
    Tooltip clearButtonTooltip = new Tooltip("Clear the current fracal");
    Tooltip quitButtonTooltip = new Tooltip("Quit the application");

    // Attach Tooltips to Buttons
    Tooltip.install(startButton,startButtonTooltip);
    Tooltip.install(stopButton,stopButtonTooltip);
    Tooltip.install(clearButton,clearButtonTooltip);
    Tooltip.install(quitButton, quitButtonTooltip);
Håvard Daleng's avatar
Håvard Daleng committed
    this.sideMenu = new VBox();
Håvard Daleng's avatar
Håvard Daleng committed
    //this.sideMenu.setAlignment(Pos.CENTER);
Håvard Daleng's avatar
Håvard Daleng committed
    // Parameters
    VBox parameterBox = new VBox();
    VBox controlButtonBox = new VBox();
Magnus Eik's avatar
Magnus Eik committed
    controlButtonBox.setBorder(blackBorder);
    controlButtonBox.setPadding(new Insets(5,5,5,5));
    VBox radioButtonBox = new VBox();
Magnus Eik's avatar
Magnus Eik committed
    radioButtonBox.setBorder(blackBorder);
    radioButtonBox.setPadding(new Insets(5,5,5,5));
    VBox bottomButtonBox = new VBox();
Håvard Daleng's avatar
Håvard Daleng committed
    // Step Count GUI
    VBox stepCountBox = new VBox();
    Label stepCountLabel = new Label("Step Count");
Magnus Eik's avatar
Magnus Eik committed
    stepCountLabel.setFont(new Font("Arial",20));
    stepCountLabel.setAlignment(Pos.CENTER);
Håvard Daleng's avatar
Håvard Daleng committed
    this.stepCountTextField.setTextFormatter(Formatter.getIntFormatter()); // Set formatter
    Formatter.limitTextFieldSize(stepCountTextField, 6);
    stepCountTextField.setPrefHeight(5);
    stepCountTextField.setPrefWidth(50);

    stepCountBox.getChildren().addAll(stepCountLabel,stepCountTextField);
Magnus Eik's avatar
Magnus Eik committed
    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);
Håvard Daleng's avatar
Håvard Daleng committed
    // Minimum Coordinates GUI
Magnus Eik's avatar
Magnus Eik committed
    Label minCoordinatesLabel = new Label("Min. Coordinates");
    VBox minCoordinatesBox = new VBox();
    TextField minimumCoordinatesTextFieldX = createCoordinateTextField("x");

    TextField minimumCoordinatesTextFieldY = createCoordinateTextField("y");

    HBox minCoordsHBox = new HBox();
    minCoordsHBox.getChildren().addAll(minimumCoordinatesTextFieldX,minimumCoordinatesTextFieldY);
Håvard Daleng's avatar
Håvard Daleng committed
    Button changeMinimumCoordinatesButton = new Button("Change Min. Coordinates");
Magnus Eik's avatar
Magnus Eik committed
    Tooltip changeMinimumCoordinatesButtonTooltip = new Tooltip("Change the minimum x and y coordinates for the fractal");
    Tooltip.install(changeMinimumCoordinatesButton,changeMinimumCoordinatesButtonTooltip);
    minCoordinatesBox.getChildren().addAll(minCoordinatesLabel, minCoordsHBox,
         changeMinimumCoordinatesButton);
Håvard Daleng's avatar
Håvard Daleng committed
    // Maximum Coordinates GUI
    VBox maxCoordinatesBox = new VBox();
    Label maxCoordinatesLabel = new Label("Max Coordinates");
    TextField maximumCoordinatesTextFieldX = createCoordinateTextField("x");
    TextField maximumCoordinatesTextFieldY = createCoordinateTextField("y");

    HBox maxCoordsHBox = new HBox();
    maxCoordsHBox.getChildren().addAll(maximumCoordinatesTextFieldX,maximumCoordinatesTextFieldY);
Håvard Daleng's avatar
Håvard Daleng committed
    Button changeMaximumCoordinatesButton = new Button("Change Max Coordinates");
Magnus Eik's avatar
Magnus Eik committed
    Tooltip changeMaximumCoordinatesButtonTooltip = new Tooltip("Change the maximum x and y coordinates of the fractal");
    Tooltip.install(changeMaximumCoordinatesButton,changeMaximumCoordinatesButtonTooltip);
    maxCoordinatesBox.getChildren().addAll(maxCoordinatesLabel,
        maxCoordsHBox,changeMaximumCoordinatesButton);
Magnus Eik's avatar
Magnus Eik committed
    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();
Magnus Eik's avatar
Magnus Eik committed
    Label colorLabel = new Label("Show Redrawn Pixels");
Magnus Eik's avatar
Magnus Eik committed
    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);
Magnus Eik's avatar
Magnus Eik committed
    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);

Magnus Eik's avatar
Magnus Eik committed
    //Create spacing
    Region space = new Region();
    Region spacer = new Region();
    space.setMinHeight(10);
    spacer.setMinHeight(10);

Håvard Daleng's avatar
Håvard Daleng committed
    // Fill parameter box
Magnus Eik's avatar
Magnus Eik committed
    parameterBox.getChildren().addAll(stepCountBox, spacer, coordinateControlBox);
Håvard Daleng's avatar
Håvard Daleng committed
    parameterBox.setPadding(new Insets(10));

    // Add basic control buttons
Magnus Eik's avatar
Magnus Eik committed
    controlButtonBox.setAlignment(Pos.CENTER);
Håvard Daleng's avatar
Håvard Daleng committed
    controlButtonBox.getChildren().addAll(canvasLabel,startButton, stopButton,clearButton);

Håvard Daleng's avatar
Håvard Daleng committed

    controlButtonBox.setSpacing(5);
    sideMenu.getChildren().add(controlButtonBox);

    // Add spacing
    sideMenu.getChildren().add(space);
Håvard Daleng's avatar
Håvard Daleng committed
    sideMenu.getChildren().addAll(startButton,stopButton, clearButton);
Magnus Eik's avatar
Magnus Eik committed


    //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);
Magnus Eik's avatar
Magnus Eik committed
    sideMenu.getChildren().addAll(separator1, colorVBox, separator2);
    //this.initializeColorButtonHandler();
Håvard Daleng's avatar
Håvard Daleng committed
    // Add parameter VBox
    sideMenu.getChildren().add(parameterBox);
    // Add file buttons and quit button
Magnus Eik's avatar
Magnus Eik committed
    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);
Magnus Eik's avatar
Magnus Eik committed
    bottomButtonBox.setBorder(blackBorder);
    bottomButtonBox.setAlignment(Pos.CENTER);
    bottomButtonBox.setPadding(new Insets(5,5,5,5));
    sideMenu.getChildren().add(bottomButtonBox);
Håvard Daleng's avatar
Håvard Daleng committed
    // Add padding
    sideMenu.setPadding(new Insets(10));

    // Create split pane and button to toggle sidebar
    this.sideMenuButton = new Button(">>");
Magnus Eik's avatar
Magnus Eik committed
    Tooltip sideMenuButtonTooltip = new Tooltip("Hide/Unhide menu");
    Tooltip.install(sideMenuButton, sideMenuButtonTooltip);
    this.initializeSideButtonHandler();
    Region sideMenuButtonRegion = new Region();
    sideMenuButtonRegion.setMinWidth(200);
    HBox sideMenuButtonBox = new HBox();
    sideMenuButtonBox.getChildren().addAll(sideMenuButtonRegion, sideMenuButton);

    // The right VBox containing both the sidebar and the sidebar toggle button.
    VBox rightVBox = new VBox();

    rightVBox.getChildren().addAll(sideMenuButtonBox, sideMenu);
Magnus Eik's avatar
Magnus Eik committed
    this.sideMenu.setStyle("-fx-background-color: lightblue; -fx-background-radius: 5;");
Håvard Daleng's avatar
Håvard Daleng committed
    this.borderPane = new BorderPane();
    this.borderPane.setCenter(imageView);
    this.borderPane.setRight(rightVBox);
Håvard Daleng's avatar
Håvard Daleng committed
    imageView.setFocusTraversable(true);
    rightVBox.setFocusTraversable(false);
Håvard Daleng's avatar
Håvard Daleng committed
    borderPane.setFocusTraversable(false);

  /**
   * Initialise the side bar button handler, allowing the user
   * to show or hide the right sidebar.
   */
  private void initializeSideButtonHandler() {
    TranslateTransition openNav = new TranslateTransition(new Duration(350), sideMenu);
    openNav.setToX(0);
    TranslateTransition closeNav = new TranslateTransition(new Duration(350), sideMenu);

    this.sideMenuButton.setOnAction(e -> {
      if(sideMenu.getTranslateX() != 0){
        this.sideMenuButton.setText(">>");
        openNav.play();
      } else {
        closeNav.setToX(sideMenu.getWidth());
        closeNav.play();
        this.sideMenuButton.setText("<<");
      }
    });
  }

  /**
   * Initialize the color button handler.
   */
  private void initializeColorButtonHandler() {
    this.colorCheckBox.setOnAction(event -> {
      controller.game.setUseColor(colorCheckBox.isSelected());
  /**
   * Get the chaos canvas of this GUI view.
   *
   * @return the canvas.
   */
  public ChaosCanvas getChaosCanvas() {
    return this.chaosCanvas;
Håvard Daleng's avatar
Håvard Daleng committed
  public int getWidth(){
    return this.width;
  }
  public int getHeight(){
    return this.height;
  }
  public ImageView getImageView(){
    return this.imageView;
  }

  public void setCurrentLine(int currentLine) {
    this.currentLine = currentLine;
  }

  public void setImageViewFromImage(Image inputView) {
    this.imageView.setImage(inputView);
  }

  /**
   * Update the canvas and set a new zoom factor for the image view based on the ratio
   * between the old and new canvas heights.
   *
   * @param canvas the canvas to update with.
   */
  public void updateCanvas(ChaosCanvas canvas) {
    float zoomRatio = (float) this.chaosCanvas.getHeight() / canvas.getHeight();
    //this.imageView.fixedZoom(zoomRatio); // Set new zoom factor.
    this.chaosCanvas = canvas;
  }

  /**
   * Update which parts of the fractal are rendered and at what level of detail.
   *
   * @param zoomLevel the number of recursive zoom levels.
   * @param centreX the x-coordinate of the centre of the image view.
   * @param centreY the y-coordinate of the centre of the image view.
   */
  public void updateDetail(int zoomLevel, double centreX, double centreY) {
    this.clearImageView();
    this.chaosCanvas.clearCanvas();
    this.chaosCanvas.updateCoords(centreX, centreY, zoomLevel);
    controller.game.setCurrentPoint(new Vector2D(centreX, centreY));
Håvard Daleng's avatar
Håvard Daleng committed
  }

  /**
   * Update the observer based on changes to the chaos game.
   * TODO: this method may need to be changed depending on how we implement the UI. The update method may need to be split.
   *
   * @param game the game this observer is monitoring.
   */
  @Override
Håvard Daleng's avatar
Håvard Daleng committed
  public void updateGame(ChaosGame game) {
    controller.drawChaosGame();
  }
  public TextField getStepCountTextField() {
    return this.stepCountTextField;
  }

  public CheckBox getColorCheckBox() {
    return this.colorCheckBox;
  }

Håvard Daleng's avatar
Håvard Daleng committed
  /**
   * Get the canvas for this GUI.
   *
   * @return the canvas.
   */
  public Canvas getCanvas() {
    return this.canvas;
Håvard Daleng's avatar
Håvard Daleng committed

  public Button getStartButton() {
    return this.startButton;
  }
  public Button getStopButton() {
    return this.stopButton;
  }
  public Button getClearButton() {
    return this.clearButton;
  }
Håvard Daleng's avatar
Håvard Daleng committed

  public Button getQuitButton() {
    return this.quitButton;
  }
  public ButtonBase getWriteToFileButton() {
    return this.writeFractalToFileButton;
  }
  public Window getStage() {
    return this.primaryStage;
  }
  public RadioButton getSierpinskiRadioButton() {
    return this.sierpinskiRadioButton;
  }
  public RadioButton getBarnsleyRadioButton() {
    return this.barnsleyRadioButton;
  }
  public RadioButton getJuliaRadioButton() {
    return this.juliaRadioButton;
  }
  public RadioButton getImprovedBarnsleyButton(){
    return this.improvedBarnsleyButton;
  }

  private void resizeCanvas() {
    double newWidth = scene.getWidth() - sideMenu.getWidth();
    double newHeight = scene.getHeight();

    if (newWidth / newHeight > aspectRatio) {
      newWidth = newHeight * aspectRatio;
    } else {
      newHeight = newWidth / aspectRatio;
    }

    // Update imageView size to new calculated dimensions
    imageView.setFitWidth(newWidth);
    imageView.setFitHeight(newHeight);

    // Redraw the fractal to fit the new canvas size
    controller.drawChaosGame();
  }
Håvard Daleng's avatar
Håvard Daleng committed