From b5812879c1ef5fa80669d7ae20618deb7603440e Mon Sep 17 00:00:00 2001
From: "hugo.debuyser.etu" <hugo.debuyser.etu@univ-lille.fr>
Date: Mon, 21 Oct 2024 21:37:34 +0200
Subject: [PATCH] =?UTF-8?q?Modifications=20de=20fichiers=20FXML=20et=20ajo?=
 =?UTF-8?q?ut=20de=20la=20fonctionnalit=C3=A9=20pour=20modifier=20les=20ax?=
 =?UTF-8?q?es=20sur=20une=20vue?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 res/stages/axes-settings-stage.fxml           |  2 +-
 res/stages/data-view-stage.fxml               |  3 +-
 res/stages/main-stage.fxml                    | 15 ++++-
 .../controller/AxesSettingsController.java    | 31 +++++++++-
 .../controller/LoadDataController.java        |  5 --
 .../controller/MainStageController.java       | 11 +++-
 .../model/ClassificationModel.java            |  3 +-
 .../sae/classification/model/Iris.java        | 28 ++++++++++
 .../classification/model/LoadableData.java    |  2 +
 .../classification/view/AxesSettingsView.java | 56 +++++++++++++++++++
 .../classification/view/MainStageView.java    | 36 +++++++++---
 11 files changed, 171 insertions(+), 21 deletions(-)
 create mode 100644 src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java

diff --git a/res/stages/axes-settings-stage.fxml b/res/stages/axes-settings-stage.fxml
index 8fb6b84..3fa1c37 100644
--- a/res/stages/axes-settings-stage.fxml
+++ b/res/stages/axes-settings-stage.fxml
@@ -24,7 +24,7 @@
                            <ChoiceBox fx:id="selectAbs" prefWidth="150.0" />
                         </children>
                      </HBox>
-                     <Button fx:id="confirmAxes" mnemonicParsing="false" text="Valider" />
+                     <Button fx:id="confirmAxes" onAction="#validate" mnemonicParsing="false" text="Valider" />
                   </children>
                </VBox>
             </children></AnchorPane>
diff --git a/res/stages/data-view-stage.fxml b/res/stages/data-view-stage.fxml
index d35ef9f..4eaff3a 100644
--- a/res/stages/data-view-stage.fxml
+++ b/res/stages/data-view-stage.fxml
@@ -35,7 +35,8 @@
                               </graphic>
                               <HBox.margin>
                                  <Insets right="10.0" top="30.0" />
-                              </HBox.margin></Button>
+                              </HBox.margin>
+                           </Button>
                         </children>
                      </HBox>
                   </children>
diff --git a/res/stages/main-stage.fxml b/res/stages/main-stage.fxml
index d322968..0aed70e 100644
--- a/res/stages/main-stage.fxml
+++ b/res/stages/main-stage.fxml
@@ -6,6 +6,9 @@
 <?import javafx.scene.layout.*?>
 <?import javafx.stage.*?>
 
+<?import javafx.scene.image.ImageView?>
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.image.Image?>
 <Stage fx:id="stage" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.MainStageController">
     <scene>
         <Scene>
@@ -24,7 +27,17 @@
                                <NumberAxis fx:id="ordAxe" side="LEFT" />
                              </yAxis>
                            </ScatterChart>
-                           <Button fx:id="settings" mnemonicParsing="false" text="Réglage" />
+                            <Button fx:id="settingsView" onAction="#openAxesSetting" mnemonicParsing="false">
+                                <graphic>
+                                    <ImageView fitHeight="100.0" fitWidth="30.0" pickOnBounds="true" preserveRatio="true">
+                                        <image>
+                                            <Image url="@gear.png" />
+                                        </image></ImageView>
+                                </graphic>
+                                <HBox.margin>
+                                    <Insets right="10.0" top="30.0" />
+                                </HBox.margin>
+                            </Button>
                         </children>
                      </HBox>
                      <HBox alignment="CENTER" prefHeight="169.0" prefWidth="691.0" spacing="50.0">
diff --git a/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java b/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java
index 0679ea9..4d46b66 100644
--- a/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java
+++ b/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java
@@ -1,10 +1,16 @@
 package fr.univlille.sae.classification.controller;
 
+import fr.univlille.sae.classification.view.MainStageView;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
 import javafx.scene.control.ChoiceBox;
