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