diff --git a/src/main/java/shape/Circle.java b/src/main/java/shape/Circle.java index 3c2060c6ea9a1adacfe65aa378facbe9844d6295..33184a54dec71f1778d69933ba5942e5d5be1ad0 100644 --- a/src/main/java/shape/Circle.java +++ b/src/main/java/shape/Circle.java @@ -22,7 +22,7 @@ public class Circle implements Shape { graphicsContext.setStroke(Color.BLACK); graphicsContext.setLineWidth(2); if (isFinished) { - graphicsContext.setFill(Color.GREEN); + graphicsContext.setFill(Color.GREEN.deriveColor(0,1,1,0.5)); graphicsContext.fillOval(x - radius, y - radius, 2 * radius, 2 * radius); } graphicsContext.strokeOval(x - radius, y - radius, 2 * radius, 2 * radius); @@ -70,4 +70,10 @@ public class Circle implements Shape { return y; } + public void setDimensions(double x, double y, double width, double height){ + this.x = x; + this.y = y; + this.radius = width/2; + } + } diff --git a/src/main/java/shape/Rectangle.java b/src/main/java/shape/Rectangle.java index b57f9dfdc85e91bbdc2e82f97d8570b17ad70507..97ac3810301cdc5efcd0a5fe20bccbaa0a663bed 100644 --- a/src/main/java/shape/Rectangle.java +++ b/src/main/java/shape/Rectangle.java @@ -23,7 +23,7 @@ public class Rectangle implements Shape{ graphicsContext.setStroke(Color.BLACK); graphicsContext.setLineWidth(2); if(isFinished){ - graphicsContext.setFill(Color.RED); + graphicsContext.setFill(Color.RED.deriveColor(0,1,1,0.5)); graphicsContext.fillRect(x, y, width, height); } graphicsContext.strokeRect(x, y, width, height); @@ -68,4 +68,21 @@ public class Rectangle implements Shape{ public void setFillColor(Color fillColor) { this.fillColor = fillColor; } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public void setDimensions(double x, double y, double width, double height) { + this.x = x; + this.y = y; + this.width = Math.abs(width); + this.height = Math.abs(height); + if(width < 0 ){ this.x += width;} + if(height < 0){ this.y += height;} + } } diff --git a/src/main/java/state/Drawer.java b/src/main/java/state/Drawer.java index c6e5f278d50e2910a22e24478b246c9a9679dc87..5e2b152cc57104be0c95ac1cbcada797d50fb01a 100644 --- a/src/main/java/state/Drawer.java +++ b/src/main/java/state/Drawer.java @@ -18,10 +18,22 @@ public class Drawer extends Canvas { setOnMouseReleased(event->context.mouseReleased(event)); setOnMouseMoved(event->context.mouseMoved(event)); setOnMouseDragged(event->context.mouseMoved(event)); - //setOnKeyPressed(event -> context.keyPressed(event)); + setOnKeyPressed(event -> context.keyPressed(event)); } public void repaint(){ this.getGraphicsContext2D().clearRect(0,0,this.getWidth(),this.getHeight()); + for(Shape shape : shapes){ + shape.paint(this.getGraphicsContext2D()); + } + } + public void addShape(Shape shape){ + shapes.add(shape); + } + public Shape shapeContains(double x, double y){ + for(Shape shape : shapes){ + if(shape.contains(x,y)) return shape; + } + return null; } } diff --git a/src/main/java/state/DrawerContext.java b/src/main/java/state/DrawerContext.java index f82de3953ba8ae28f267393fdcb01fd7dcd3b6c2..8a36641d31ddd658a89f3267a4817600976d7726 100644 --- a/src/main/java/state/DrawerContext.java +++ b/src/main/java/state/DrawerContext.java @@ -1,6 +1,7 @@ package state; +import javafx.scene.canvas.GraphicsContext; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; @@ -11,6 +12,10 @@ public class DrawerContext { public DrawerContext(Drawer drawer) { this.drawer = drawer; + this.currentState = new NullDrawerState(); + } + public void paint(GraphicsContext graphicsContext) { + drawer.repaint(); } void mousePressed(MouseEvent event){ @@ -22,12 +27,34 @@ public class DrawerContext { currentState.mouseReleased(this,event.getX(),event.getY()); } - void mouseMoved(MouseEvent event){} + void mouseMoved(MouseEvent event){ + currentState.mouseMoved(this,event.getX(),event.getY()); + } public void keyPressed(KeyEvent event) { switch (event.getText()) { case "c": - currentState = new StateCircle0(); + setState(new StateCircle0()); + break; + case "r": + setState(new StateRectangle0()); + break; + case "m": + setState(new StateMoveShape()); + break; + default: + setState(new NullDrawerState()); } } + public Drawer drawer(){ + return drawer; + } + + public Drawer getDrawer() { + return drawer; + } + + public void setState(DrawerState state) { + this.currentState = state; + } } diff --git a/src/main/java/state/DrawerState.java b/src/main/java/state/DrawerState.java index 680324c78948ecab7c870f28f0901f15bf4d8045..ce79e22f3a4daf90821caeda7f12648f91e7aac0 100644 --- a/src/main/java/state/DrawerState.java +++ b/src/main/java/state/DrawerState.java @@ -3,4 +3,6 @@ package state; public interface DrawerState { void mousePressed(DrawerContext context, double x, double y); void mouseReleased(DrawerContext context, double x, double y); + void mouseMoved(DrawerContext context, double x, double y); + public void paint(DrawerContext context); } diff --git a/src/main/java/state/NullDrawerState.java b/src/main/java/state/NullDrawerState.java new file mode 100644 index 0000000000000000000000000000000000000000..11f4543d8155ce123082603b53446066cb324a15 --- /dev/null +++ b/src/main/java/state/NullDrawerState.java @@ -0,0 +1,17 @@ +package state; + +public class NullDrawerState implements DrawerState { + @Override + public void mousePressed(DrawerContext context, double x, double y) {} + + @Override + public void mouseReleased(DrawerContext context, double x, double y) {} + + @Override + public void mouseMoved(DrawerContext context, double x, double y) {} + + @Override + public void paint(DrawerContext context) { + + } +} diff --git a/src/main/java/state/Shapes.java b/src/main/java/state/Shapes.java new file mode 100644 index 0000000000000000000000000000000000000000..9e49a93065b5d6e99bfb738deb9b6ce1bcfd8c27 --- /dev/null +++ b/src/main/java/state/Shapes.java @@ -0,0 +1,6 @@ +package state; + +public enum Shapes { + RECTANGLE, + CIRCLE, +} diff --git a/src/main/java/state/StateCircle0.java b/src/main/java/state/StateCircle0.java index 073c48176cc7b838435f9dd78295558b55eada72..c3608dee13e3c1c92b4e843387a29c40081b3ba4 100644 --- a/src/main/java/state/StateCircle0.java +++ b/src/main/java/state/StateCircle0.java @@ -10,4 +10,14 @@ public class StateCircle0 implements DrawerState { public void mouseReleased(DrawerContext context, double x, double y) { } + + @Override + public void mouseMoved(DrawerContext context, double x, double y) { + + } + + @Override + public void paint(DrawerContext context) { + + } } diff --git a/src/main/java/state/StateCircle1.java b/src/main/java/state/StateCircle1.java new file mode 100644 index 0000000000000000000000000000000000000000..c8d87e652896ed37701c0669fc1a5fb353c13e7b --- /dev/null +++ b/src/main/java/state/StateCircle1.java @@ -0,0 +1,32 @@ +package state; + +import shape.Circle; + +public class StateCircle1 implements DrawerState{ + private Circle circle; + + public StateCircle1(Circle circle) { + this.circle = circle; + } + @Override + public void mousePressed(DrawerContext context, double x, double y) {} + + @Override + public void mouseReleased(DrawerContext context, double x, double y) { + circle.setFinished(true); + context.paint(context.getDrawer().getGraphicsContext2D()); + context.setState(new StateCircle0()); + } + + @Override + public void mouseMoved(DrawerContext context, double x, double y) { + double radius = Math.sqrt(Math.pow(x - circle.getX(), 2) + Math.pow(y - circle.getY(), 2)); + circle.setDimensions(circle.getX(), circle.getY(), radius*2, radius*2); + context.paint(context.getDrawer().getGraphicsContext2D()); + } + + @Override + public void paint(DrawerContext context) { + + } +} diff --git a/src/main/java/state/StateMoveShape.java b/src/main/java/state/StateMoveShape.java new file mode 100644 index 0000000000000000000000000000000000000000..b6e827553c6b9823be25970186599ae5652226d4 --- /dev/null +++ b/src/main/java/state/StateMoveShape.java @@ -0,0 +1,40 @@ +package state; + +import shape.Shape; + +public class StateMoveShape implements DrawerState{ + private Shape selectedShape; + private double previousX, previousY; + + @Override + public void mousePressed(DrawerContext context, double x, double y) { + selectedShape = context.getDrawer().shapeContains(x,y); + if(selectedShape != null) { + previousX = x; + previousY = y; + } + + } + + @Override + public void mouseReleased(DrawerContext context, double x, double y) { + if(selectedShape != null) { + double deltaX = x - previousX; + double deltaY = y - previousY; + selectedShape.translate(deltaX, deltaY); + previousX = x; + previousY = y; + context.getDrawer().repaint(); + } + } + + @Override + public void mouseMoved(DrawerContext context, double x, double y) { + selectedShape = null; + } + + @Override + public void paint(DrawerContext context) { + + } +} diff --git a/src/main/java/state/StateRectangle0.java b/src/main/java/state/StateRectangle0.java new file mode 100644 index 0000000000000000000000000000000000000000..d311145c2845e3397fb60688d9d4156a59350b1c --- /dev/null +++ b/src/main/java/state/StateRectangle0.java @@ -0,0 +1,30 @@ +package state; + +import shape.Rectangle; + +public class StateRectangle0 implements DrawerState{ + public StateRectangle0() { } + + @Override + public void mousePressed(DrawerContext context, double x, double y) { + Rectangle rectangle = new Rectangle(x, y,0,0); + rectangle.setFinished(false); + context.getDrawer().addShape(rectangle); + context.setState(new StateRectangle1(rectangle)); + } + + @Override + public void mouseReleased(DrawerContext context, double x, double y) { + + } + + @Override + public void mouseMoved(DrawerContext context, double x, double y) { + + } + + @Override + public void paint(DrawerContext context) { + + } +} diff --git a/src/main/java/state/StateRectangle1.java b/src/main/java/state/StateRectangle1.java new file mode 100644 index 0000000000000000000000000000000000000000..c4ce1002e06a3142c928495d7315edae4e4a274e --- /dev/null +++ b/src/main/java/state/StateRectangle1.java @@ -0,0 +1,35 @@ +package state; + +import shape.Rectangle; + +public class StateRectangle1 implements DrawerState { + private Rectangle rectangle; + private double startX, startY; + public StateRectangle1(Rectangle rectangle) { + this.rectangle = rectangle; + this.startX = rectangle.getX(); + this.startY = rectangle.getY(); + } + @Override + public void mousePressed(DrawerContext context, double x, double y) {} + + @Override + public void mouseReleased(DrawerContext context, double x, double y) { + rectangle.setFinished(true); + context.paint(context.getDrawer().getGraphicsContext2D()); + context.setState(new StateRectangle0()); + } + + @Override + public void mouseMoved(DrawerContext context, double x, double y) { + double width = x - startX; + double height = y - startY; + rectangle.setDimensions(startX,startY,width,height); + context.paint(context.getDrawer().getGraphicsContext2D()); + } + + @Override + public void paint(DrawerContext context) { + + } +}