diff --git a/src/main/java/org/example/chaosgame/controller/ChaosGameController.java b/src/main/java/org/example/chaosgame/controller/ChaosGameController.java index 3039c17e017c4f131c117c1670661cb8a10d3e36..568a6048358db757a8b1bbfc35bd0f23d0dff2b8 100644 --- a/src/main/java/org/example/chaosgame/controller/ChaosGameController.java +++ b/src/main/java/org/example/chaosgame/controller/ChaosGameController.java @@ -1,20 +1,32 @@ package org.example.chaosgame.controller; import javafx.scene.Node; -import javafx.scene.control.TextField; +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.FileChooser; +import javafx.util.Pair; import org.example.chaosgame.model.chaos.*; import org.example.chaosgame.controller.observer.GameObserver; import org.example.chaosgame.controller.observer.PageObserver; import org.example.chaosgame.controller.observer.PageSubject; +import org.example.chaosgame.model.linalg.Complex; +import org.example.chaosgame.model.linalg.Vector2D; +import org.example.chaosgame.model.transformations.AffineTransform2D; +import org.example.chaosgame.model.transformations.JuliaTransform; +import org.example.chaosgame.model.transformations.Transform2D; import org.example.chaosgame.view.ChaosPage; +import org.example.chaosgame.view.components.CreateAffineDialog; +import org.example.chaosgame.view.components.CreateJuliaDialog; +import org.example.chaosgame.view.components.DialogUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; public class ChaosGameController implements GameObserver, PageSubject { private final ChaosGame chaosGame; @@ -36,16 +48,15 @@ public class ChaosGameController implements GameObserver, PageSubject { return chaosPage; } - private void updateChaosGame(ChaosGameDescription description){ + private void updateChaosGame(ChaosGameDescription description) { chaosGame.setChaosGameDescription(description); - chaosGame.setChaosCanvas(description.getMinCoords(), description.getMaxCoords()); } - public void gameSelection(String selectedGame){ + public void gameSelection(String selectedGame) { updateChaosGame(ChaosGameDescriptionFactory.get(ChaosGameType.valueOf(selectedGame))); } - public void runStepsValidation(TextField stepsField){ + public void runStepsValidation(TextField stepsField) { String input = stepsField.getText(); try { int steps = Integer.parseInt(input); @@ -57,11 +68,12 @@ public class ChaosGameController implements GameObserver, PageSubject { } catch (NumberFormatException ex) { stepsField.clear(); stepsField.getStyleClass().add("text-field-invalid"); - stepsField.setPromptText("Write a number between 1 - 10 000 000."); + DialogUtils.showErrorDialog("Invalid input", "Please enter a number between 1 - 10 000 000."); + //stepsField.setPromptText("Write a number between 1 - 10 000 000."); } } - public void openFromFile(){ + public void openFromFile() { FileChooser fileChooser = new FileChooser(); fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt")); File selectedFile = fileChooser.showOpenDialog(null); @@ -69,19 +81,101 @@ public class ChaosGameController implements GameObserver, PageSubject { if (selectedFile != null) { try { ChaosGameFileHandler fileHandler = new ChaosGameFileHandler(); - ChaosGameDescription description = fileHandler.readFromFile(selectedFile.getAbsolutePath()); - updateChaosGame(description); - } catch (IOException ex) { - ex.printStackTrace(); + chaosGame.setChaosGameDescription(fileHandler.readFromFile(selectedFile.getAbsolutePath())); + } catch (NumberFormatException ex) { + DialogUtils.showErrorDialog("Error", "Invalid input in the file. Try another file."); + } catch (IOException e) { + DialogUtils.showErrorDialog("Error", "Could not read the file. Try another file."); } } - } +} - public void updateFractalColor(Color color){ + public void updateFractalColor(Color color) { chaosPage.setFractalColor(color); chaosPage.updateCanvas(chaosGame.getCanvas()); } + public void createOwnJuliaFractal() { + CreateJuliaDialog dialog = new CreateJuliaDialog(); + Optional<Pair<String, String>> result = dialog.showAndWait(); + String errorTitle = "Invalid input"; + String errorMessage = "Please enter a double between -1 and 1. No letters are allowed."; + + if (result.isPresent()) { + Pair<String, String> userInput = result.get(); + try { + double real = Double.parseDouble(userInput.getKey()); + double imaginary = Double.parseDouble(userInput.getValue()); + + if (real < -1 || real > 1 || imaginary < -1 || imaginary > 1) { + DialogUtils.showErrorDialog(errorTitle, errorMessage); + } else { + chaosGame.setChaosGameDescription(new ChaosGameDescription( + new Vector2D(-1.6, -1), + new Vector2D(1.6, 1.0), + List.of(new JuliaTransform(new Complex(real, imaginary), 1)))); + } + } catch (NumberFormatException ex) { + DialogUtils.showErrorDialog(errorTitle, errorMessage); + } + } + } + + public void createOwnAffineFractal() { + CreateAffineDialog dialog = new CreateAffineDialog(); + Optional<List<AffineTransform2D>> result = dialog.showAndWait(); + String errorTitle = "Invalid input"; + String errorMessage = "Please enter a valid number."; + + if (result.isPresent()) { + List<AffineTransform2D> transformations = result.get(); + List<Transform2D> transforms = new ArrayList<>(transformations); + chaosGame.setChaosGameDescription(new ChaosGameDescription( + new Vector2D(0, 0), + new Vector2D(1.0, 1.0), + transforms)); + } else { + DialogUtils.showErrorDialog(errorTitle, errorMessage); + } + } + + public void updateJuliaImValue(double reValue, double imValue) { + + chaosGame.setChaosGameDescription(new ChaosGameDescription( + new Vector2D(-1.6, -1), + new Vector2D(1.6, 1.0), + List.of(new JuliaTransform(new Complex(reValue, imValue), 1)))); + chaosGame.runSteps(100000); + } + + public void updateJuliaReValue(double reValue, double imValue) { + chaosGame.setChaosGameDescription(new ChaosGameDescription( + new Vector2D(-1.6, -1), + new Vector2D(1.6, 1.0), + List.of(new JuliaTransform(new Complex(reValue, imValue), 1)))); + chaosGame.runSteps(100000); + } + + public boolean isJuliaShowing() { + return chaosGame.getDescription().getTransforms().getFirst() instanceof JuliaTransform; + } + + public void saveFractal() { + FileChooser fileChooser = new FileChooser(); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt")); + File selectedFile = fileChooser.showSaveDialog(null); + + if (selectedFile != null) { + try { + ChaosGameFileHandler fileHandler = new ChaosGameFileHandler(); + ChaosGameDescription description = chaosGame.getDescription(); + fileHandler.writeToFile(description, selectedFile.getAbsolutePath()); + } catch (IOException ex) { + DialogUtils.showErrorDialog("Error", "Could not save file. Try again."); + } + } + } + public void homeButtonClicked() { notifyObservers(chaosPage); } diff --git a/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java b/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java index 8a7a7c8a665445086404dbac220c279487cb8561..082e4533806c55a98ac44f470ed241874d30c9fe 100644 --- a/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java +++ b/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java @@ -21,7 +21,7 @@ import org.example.chaosgame.model.linalg.Vector2D; public class ChaosGame implements GameSubject { private final ChaosCanvas canvas; private ChaosGameDescription description; - private Vector2D currentPoint; //endret her + private Vector2D currentPoint; private final Random random = new Random(); private final List<GameObserver> gameObservers; @@ -46,6 +46,10 @@ public class ChaosGame implements GameSubject { return canvas; } + public ChaosGameDescription getDescription() { + return description; + } + /** * Method for running the chaos game. Randomly selects a transformation * from the description and applies it to the current point. @@ -99,6 +103,7 @@ public class ChaosGame implements GameSubject { public void setChaosGameDescription(ChaosGameDescription description) { this.description = description; canvas.clearCanvas(); + setChaosCanvas(description.getMinCoords(), description.getMaxCoords()); notifyObservers(); } diff --git a/src/main/java/org/example/chaosgame/view/ChaosPage.java b/src/main/java/org/example/chaosgame/view/ChaosPage.java index d3344c8bf7304c3c9158e8dfa63ed004a734652d..f46c1c1789439263b2bc6b71f33d913325528194 100644 --- a/src/main/java/org/example/chaosgame/view/ChaosPage.java +++ b/src/main/java/org/example/chaosgame/view/ChaosPage.java @@ -5,18 +5,16 @@ import javafx.geometry.Pos; import javafx.scene.control.*; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; +import javafx.scene.text.Text; import org.example.chaosgame.controller.ChaosGameController; import org.example.chaosgame.model.chaos.*; import org.example.chaosgame.view.components.*; public class ChaosPage extends GamePage { - private final VBox sidebar; - private final Button homeButton; - public ChaosPage(ChaosGameController chaosGameController) { super(); - this.sidebar = new SideBar(chaosGameController); - this.homeButton = createHomeButton(event -> chaosGameController.homeButtonClicked()); + VBox sidebar = new SideBar(chaosGameController); + Button homeButton = createHomeButton(event -> chaosGameController.homeButtonClicked()); this.getChildren().addAll(gc.getCanvas(), sidebar, homeButton); } } \ No newline at end of file diff --git a/src/main/java/org/example/chaosgame/view/HomePage.java b/src/main/java/org/example/chaosgame/view/HomePage.java index 5f631bdabaddb6694937746b5f7fb4433f374a23..708ad41d6718c83e769e8e80bedcc51a5927457f 100644 --- a/src/main/java/org/example/chaosgame/view/HomePage.java +++ b/src/main/java/org/example/chaosgame/view/HomePage.java @@ -20,8 +20,6 @@ import org.example.chaosgame.controller.PageController; import org.example.chaosgame.model.chaos.ChaosGameDescription; import org.example.chaosgame.model.chaos.ChaosGameFileHandler; import org.example.chaosgame.view.components.ChooseGameButton; -import org.example.chaosgame.view.components.ChooseGameButton; -import org.example.chaosgame.view.components.GameButton; import org.example.chaosgame.view.components.GameHeader; import javafx.scene.media.Media; diff --git a/src/main/java/org/example/chaosgame/view/MenuView.java b/src/main/java/org/example/chaosgame/view/MenuView.java deleted file mode 100644 index 7f2541a2f378118eba57fc036bda66e5c0a22503..0000000000000000000000000000000000000000 --- a/src/main/java/org/example/chaosgame/view/MenuView.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.example.chaosgame.view; - -import javafx.geometry.Insets; -import javafx.geometry.Pos; -import javafx.scene.control.Button; -import javafx.scene.effect.ColorAdjust; -import javafx.scene.input.MouseEvent; -import javafx.scene.layout.HBox; - -public class MenuView { - private final HBox menuBar = new HBox();; - private final Button chaosButton = new Button("Chaos Game"); - private final Button exploreButton = new Button("Explore Game"); - - - public MenuView() { - chaosButton.setPadding(new Insets(10, 20, 10, 20)); - menuBar.setAlignment(Pos.CENTER_LEFT); - - menuBar.getChildren().addAll(chaosButton, exploreButton); - menuBar.setPrefHeight(60); - menuBar.setSpacing(10); - menuBar.setPadding(new Insets(10)); - } - - public HBox getMenuBar() { - return menuBar; - } - public Button getChaosButton() { - return chaosButton; - } - public Button getExploreButton() { - return exploreButton; - } - -} diff --git a/src/main/java/org/example/chaosgame/view/components/ColorPickerComponent.java b/src/main/java/org/example/chaosgame/view/components/ColorPickerComponent.java index b11d7e05001f85bd94e8b763c3623a4982d32e0e..2ba9780b4e05a78a088cd7d7036a6118877d1903 100644 --- a/src/main/java/org/example/chaosgame/view/components/ColorPickerComponent.java +++ b/src/main/java/org/example/chaosgame/view/components/ColorPickerComponent.java @@ -9,8 +9,8 @@ public class ColorPickerComponent extends ColorPicker { public ColorPickerComponent(Consumer<Color> colorChangeHandler) { super(); this.getStyleClass().add("color-picker"); - this.setMaxWidth(210); - this.setMinWidth(210); + this.setMaxWidth(200); + this.setMinWidth(200); this.setOnAction(event -> colorChangeHandler.accept(this.getValue() )); } } diff --git a/src/main/java/org/example/chaosgame/view/components/CreateAffineDialog.java b/src/main/java/org/example/chaosgame/view/components/CreateAffineDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..a6d8c4598d8e6e2b441d4e044b041ee1a9c1de2b --- /dev/null +++ b/src/main/java/org/example/chaosgame/view/components/CreateAffineDialog.java @@ -0,0 +1,57 @@ +package org.example.chaosgame.view.components; + +import javafx.scene.control.*; +import javafx.scene.layout.GridPane; +import org.example.chaosgame.model.linalg.Matrix2x2; +import org.example.chaosgame.model.linalg.Vector2D; +import org.example.chaosgame.model.transformations.AffineTransform2D; + +import java.util.ArrayList; +import java.util.List; + + +public class CreateAffineDialog extends Dialog<List<AffineTransform2D>> { + public CreateAffineDialog() { + this.setTitle("Create Affine Transformations"); + this.setHeaderText("Enter the values for the affine transformation matrices"); + + ButtonType createButtonType = new ButtonType("Create", ButtonBar.ButtonData.OK_DONE); + this.getDialogPane().getButtonTypes().addAll(createButtonType, ButtonType.CANCEL); + + GridPane content = new GridPane(); + List<TextField> fields = new ArrayList<>(); + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 6; j++) { + TextField field = new TextField(); + field.setPromptText("Value " + (j + 1)); + fields.add(field); + content.add(field, j, i); + } + } + + this.getDialogPane().setContent(content); + + this.setResultConverter(dialogButton -> { + if (dialogButton == createButtonType) { + try { + List<AffineTransform2D> transformations = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + double a = Double.parseDouble(fields.get(i * 6).getText()); + double b = Double.parseDouble(fields.get(i * 6 + 1).getText()); + double c = Double.parseDouble(fields.get(i * 6 + 2).getText()); + double d = Double.parseDouble(fields.get(i * 6 + 3).getText()); + double x = Double.parseDouble(fields.get(i * 6 + 4).getText()); + double y = Double.parseDouble(fields.get(i * 6 + 5).getText()); + + transformations.add(new AffineTransform2D(new Matrix2x2(a, b, c, d), new Vector2D(x, y))); + } + return transformations; + } catch (NumberFormatException ex) { + return null; + } + } + return null; + }); + } +} diff --git a/src/main/java/org/example/chaosgame/view/components/CreateJuliaDialog.java b/src/main/java/org/example/chaosgame/view/components/CreateJuliaDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..5aefcd4dbde693e725af6d3df1b012fe638bed92 --- /dev/null +++ b/src/main/java/org/example/chaosgame/view/components/CreateJuliaDialog.java @@ -0,0 +1,31 @@ +package org.example.chaosgame.view.components; + +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.util.Pair; + +public class CreateJuliaDialog extends Dialog<Pair<String, String>> { + public CreateJuliaDialog() { + this.setTitle("Create Julia fractal"); + this.setHeaderText("Enter the real and imaginary part of the constant c."); + + ButtonType createButtonType = new ButtonType("Create", ButtonBar.ButtonData.OK_DONE); + this.getDialogPane().getButtonTypes().addAll(createButtonType, ButtonType.CANCEL); + + HBox content = new HBox(); + TextField realPart = new TextField(); + realPart.setPromptText("Real part"); + TextField imaginaryPart = new TextField(); + imaginaryPart.setPromptText("Imaginary part"); + + content.getChildren().addAll(realPart, imaginaryPart); + this.getDialogPane().setContent(content); + + this.setResultConverter(dialogButton -> { + if (dialogButton == createButtonType) { + return new Pair<>(realPart.getText(), imaginaryPart.getText()); + } + return null; + }); + } +} diff --git a/src/main/java/org/example/chaosgame/view/components/DialogUtils.java b/src/main/java/org/example/chaosgame/view/components/DialogUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..ac51d0b81e13af21214db2b994cc5a18232b2cf9 --- /dev/null +++ b/src/main/java/org/example/chaosgame/view/components/DialogUtils.java @@ -0,0 +1,13 @@ +package org.example.chaosgame.view.components; + +import javafx.scene.control.Alert; + +public class DialogUtils { + public static void showErrorDialog(String title, String message){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle(title); + alert.setHeaderText(null); + alert.setContentText(message); + alert.showAndWait(); + } +} diff --git a/src/main/java/org/example/chaosgame/view/components/DoubleSlider.java b/src/main/java/org/example/chaosgame/view/components/DoubleSlider.java new file mode 100644 index 0000000000000000000000000000000000000000..51498ff15a69794f848270ec5f48a2b6db5c4d3c --- /dev/null +++ b/src/main/java/org/example/chaosgame/view/components/DoubleSlider.java @@ -0,0 +1,19 @@ +package org.example.chaosgame.view.components; + +import javafx.scene.control.Slider; +import javafx.scene.layout.HBox; +import org.example.chaosgame.controller.ChaosGameController; + +public class DoubleSlider extends Slider { + public DoubleSlider(ChaosGameController chaosGameController) { + //min value -1 and max is 1 + super(); + this.setMin(-1); + this.setMax(1); + this.setValue(0); + this.setShowTickLabels(true); + this.setShowTickMarks(true); + this.setMaxWidth(200); + + } +} diff --git a/src/main/java/org/example/chaosgame/view/components/GameButton.java b/src/main/java/org/example/chaosgame/view/components/GameButton.java index 1c185ea9e13eca2129b6443987d7ed1f39384498..c77f77ec636065fdd77f67817bd903103e6a15a1 100644 --- a/src/main/java/org/example/chaosgame/view/components/GameButton.java +++ b/src/main/java/org/example/chaosgame/view/components/GameButton.java @@ -5,7 +5,7 @@ import javafx.scene.control.Button; public class GameButton extends Button { public GameButton(String text){ super(text); - this.setMaxWidth(150); - this.setMinWidth(150); + this.setMaxWidth(200); + this.setMinWidth(200); } } diff --git a/src/main/java/org/example/chaosgame/view/components/GameSelectionBox.java b/src/main/java/org/example/chaosgame/view/components/GameSelectionBox.java index 5bbd6c8540b5bb5936291b9009fecacc164160a8..0f9804192afadce64b43026fc7891889087c3c21 100644 --- a/src/main/java/org/example/chaosgame/view/components/GameSelectionBox.java +++ b/src/main/java/org/example/chaosgame/view/components/GameSelectionBox.java @@ -5,7 +5,7 @@ import org.example.chaosgame.controller.ChaosGameController; public class GameSelectionBox extends ComboBox<String> { public GameSelectionBox(ChaosGameController chaosGameController){ - this.setPrefWidth(210); + this.setPrefWidth(200); this.setPromptText("Select fractal"); this.getItems().addAll("Julia", "Sierpinski", "Barnsley"); this.setOnAction(event -> { diff --git a/src/main/java/org/example/chaosgame/view/components/NumberOfStepsInput.java b/src/main/java/org/example/chaosgame/view/components/NumberOfStepsInput.java index b351cb45b7a74efa0ac648690dac2fdd7fbbb49e..28a0b5d420f0df5257c68597aae7e100bf207ac9 100644 --- a/src/main/java/org/example/chaosgame/view/components/NumberOfStepsInput.java +++ b/src/main/java/org/example/chaosgame/view/components/NumberOfStepsInput.java @@ -5,8 +5,8 @@ import javafx.scene.control.TextField; public class NumberOfStepsInput extends TextField { public NumberOfStepsInput(){ this.setPromptText("Number of steps"); - this.setMaxWidth(210); - this.setMinWidth(210); + this.setMaxWidth(200); + this.setMinWidth(200); this.setMinHeight(30); this.setMaxHeight(30); } diff --git a/src/main/java/org/example/chaosgame/view/components/SideBar.java b/src/main/java/org/example/chaosgame/view/components/SideBar.java index 95f4b1be426be967b12b023fa06f25d71f48d2d8..1e12ee6cbf312849482b25e5202b48a2c2ce00e6 100644 --- a/src/main/java/org/example/chaosgame/view/components/SideBar.java +++ b/src/main/java/org/example/chaosgame/view/components/SideBar.java @@ -1,29 +1,62 @@ package org.example.chaosgame.view.components; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; +import javafx.scene.control.Slider; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; import org.example.chaosgame.controller.ChaosGameController; import org.example.chaosgame.controller.ExploreGameController; +import javafx.beans.value.ChangeListener; public class SideBar extends VBox { + private Slider reValueslider; + private Slider imValueslider; + private TextField numberOfStepsInput; + public SideBar(ChaosGameController chaosGameController){ GameSelectionBox gameSelectionBox = new GameSelectionBox(chaosGameController); - TextField numberOfStepsInput = new NumberOfStepsInput(); - Button runStepsButton = new GameButton("Run steps"); + this.numberOfStepsInput = new NumberOfStepsInput(); + this.reValueslider = new DoubleSlider(chaosGameController); + this.imValueslider = new DoubleSlider(chaosGameController); + + Button createOwnJuliaFractalButton = new GameButton("Create Julia fractal"); + Button createOwnAffineFractalButton = new GameButton("Create Affine fractal"); + Button saveFractalButton = new GameButton("Save fractal"); Button openFileButton = new GameButton("Open file"); ColorPickerComponent colorPicker = new ColorPickerComponent(chaosGameController::updateFractalColor); - runStepsButton.setOnAction(event -> chaosGameController.runStepsValidation(numberOfStepsInput)); + Button runStepsButton = new GameButton("Run ChaosGame"); + openFileButton.setOnAction(event -> chaosGameController.openFromFile()); + createOwnJuliaFractalButton.setOnAction(event -> chaosGameController.createOwnJuliaFractal()); + createOwnAffineFractalButton.setOnAction(event -> chaosGameController.createOwnAffineFractal()); + saveFractalButton.setOnAction(event -> chaosGameController.saveFractal()); + reValueslider.valueProperty().addListener((observable, oldValue, newValue) -> + chaosGameController.updateJuliaReValue(newValue.doubleValue(), imValueslider.getValue())); + imValueslider.valueProperty().addListener((observable, oldValue, newValue) -> + chaosGameController.updateJuliaImValue(reValueslider.getValue(), newValue.doubleValue())); - this.getChildren().addAll(gameSelectionBox, colorPicker, numberOfStepsInput, runStepsButton, openFileButton); + runStepsButton.setOnAction(event -> chaosGameController.runStepsValidation(numberOfStepsInput)); + + this.getChildren().addAll(gameSelectionBox, colorPicker, numberOfStepsInput, + reValueslider, imValueslider, + createOwnJuliaFractalButton, createOwnAffineFractalButton, + saveFractalButton, openFileButton, runStepsButton); this.setSpacing(10); this.setPadding(new Insets(10)); this.setAlignment(Pos.CENTER_RIGHT); + + VBox.setMargin(createOwnJuliaFractalButton, new Insets(50, 0, 0, 0)); + VBox.setMargin(runStepsButton, new Insets(50, 0, 0, 0)); + + + } + public SideBar(ExploreGameController exploreGameController){ Button zoomInButton = new GameButton("Zoom in"); Button zoomOutButton = new GameButton("Zoom out"); @@ -39,4 +72,8 @@ public class SideBar extends VBox { this.setAlignment(Pos.CENTER_RIGHT); this.setSpacing(10); } + + public TextField getStepsTextField() { + return numberOfStepsInput; + } } diff --git a/src/main/resources/global.css b/src/main/resources/global.css index c017ac3c40a396bf5c6db115c6be26ba691ed702..be077eee2d43c85c16ead93c0b97ab288b23d26f 100644 --- a/src/main/resources/global.css +++ b/src/main/resources/global.css @@ -1,6 +1,6 @@ .button { -fx-text-fill: white; - -fx-font: 22 arial; + -fx-font: 20 arial; -fx-background-color: #0d2d3a; -fx-border-radius: 20; -fx-background-radius: 20; @@ -16,7 +16,7 @@ .home-button { -fx-text-fill: white; - -fx-font: 22 arial; + -fx-font: 20 arial; -fx-background-color: #0d2d3a; -fx-border-radius: 20; -fx-background-radius: 20; @@ -26,7 +26,7 @@ } .text-field { - -fx-font: 10 arial; + -fx-font: 14 arial; -fx-border-color: black; -fx-border-width: 2; -fx-background-insets: 1; @@ -40,7 +40,7 @@ } .combo-box { - -fx-font: 22 arial; + -fx-font: 20 arial; -fx-background-color: #0d2d3a; -fx-border-radius: 20; -fx-background-radius: 20; @@ -56,7 +56,6 @@ .combo-box .indexed-cell:selected { -fx-text-fill: white; - -fx-font: 22 arial; -fx-background-radius: 20; } @@ -82,7 +81,7 @@ } .color-picker { - -fx-font: 22 arial; + -fx-font: 20 arial; -fx-background-color: #0d2d3a; -fx-border-radius: 20; -fx-background-radius: 20;