diff --git a/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloController.java b/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloController.java index 0426778..37ff268 100644 --- a/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloController.java +++ b/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloController.java @@ -1,27 +1,21 @@ package fr.emiko.graphicalapp; -import javafx.application.Platform; import javafx.event.ActionEvent; -import javafx.fxml.FXML; +import javafx.event.EventHandler; import javafx.fxml.Initializable; -import javafx.scene.SnapshotParameters; import javafx.scene.canvas.Canvas; import javafx.scene.control.Label; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.MenuItem; import javafx.scene.control.ScrollPane; import javafx.scene.control.Slider; -import javafx.scene.image.PixelReader; -import javafx.scene.image.PixelWriter; -import javafx.scene.image.WritableImage; -import javafx.scene.input.MouseEvent; -import javafx.scene.input.ScrollEvent; -import javafx.scene.input.ZoomEvent; +import javafx.scene.input.*; +import javafx.scene.layout.Pane; import javafx.scene.paint.Color; -import javafx.scene.paint.Paint; import fr.emiko.graphicsElement.Stroke; +import javafx.scene.robot.Robot; +import javafx.scene.transform.Scale; -import java.awt.*; import java.net.URL; import java.util.ResourceBundle; import java.util.Vector; @@ -34,10 +28,13 @@ public class HelloController implements Initializable { public Slider brushSizeSlider; public Slider zoomSlider; public ScrollPane scrollPane; + public Label brushSizeLabel; + public Pane pane; private double posX = 0; private double posY = 0; private Vector strokes = new Vector<>(); private Vector lastSaved = new Vector<>(); + private Vector> lines = new Vector<>(); @Override public void initialize(URL url, ResourceBundle resourceBundle) { @@ -47,9 +44,51 @@ public class HelloController implements Initializable { loadButton.setOnAction(this::onActionLoad); newCanvasButton.setOnAction(this::onActionCreateCanvas); scrollPane.setOnScroll(this::onScrollZoom); + scrollPane.getParent().setOnKeyPressed(this::onActionKeyPressed); + brushSizeLabel.textProperty().bind(brushSizeSlider.valueProperty().asString()); + setupCanvas(); + scrollPane.prefViewportHeightProperty().bind(pane.layoutYProperty()); + scrollPane.prefViewportWidthProperty().bind(pane.layoutXProperty()); + } + + private void setupCanvas() { + drawingCanvas.requestFocus(); + drawingCanvas.getGraphicsContext2D().setFill(Color.WHITE); + drawingCanvas.getGraphicsContext2D().fillRect(0, 0, drawingCanvas.getWidth(), drawingCanvas.getHeight()); + brushSizeSlider.setValue(1); + drawingCanvas.setTranslateX(scrollPane.getWidth()/2); + drawingCanvas.setTranslateY(scrollPane.getHeight()/2); + scrollPane.addEventFilter(ScrollEvent.ANY, new EventHandler() { + @Override + public void handle(ScrollEvent event) { + onScrollZoom(event); + event.consume(); + }}); + } + + private void onActionKeyPressed(KeyEvent keyEvent) { + keyEvent.consume(); + if (keyEvent.isControlDown() && keyEvent.getCode().equals(KeyCode.Z)) { + System.out.println("CTRL Z"); + System.out.println(lines); + lines.remove(lines.lastElement()); + GraphicsContext gc = drawingCanvas.getGraphicsContext2D(); + gc.setFill(Color.WHITE); + gc.fillRect(0, 0, drawingCanvas.getWidth(), drawingCanvas.getHeight()); + for (Vector strokeVector : lines) { + for (Stroke stroke: strokeVector) { + stroke.draw(gc); + System.out.println(stroke); + } + } + } + if (keyEvent.isControlDown() && keyEvent.getCode().equals(KeyCode.Y)) { + System.out.println("CTRL Y"); + } } private void onScrollZoom(ScrollEvent event) { + event.consume(); double SCALE_DELTA = 1.1; if (event.getDeltaY() == 0) { @@ -59,15 +98,22 @@ public class HelloController implements Initializable { double scaleFactor = (event.getDeltaY() > 0) ? SCALE_DELTA : 1 / SCALE_DELTA; - drawingCanvas.setScaleX(drawingCanvas.getScaleX() * scaleFactor); - drawingCanvas.setScaleY(drawingCanvas.getScaleY() * scaleFactor); - scrollPane.setFitToHeight(true); - scrollPane.setFitToWidth(true); + Scale newScale = new Scale(); + newScale.setX(drawingCanvas.getScaleX() * scaleFactor); + newScale.setY(drawingCanvas.getScaleY() * scaleFactor); + newScale.setPivotX(drawingCanvas.getScaleX()); + newScale.setPivotY(drawingCanvas.getScaleY()); + drawingCanvas.getTransforms().add(newScale); + + + System.out.println(pane.getHeight()); + System.out.println(pane.getWidth()); + pane.setPrefHeight(pane.getHeight()*scaleFactor); + pane.setPrefWidth(pane.getWidth()*scaleFactor); } } - private void onActionCreateCanvas(ActionEvent actionEvent) { } @@ -90,38 +136,29 @@ public class HelloController implements Initializable { private void resetPos(MouseEvent mouseEvent) { posX = 0; posY = 0; + lines.add((Vector) strokes.clone()); + System.out.println(lines); + strokes.clear(); } private void printLine(MouseEvent mouseEvent) { - GraphicsContext gc = drawingCanvas.getGraphicsContext2D(); -// gc.setFill(Color.BLACK); -// gc.setStroke(Color.BLACK); -// gc.beginPath(); -// if (posX == 0 || posY == 0) { -// posX = mouseEvent.getX(); -// posY = mouseEvent.getY(); -// } -// gc.moveTo(posX, posY); -// gc.lineTo(mouseEvent.getX(), mouseEvent.getY()); -// gc.closePath(); -// gc.stroke(); -// posX = mouseEvent.getX(); -// posY = mouseEvent.getY(); + if (mouseEvent.isPrimaryButtonDown()) { + GraphicsContext gc = drawingCanvas.getGraphicsContext2D(); + + if (posX == 0 || posY == 0) { + posX = mouseEvent.getX(); + posY = mouseEvent.getY(); + } + + Stroke stroke = new Stroke(posX, posY, mouseEvent.getX(), mouseEvent.getY(), brushSizeSlider.getValue()); + strokes.add(stroke); + stroke.draw(gc); - if (posX == 0 || posY == 0) { posX = mouseEvent.getX(); posY = mouseEvent.getY(); + } else if (mouseEvent.isSecondaryButtonDown()) { + } - - Stroke stroke = new Stroke(posX, posY, mouseEvent.getX(), mouseEvent.getY()); - strokes.add(stroke); - stroke.draw(gc); - - posX = mouseEvent.getX(); - posY = mouseEvent.getY(); - - System.out.println(stroke); - } } \ No newline at end of file diff --git a/graphical-app/src/main/java/fr/emiko/graphicsElement/Stroke.java b/graphical-app/src/main/java/fr/emiko/graphicsElement/Stroke.java index 4fa139a..55e7e5b 100644 --- a/graphical-app/src/main/java/fr/emiko/graphicsElement/Stroke.java +++ b/graphical-app/src/main/java/fr/emiko/graphicsElement/Stroke.java @@ -12,19 +12,21 @@ public class Stroke { private final double fromY; private final double toX; private final double toY; + private final double brushSize; - public Stroke (double fromX, double fromY, double toX, double toY) { + public Stroke (double fromX, double fromY, double toX, double toY, double brushSize) { this.fromX = fromX; this.fromY = fromY; this.toX = toX; this.toY = toY; + this.brushSize = brushSize; } public void draw (GraphicsContext g) { g.setStroke(javafx.scene.paint.Color.BLACK); g.setLineCap(StrokeLineCap.ROUND); g.setMiterLimit(1); - g.setLineWidth(10); + g.setLineWidth(brushSize); g.setLineJoin(StrokeLineJoin.ROUND); g.beginPath(); g.moveTo(fromX, fromY); @@ -36,6 +38,6 @@ public class Stroke { @Override public String toString () { - return "Stroke{fromX=%f, fromY=%f, toX=%f, toY=%f}".formatted(fromX, fromY, toX, toY); + return "Stroke{fromX=%f, fromY=%f, toX=%f, toY=%f, brushSize=%f}".formatted(fromX, fromY, toX, toY, brushSize); } } diff --git a/graphical-app/src/main/resources/fr/emiko/graphicalapp/hello-view.fxml b/graphical-app/src/main/resources/fr/emiko/graphicalapp/hello-view.fxml index bf40b81..36ddda6 100644 --- a/graphical-app/src/main/resources/fr/emiko/graphicalapp/hello-view.fxml +++ b/graphical-app/src/main/resources/fr/emiko/graphicalapp/hello-view.fxml @@ -10,6 +10,7 @@ + @@ -35,7 +36,7 @@ - + @@ -49,7 +50,7 @@ @@ -61,8 +62,12 @@ - @@ -76,9 +81,13 @@ - + - + + + + +