From 74a5c5dcbaf7a2af198c4d0fd171ae5a9eb0d75d Mon Sep 17 00:00:00 2001 From: m19023837 <chadi.mansour@etu.univ-amu.fr> Date: Wed, 9 Oct 2024 14:16:13 +0200 Subject: [PATCH] Tp end --- src/main/java/shape/Circle.java | 8 ++++- src/main/java/shape/Rectangle.java | 19 ++++++++++- src/main/java/state/Drawer.java | 14 ++++++++- src/main/java/state/DrawerContext.java | 31 ++++++++++++++++-- src/main/java/state/DrawerState.java | 2 ++ src/main/java/state/NullDrawerState.java | 17 ++++++++++ src/main/java/state/Shapes.java | 6 ++++ src/main/java/state/StateCircle0.java | 10 ++++++ src/main/java/state/StateCircle1.java | 32 +++++++++++++++++++ src/main/java/state/StateMoveShape.java | 40 ++++++++++++++++++++++++ src/main/java/state/StateRectangle0.java | 30 ++++++++++++++++++ src/main/java/state/StateRectangle1.java | 35 +++++++++++++++++++++ 12 files changed, 239 insertions(+), 5 deletions(-) create mode 100644 src/main/java/state/NullDrawerState.java create mode 100644 src/main/java/state/Shapes.java create mode 100644 src/main/java/state/StateCircle1.java create mode 100644 src/main/java/state/StateMoveShape.java create mode 100644 src/main/java/state/StateRectangle0.java create mode 100644 src/main/java/state/StateRectangle1.java diff --git a/src/main/java/shape/Circle.java b/src/main/java/shape/Circle.java index 3c2060c..33184a5 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 b57f9df..97ac381 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 c6e5f27..5e2b152 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 f82de39..8a36641 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 680324c..ce79e22 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 0000000..11f4543 --- /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 0000000..9e49a93 --- /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 073c481..c3608de 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 0000000..c8d87e6 --- /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 0000000..b6e8275 --- /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 0000000..d311145 --- /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 0000000..c4ce100 --- /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) { + + } +} -- GitLab