package de.synolo.app.qs.editor; import de.synolo.lib.fw.utils.MultipleSelectionModelWrapper; import javafx.beans.property.DoubleProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener.Change; import javafx.collections.ObservableList; import javafx.scene.Parent; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.MultipleSelectionModel; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; public class EditorCanvas extends Pane { private Canvas canvas; private EditorControl control; private ObservableList layers = FXCollections.observableArrayList(); private ReadOnlyObjectWrapper stateProperty = new ReadOnlyObjectWrapper(EditorState.INSERTING); private MultipleSelectionModelWrapper layerSelectionModel = new MultipleSelectionModelWrapper<>(this.layers); public EditorCanvas() { this.canvas = new Canvas(); this.canvas.widthProperty().bind(widthProperty()); this.canvas.heightProperty().bind(heightProperty()); this.canvas.widthProperty().addListener((v, ov, n) -> paint()); this.canvas.heightProperty().addListener((v, ov, n) -> paint()); this.control = new EditorControl(this); getChildren().add(this.canvas); this.layers.addListener((Change c) -> paint()); this.stateProperty.addListener((v, ov, nv) -> System.out.println(this.stateProperty.get())); } public EditorControl getControl() { return this.control; } public ObservableList getLayers() { return this.layers; } public MultipleSelectionModel getLayerSelectionModel() { return this.layerSelectionModel; } public ReadOnlyObjectProperty stateProperty() { return this.stateProperty.getReadOnlyProperty(); } public EditorState getState() { return this.stateProperty.get(); } void setState(EditorState state) { this.stateProperty.set(state); } public void paint() { GraphicsContext gc = this.canvas.getGraphicsContext2D(); double width = this.canvas.getWidth(), height = this.canvas.getHeight(); gc.setFill(Color.BLACK); gc.fillRect(0, 0, width, height); gc.save(); gc.scale(this.control.getZoom(), this.control.getZoom()); gc.translate(-this.control.getOffsetX(), -this.control.getOffsetY()); for(int i = this.layers.size() - 1; i >= 0; i--) { this.layers.get(i).paint(gc); } gc.restore(); System.out.println("paint - " + this.stateProperty.get()); } }