Benson Kiprono
Benson Kiprono

Reputation: 129

Javafx How to undo shape drawings on another shape

I am implement a screenshot app with javafx, like lightshot. I am done with almost all the functionalities, but I am now stuck at the undo operation. I am adding the free draw, line arrows, rectangles etc on a rectangle like this :

selection.setCursor(Cursor.CROSSHAIR);
            Arrow arrow = new Arrow();
            selection.setOnMousePressed((evt) -> {

                rootPane.getChildren().remove(arrow);
                arrow.setStartX(evt.getX());
                arrow.setStartY(evt.getY());
                arrow.setEndX(evt.getX());
                arrow.setEndY(evt.getY());
                arrow.setStyle("-fx-background-color:red");
                rootPane.getChildren().add(arrow);

            });

            selection.setOnMouseDragged((evt) -> {
                arrow.setEndX(evt.getX());
                arrow.setEndY(evt.getY());
            });
            selection.setOnMouseReleased((evt) -> {

                arrow.setEndX(evt.getX());
                arrow.setEndY(evt.getY());
            });

            drawtype = "arrow";
        });

Selection is the rectangle that I have drawn, this is an example of how I am adding the arrow. I have tried researching online but I cant seem to get something to point me in the right direction, anyone who can help out here please? Remember, I am not using Canvas or GraphicsContext.

Upvotes: 0

Views: 220

Answers (1)

Marcel
Marcel

Reputation: 1768

If you want to be able to undo the actions, you need to store the state of your 'drawing'.

In your case undoing the creation of your Arrow element, would be simple rootPane.getChildren().remove(arrow);

You just need to create a Data Structure where you store all actions done by the user (or at least a few). And each action can get reversed.

Example:

ActionType.Add -> action: getChildren().add(xyz) -> reverse: getChildren().remove(xyz)

ActionType.Move -> arrow.setEndX(evt.getX()) -> arrow.setEndX(oldX)

Each action should contain all information needed to reverse it. (The node involved, what was done and how it was before)

Upvotes: 1

Related Questions