fix(zoom): zoom rudimentaire fonctionnel avec scroll-bars fixées

This commit is contained in:
Emi Boucly 2025-03-17 16:41:29 +01:00
parent b325204d7d
commit 3f5bb98f8d
3 changed files with 98 additions and 50 deletions

View file

@ -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<Stroke> strokes = new Vector<>();
private Vector<Stroke> lastSaved = new Vector<>();
private Vector<Vector<Stroke>> 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<ScrollEvent>() {
@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<Stroke> 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<Stroke>) 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);
}
}

View file

@ -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);
}
}