+import javafx.stage.Stage;
+
+
+public class AxesSettingsController{
+    @FXML
+    Stage stage;
 
-public class AxesSettingsController {
     @FXML
     ChoiceBox selectOrd;
 
@@ -13,4 +19,27 @@ public class AxesSettingsController {
 
     @FXML
     Button confirmAxes;
+
+    MainStageView mainStageView;
+
+    public void setSelectOrd(String[] fields){
+        selectOrd.getItems().clear();
+        selectOrd.getItems().addAll(fields);
+    }
+
+    public void setSelectAbs(String[] fields){
+        selectAbs.getItems().clear();
+        selectAbs.getItems().addAll(fields);
+    }
+
+    public void setMainStageView(MainStageView mainStageView) {
+        this.mainStageView = mainStageView;
+    }
+
+    public void validate(){
+        mainStageView.setActualX(selectAbs.getValue().toString());
+        mainStageView.setActualY(selectOrd.getValue().toString());
+        mainStageView.update(mainStageView.getModel());
+        stage.close();
+    }
 }
diff --git a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java
index 965120d..cf27808 100644
--- a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java
+++ b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java
@@ -30,15 +30,12 @@ public class LoadDataController {
 
 
     public void loadData() {
-
         System.out.println("Loading data");
         stage.close();
-
     }
 
 
     public void openFileChooser() {
-
         FileChooser fileChooser = new FileChooser();
         fileChooser.setTitle("Choisissez le fichier à importer");
          this.file = fileChooser.showOpenDialog(stage);
@@ -47,8 +44,6 @@ public class LoadDataController {
             filePath.setText(file.getPath());
         }
 
-
-
     }
 
     public void validate() throws IOException {
diff --git a/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java b/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java
index 43599c8..aa6fa20 100644
--- a/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java
+++ b/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java
@@ -1,7 +1,9 @@
 package fr.univlille.sae.classification.controller;
 
 import fr.univlille.sae.classification.model.ClassificationModel;
+import fr.univlille.sae.classification.view.AxesSettingsView;
 import fr.univlille.sae.classification.view.LoadDataView;
+import fr.univlille.sae.classification.view.MainStageView;
 import fr.univlille.sae.classification.view.AddDataView;
 import javafx.fxml.FXML;
 
@@ -42,17 +44,24 @@ public class MainStageController {
 
 
     Stage loadStage;
+    private MainStageView mainStageView;
 
     /**
      * Ouvre l'interface de chargement des données.
      * @throws IOException
      */
     public void openLoadData() throws IOException {
-
         LoadDataView loadDataView = new LoadDataView(ClassificationModel.getClassificationModel(), stage);
         loadDataView.show();
+    }
 
+    public void openAxesSetting()throws IOException {
+        AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, mainStageView);
+        axesSettingsView.show();
+    }
 
+    public void setMainStageView(MainStageView mainStageView) {
+        this.mainStageView = mainStageView;
     }
 
     /**
diff --git a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java
index b878ee7..b581562 100644
--- a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java
+++ b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java
@@ -19,9 +19,9 @@ public class ClassificationModel extends Observable {
 
     private DataType type;
 
-
     private static ClassificationModel model;
 
+
     /**
      * Renvoie une instance unique du model. Par default le type de ce modele est Iris.
      * Modifier en .setType(DataType).
@@ -102,7 +102,6 @@ public class ClassificationModel extends Observable {
         return dataToClass;
     }
 
-
     public DataType getType() {
         return type;
     }
diff --git a/src/main/java/fr/univlille/sae/classification/model/Iris.java b/src/main/java/fr/univlille/sae/classification/model/Iris.java
index 629f3b6..8d4d2c0 100644
--- a/src/main/java/fr/univlille/sae/classification/model/Iris.java
+++ b/src/main/java/fr/univlille/sae/classification/model/Iris.java
@@ -46,6 +46,34 @@ public class Iris extends LoadableData{
         return petalLength;
     }
 
+    public double getDataType(String axes){
+        if(axes==null){
+            return sepalWidth;
+        }
+        switch (axes){
+            case "sepalWidth":
+                return sepalWidth;
+            case "sepalLength":
+                return sepalLength;
+            case "petalWidth":
+                return petalWidth;
+            case "petalLength":
+                return petalLength;
+            default:
+                return sepalLength;
+        }
+    }
+
+    public String[] getAttributesName() {
+        String[] names = new String[]{
+                "sepalWidth",
+                "sepalLength",
+                "petalWidth",
+                "petalLength"
+        };
+        return names;
+    }
+
     @Override
     public String toString() {
         return "Iris{" +
diff --git a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java
index 27678aa..3e4743d 100644
--- a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java
+++ b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java
@@ -27,4 +27,6 @@ public abstract class LoadableData {
         this.classification = classification;
     }
 
+    public abstract String[] getAttributesName();
+
 }
diff --git a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java
new file mode 100644
index 0000000..d5cc72f
--- /dev/null
+++ b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java
@@ -0,0 +1,56 @@
+package fr.univlille.sae.classification.view;
+
+import fr.univlille.sae.classification.controller.AxesSettingsController;
+import fr.univlille.sae.classification.controller.MainStageController;
+import fr.univlille.sae.classification.model.ClassificationModel;
+import fr.univlille.sae.classification.model.LoadableData;
+import javafx.fxml.FXMLLoader;
+import javafx.stage.Modality;
+import javafx.stage.Stage;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+public class AxesSettingsView {
+
+
+    private ClassificationModel model;
+    private Stage owner;
+    private MainStageView mainStageView;
+
+    public AxesSettingsView(ClassificationModel model, Stage owner, MainStageView mainStageView){
+        this.model = model;
+        this.owner = owner;
+        this.mainStageView = mainStageView;
+    }
+
+    public void show() throws IOException {
+
+        FXMLLoader loader = new FXMLLoader();
+        URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "axes-settings-stage.fxml").toURI().toURL();
+
+        if (fxmlFileUrl == null) {
+            System.out.println("Impossible de charger le fichier fxml");
+            System.exit(-1);
+        }
+        loader.setLocation(fxmlFileUrl);
+        Stage root = loader.load();
+
+        root.setResizable(false);
+        root.initOwner(owner);
+        root.initModality(Modality.APPLICATION_MODAL);
+        root.setTitle("Configuration des axes");
+        AxesSettingsController controller = loader.getController();
+
+        LoadableData dataType = model.getDatas().get(0);
+
+        controller.setMainStageView(mainStageView);
+
+        controller.setSelectAbs(dataType.getAttributesName());
+        controller.setSelectOrd(dataType.getAttributesName());
+
+        root.showAndWait();
+
+    }
+}
diff --git a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java
index 7d3163b..4a74452 100644
--- a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java
+++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java
@@ -21,13 +21,12 @@ import java.net.URL;
 
 public class MainStageView implements Observer {
 
-
-
-
     private ClassificationModel model;
-
     private ScatterChart scatterChart;
 
+    private String actualX;
+    private String actualY;
+
     public MainStageView(ClassificationModel model) {
         this.model = model;
         model.attach(this);
@@ -50,6 +49,7 @@ public class MainStageView implements Observer {
         root.show();
         loader.getController();
         MainStageController controller = loader.getController();
+        controller.setMainStageView(this);
         scatterChart = controller.getScatterChart();
 
     }
@@ -58,23 +58,41 @@ public class MainStageView implements Observer {
     @Override
     public void update(Observable observable) {
         if(scatterChart == null) throw new IllegalStateException();
+        scatterChart.getData().clear();
         if(!(observable instanceof ClassificationModel)) throw new IllegalStateException();
         XYChart.Series series1 = new XYChart.Series();
         series1.setName("Dice Launch");
         scatterChart.getData().add(series1);
         for(LoadableData i : model.getDatas()) {
             if(model.getType() == DataType.IRIS) {
-                series1.getData().add(new XYChart.Data<>(((Iris)i).getPetalLength(),
-                        ((Iris)i).getPetalWidth()));
-
+                series1.getData().add(new XYChart.Data<>(((Iris)i).getDataType(actualX),
+                        ((Iris)i).getDataType(actualY)));
             }
         }
-
-
     }
 
     @Override
     public void update(Observable observable, Object data) {
 
     }
+
+    public String getActualX() {
+        return actualX;
+    }
+
+    public String getActualY() {
+        return actualY;
+    }
+
+    public void setActualX(String actualX) {
+        this.actualX = actualX;
+    }
+
+    public void setActualY(String actualY) {
+        this.actualY = actualY;
+    }
+
+    public Observable getModel() {
+        return this.model;
+    }
 }
-- 
GitLab