Skip to content
Snippets Groups Projects
Commit a6bdfa2e authored by Edvard Granheim Harbo's avatar Edvard Granheim Harbo
Browse files

Merge branch 'RightSideUI' into 'dev'

Started on the different extra functions

See merge request !33
parents 1e31a6b5 c233c73c
No related branches found
No related tags found
2 merge requests!54Final release,!33Started on the different extra functions
package edu.ntnu.idatt2003.mappevurderingprog2.views.Components;
import edu.ntnu.idatt2003.mappevurderingprog2.utils.Size;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
public class ExtraUserOptions extends VBox {
private final Button resetViewButton;
private final Button clearCanvasButton;
private final Slider zoomSlider;
private final Node node;
private final RotationButton rotationButton;
private final InformationButton informationButton;
public ExtraUserOptions(Node node) {
this.node = node;
resetViewButton = new Button("Reset View");
clearCanvasButton = new Button("Clear Canvas");
rotationButton = new RotationButton(node);
informationButton = new InformationButton("Additional Information");
zoomSlider = new Slider(0.5, 4.0, 1.0);
Label rotationLabel = new Label("Rotate the view");
this.getChildren().addAll(resetViewButton,
createZoomSliderWithLabels(),
rotationLabel,
rotationButton,
clearCanvasButton,
informationButton);
extraUserOptionsInitialize();
}
private HBox createZoomSliderWithLabels() {
Label zoomInLabel = new Label("Zoom In");
Label zoomOutLabel = new Label("Zoom Out");
zoomSlider.setPrefWidth(100);
HBox sliderWithLabels = new HBox(zoomOutLabel, zoomSlider, zoomInLabel);
sliderWithLabels.setSpacing(10);
return sliderWithLabels;
}
private void extraUserOptionsInitialize() {
extraUserOptionsSizeAndPositioning();
extraUserOptionsStyling();
sliderToZoom();
resetZoomButton();
clearCanvasButton();
}
private void resetZoomButton() {
resetViewButton.setOnAction(event -> {
zoomSlider.setValue(1.0);
node.getTransforms().clear();
node.setTranslateX(0);
node.setTranslateY(0);
});
}
private void extraUserOptionsSizeAndPositioning() {
double screenWidth = Size.getScreenWidth();
double screenHeight = Size.getScreenHeight();
setPrefWidth(0.2 * screenWidth);
setMaxWidth(0.2 * screenWidth);
setPrefHeight(0.3 * screenHeight);
setMaxHeight(0.3 * screenHeight);
setAlignment(Pos.CENTER);
setPadding(new Insets(10, 0, 10, 0));
}
private void extraUserOptionsStyling() {
setPadding(new Insets(10, 10, 10, 10));
setStyle("-fx-background-color: #f4f4f4;");
}
private void sliderToZoom() {
zoomSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
double zoomFactor = newValue.doubleValue();
node.getTransforms().clear();
node.getTransforms().add(new javafx.scene.transform.Scale(
zoomFactor, zoomFactor, node.getBoundsInParent().getWidth()
/ 2, node.getBoundsInParent().getHeight() / 2));
});
}
private void clearCanvasButton() {
clearCanvasButton.setOnAction(event -> {
if (node instanceof Canvas) {
GraphicsContext gc = ((Canvas) node).getGraphicsContext2D();
gc.clearRect(0, 0, ((Canvas) node).getWidth(), ((Canvas) node).getHeight());
}
node.getTransforms().clear();
node.setTranslateX(0);
node.setTranslateY(0);
});
}
}
package edu.ntnu.idatt2003.mappevurderingprog2.views.Components;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.Region;
public class InformationButton extends Button {
public InformationButton(String label) {
super(label);
this.setOnAction(event -> {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Additional information");
alert.setHeaderText(null);
String contentText = "Fractals use 3 primary colors to show hit density:\n" +
"Red: Top 33% hit most\nBlue: Mid 33%\nGreen: Bottom 33%\n\n" +
"Right side: Main menu - create, select, edit fractals\n" +
"Bottom menu: Extra user options for canvas interaction\n\n" +
"Interact with canvas: Zoom with mouse, click-hold to move";
alert.setContentText(contentText);
alert.getDialogPane().setPrefWidth(400);
alert.getDialogPane().setPrefHeight(250);
alert.getDialogPane().setMinWidth(Region.USE_PREF_SIZE);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.getButtonTypes().setAll(ButtonType.CLOSE);
alert.showAndWait();
});
}
}
package edu.ntnu.idatt2003.mappevurderingprog2.views.Components;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.transform.Rotate;
public class RotationButton extends HBox {
private final Button rotateClockwise;
private final Button rotateCounterClockwise;
private final Node node;
private double totalRotation = 0.0;
public RotationButton(Node node) {
this.node = node;
rotateClockwise = new Button("Clockwise");
rotateCounterClockwise = new Button("Counter Clockwise");
initializeUI();
attachEventHandlers();
}
private void initializeUI() {
setSpacing(10);
setAlignment(Pos.CENTER);
getChildren().addAll(rotateCounterClockwise, rotateClockwise);
}
private void attachEventHandlers() {
rotateClockwise.setOnAction(event -> rotate(90));
rotateCounterClockwise.setOnAction(event -> rotate(-90));
}
private void rotate(double angle) {
clearTransforms();
double centerX = getCenterX();
double centerY = getCenterY();
double pivotX = getPivotX(centerX);
double pivotY = getPivotY(centerY);
totalRotation += angle;
node.getTransforms().add(new Rotate(totalRotation, pivotX, pivotY));
}
private void clearTransforms() {
node.getTransforms().clear();
}
private double getCenterX() {
return node.getScene().getWidth() / 2;
}
private double getCenterY() {
return node.getScene().getHeight() / 2;
}
private double getPivotX(double centerX) {
Bounds bounds = node.getBoundsInParent();
double nodeCenterX = bounds.getWidth() / 2;
double deltaX = centerX - node.localToScene(nodeCenterX, 0).getX();
return nodeCenterX + deltaX;
}
private double getPivotY(double centerY) {
Bounds bounds = node.getBoundsInParent();
double nodeCenterY = bounds.getHeight() / 2;
double deltaY = centerY - node.localToScene(0, nodeCenterY).getY();
return nodeCenterY + deltaY;
}
}
package edu.ntnu.idatt2003.mappevurderingprog2.views.Components;
import javafx.scene.Node;
import javafx.scene.control.Slider;
import javafx.scene.transform.Scale;
public class Zoom {
private double mouseX, mouseY;
private Slider zoomSlider;
public Zoom(Node node) {
zoomSlider = new Slider(0.5, 4.0, 1.0);
setUpZoomSlider();
setUpZoomAndMovement(node);
}
public void setUpZoomAndMovement(Node node) {
zoomInAndOut(node);
screenMovement(node);
bindSliderToZoom(node);
}
private void zoomInAndOut(Node node) {
......@@ -41,4 +50,17 @@ public class Zoom {
mouseY = event.getSceneY();
});
}
private void bindSliderToZoom(Node node) {
zoomSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
double zoomFactor = newValue.doubleValue();
node.getTransforms().clear();
node.getTransforms().add(new Scale(zoomFactor, zoomFactor, node.getBoundsInParent().getWidth() / 2, node.getBoundsInParent().getHeight() / 2));
});
}
private void setUpZoomSlider() {
zoomSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
});
}
}
package edu.ntnu.idatt2003.mappevurderingprog2.views;
import edu.ntnu.idatt2003.mappevurderingprog2.controllers.GameController;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.ExtraUserOptions;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.Menu;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.Zoom;
import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosCanvas;
import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosGame;
import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosGameDescription;
import edu.ntnu.idatt2003.mappevurderingprog2.models.chaos.ChaosGameObserver;
import edu.ntnu.idatt2003.mappevurderingprog2.utils.Colorpalette;
import edu.ntnu.idatt2003.mappevurderingprog2.utils.Size;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.Zoom;
import java.io.FileNotFoundException;
import edu.ntnu.idatt2003.mappevurderingprog2.views.Components.Menu;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Separator;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.transform.Scale;
import javafx.scene.control.Separator;
public class View extends BorderPane implements ChaosGameObserver {
private Canvas mainCanvas;
private GameController gameController;
private Menu menu;
private ExtraUserOptions extraUserOptions;
private int greenThreshold, blueThreshold, redThreshold;
private Zoom zoom;
public View(GameController gameController) {
this.gameController = gameController;
this.mainCanvas = new Canvas(600, 400);
this.zoom = new Zoom();
this.zoom = new Zoom(mainCanvas);
zoom.setUpZoomAndMovement(mainCanvas);
this.extraUserOptions = new ExtraUserOptions(mainCanvas);
}
public Canvas getMainCanvas() {
......@@ -83,7 +82,6 @@ public class View extends BorderPane implements ChaosGameObserver {
blueThreshold = hitCounts.get((int) (n * 0.66));
}
private Color getColorForHits(int hits) {
if (hits == 0) {
return Color.WHITE;
......@@ -98,12 +96,14 @@ public class View extends BorderPane implements ChaosGameObserver {
public Scene createScene() throws FileNotFoundException {
this.setBackground(new Background(new BackgroundFill(Colorpalette.Primary, CornerRadii.EMPTY, Insets.EMPTY)));
this.setCenter(mainCanvas);
this.menu = new Menu(this, gameController);
VBox rightContainer = new VBox();
rightContainer.setAlignment(Pos.BOTTOM_RIGHT);
rightContainer.getChildren().add(extraUserOptions);
this.setRight(rightContainer);
this.setLeft(menu);
new Separator();
......@@ -115,7 +115,6 @@ public class View extends BorderPane implements ChaosGameObserver {
Platform.runLater(() -> {
calculateQuantiles(ChaosGame.getInstance().getCanvas().getCanvasArray());
updateCanvasDisplay(canvas);
});
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment