From 0c2c3ee5a55f36d270171f2f67938542e251fdc5 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 2 Jul 2026 00:14:17 +0200 Subject: fork utilisant maven --- src/main/java/vue/AfficheAccueil.java | 108 +++++++++ src/main/java/vue/AfficheAdmin.java | 151 +++++++++++++ src/main/java/vue/AfficheConnexion.java | 54 +++++ src/main/java/vue/AfficheConnexionFailed.java | 56 +++++ src/main/java/vue/AfficheCreationCompte.java | 56 +++++ src/main/java/vue/AfficheCreerListe.java | 248 +++++++++++++++++++++ src/main/java/vue/AfficheEvenement.java | 88 ++++++++ src/main/java/vue/AfficheGestionCompte.java | 131 +++++++++++ src/main/java/vue/AfficheTopMenu.java | 116 ++++++++++ .../java/vue/GestionListe/AfficheGestionListe.java | 126 +++++++++++ .../vue/GestionListe/AfficheModificationListe.java | 165 ++++++++++++++ .../java/vue/simulation/AfficheSimulation.java | 201 +++++++++++++++++ .../java/vue/simulation/SimAptAndWeaponsVBox.java | 130 +++++++++++ src/main/java/vue/simulation/SimFigurinesVBox.java | 139 ++++++++++++ src/main/java/vue/simulation/SimHistogramme.java | 101 +++++++++ src/main/java/vue/simulation/SimUnitsVBox.java | 65 ++++++ 16 files changed, 1935 insertions(+) create mode 100644 src/main/java/vue/AfficheAccueil.java create mode 100644 src/main/java/vue/AfficheAdmin.java create mode 100644 src/main/java/vue/AfficheConnexion.java create mode 100644 src/main/java/vue/AfficheConnexionFailed.java create mode 100644 src/main/java/vue/AfficheCreationCompte.java create mode 100644 src/main/java/vue/AfficheCreerListe.java create mode 100644 src/main/java/vue/AfficheEvenement.java create mode 100644 src/main/java/vue/AfficheGestionCompte.java create mode 100644 src/main/java/vue/AfficheTopMenu.java create mode 100644 src/main/java/vue/GestionListe/AfficheGestionListe.java create mode 100644 src/main/java/vue/GestionListe/AfficheModificationListe.java create mode 100644 src/main/java/vue/simulation/AfficheSimulation.java create mode 100644 src/main/java/vue/simulation/SimAptAndWeaponsVBox.java create mode 100644 src/main/java/vue/simulation/SimFigurinesVBox.java create mode 100644 src/main/java/vue/simulation/SimHistogramme.java create mode 100644 src/main/java/vue/simulation/SimUnitsVBox.java (limited to 'src/main/java/vue') diff --git a/src/main/java/vue/AfficheAccueil.java b/src/main/java/vue/AfficheAccueil.java new file mode 100644 index 0000000..957a249 --- /dev/null +++ b/src/main/java/vue/AfficheAccueil.java @@ -0,0 +1,108 @@ +package vue; + +import java.util.ArrayList; + +import controlleur.Connexion; +import controlleur.EvenementController; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.scene.text.Font; +import javafx.stage.Stage; +import modele.Evenement; +import modele.User; + +public class AfficheAccueil { + + private static VBox vEvt; + + public static void affiche(Stage primaryStage,User session) { + + + VBox root = new VBox(); + Scene scene = new Scene(root,800,600); + + AfficheTopMenu menu = new AfficheTopMenu(primaryStage,session); + //AfficheTopMenu.setHgrow(root, Priority.ALWAYS); + + + vEvt = AfficheEvenement.NewAfficheEvenement(primaryStage, session); + + root.getChildren().add(menu); + + + + Label titre = new Label("StatHammer"); + VBox cadre = new VBox(); + VBox cadreImage = new VBox(); + HBox capsule = new HBox(); + + Button simulation = new Button("SIMULATION"); + Button creeListe = new Button("CREER LISTE"); + Button gererListe = new Button("GERER LISTE"); + /* + Image accueil = new Image("images/accueil.jpg"); + ImageView iv1 = new ImageView(); + iv1.setImage(accueil); + iv1.setFitWidth(700); + iv1.setPreserveRatio(true); + iv1.setSmooth(true); + iv1.setCache(true); + */ + + + + titre.setFont(Font.font(32)); + titre.setPrefHeight(150); + + creeListe.setPrefWidth(200); + creeListe.setPrefHeight(50); + + simulation.setPrefWidth(200); + simulation.setPrefHeight(50); + + gererListe.setPrefWidth(200); + gererListe.setPrefHeight(50); + + root.getChildren().add(titre); + root.getChildren().add(vEvt); + root.getChildren().add(capsule); + + + capsule.getChildren().add(cadreImage); + capsule.getChildren().add(cadre); + + + cadre.setPrefSize(300, 800); + cadre.setAlignment(Pos.CENTER); + + /* + cadreImage.setPrefSize(900, 800); + cadreImage.setAlignment(Pos.CENTER); + + cadreImage.getChildren().add(iv1);*/ + /*cadre.getChildren().add(simulation); + cadre.getChildren().add(creeListe); + cadre.getChildren().add(gererListe); + + + + + + simulation.setOnAction(e -> { + primaryStage.close(); + AfficheSimulation.affiche(primaryStage); + + }); + */ + root.setAlignment(Pos.TOP_CENTER); + primaryStage.setScene(scene); + primaryStage.show(); + } +} \ No newline at end of file diff --git a/src/main/java/vue/AfficheAdmin.java b/src/main/java/vue/AfficheAdmin.java new file mode 100644 index 0000000..565a18a --- /dev/null +++ b/src/main/java/vue/AfficheAdmin.java @@ -0,0 +1,151 @@ +package vue; + +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.DatePicker; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.scene.text.Font; +import javafx.scene.text.Text; +import javafx.stage.FileChooser; +import javafx.stage.Stage; +import modele.Evenement; +import modele.User; +import javafx.scene.control.TextField; +//import java.awt.TextArea; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +import controlleur.BDD; +import controlleur.ControllerAdmin; +import controlleur.EvenementController; + +public class AfficheAdmin { + private static VBox events; + private static Stage stage; + private static User sess; + + public static Stage getStage() { + return stage; + } + + public static void setStage(Stage stage) { + AfficheAdmin.stage = stage; + } + + public static User getSess() { + return sess; + } + + public static void setSess(User sess) { + AfficheAdmin.sess = sess; + } + + public static VBox getEvents() { + return events; + } + + public static void affiche(Stage primaryStage, User session) { + stage = primaryStage; + sess = session; + events = EvenementController.EvenementVBox(); + AfficheTopMenu menu = new AfficheTopMenu(stage,sess); + Text titre = new Text("Mes évènements"); + titre.setFont(Font.font("Arial", 30)); + titre.setFill(Color.web("#2C3E50")); + titre.setStroke(Color.web("#34495E")); + titre.setStrokeWidth(1); + + + // Création du DatePicker + DatePicker date = new DatePicker(); + date.setMaxWidth(60); + + VBox vTitre = new VBox(titre); + Button parcourir = new Button("Parcourir"); + Button valider = new Button("Valider"); + TextField nom = new TextField(""); + nom.setPromptText("Nom de l'évènement"); + TextField descEvent = new TextField(); + descEvent.setPromptText("Quelques mots pour votre évènement ?"); + descEvent.setPrefWidth(250); + + // Création d'un ImageView pour afficher l'image + ImageView imageView = new ImageView(); + imageView.setPreserveRatio(true); + imageView.setFitWidth(80); + + // Action des boutons + parcourir.setOnAction(e -> { + ControllerAdmin.parcourir(stage, imageView); + }); + + valider.setOnAction(e -> { + if (nom.getText().isEmpty() || descEvent.getText().isEmpty()||ControllerAdmin.getFile() == null){ + + // Affichage du message d'erreur si n champ est vide + showErrorMessage("Tous les champs doivent être remplis."); + } + else { + // Récupération de la date sélectionnée + LocalDate localDate = date.getValue(); + + if (localDate != null) { + // Formater la date en chaîne de caractères au format "yyyy-MM-dd" + String dateString = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); + System.out.println("Date sélectionnée : " + dateString); + System.out.println(dateString); + System.out.println("Date sélectionnée (java.util.Date) : " + dateString); + events = ControllerAdmin.valider(nom.getText(),ControllerAdmin.getFile().getName(),descEvent.getText(), dateString); + AfficheAdmin.affiche(stage, sess); + } + else { + + // Affichage du message d'erreur si n champ est vide + showErrorMessage("Tous les champs doivent être remplis."); + } + } + }); + + // VBox principal + HBox hbox = new HBox(20); + hbox.getChildren().addAll(nom, imageView, descEvent, date, parcourir, valider); + hbox.setAlignment(Pos.CENTER); + + VBox root = new VBox(); + root.getChildren().addAll(menu,vTitre,hbox,events); + + // Ajout du VBox à la scène + Scene scene = new Scene(root, 800, 600); + + // Ajout d'un titre à la fenêtre + primaryStage.setTitle("StatHammer : Admin"); + primaryStage.setScene(scene); + primaryStage.show(); + } + + public static void setEvents(VBox events) { + AfficheAdmin.events = events; + } + + // Méthode pour afficher une erreur + private static void showErrorMessage(String message) { + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("StatHammer : Erreur dans le formulaire"); + alert.setHeaderText(null); + alert.setContentText(message); + alert.showAndWait(); + } + +} diff --git a/src/main/java/vue/AfficheConnexion.java b/src/main/java/vue/AfficheConnexion.java new file mode 100644 index 0000000..5608ab7 --- /dev/null +++ b/src/main/java/vue/AfficheConnexion.java @@ -0,0 +1,54 @@ +package vue; + +import controlleur.BDD; +import controlleur.Connexion; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class AfficheConnexion { + public static void affiche(Stage primaryStage) { + VBox root = new VBox(); + Scene scene = new Scene(root, 800, 600); + TextField pseudo = new TextField(); + PasswordField mdp = new PasswordField(); + Label nomPseudo = new Label("Pseudo"); + Label nomMdp = new Label("Mot de passe"); + Button envoi = new Button("Connexion"); + Button creaCompte = new Button("Créer un compte"); + + root.getChildren().add(nomPseudo); + root.getChildren().add(pseudo); + root.getChildren().add(nomMdp); + root.getChildren().add(mdp); + root.getChildren().add(envoi); + root.getChildren().add(creaCompte); + + mdp.setMaxWidth(200); + pseudo.setMaxWidth(200); + + pseudo.setAlignment(Pos.CENTER); + mdp.setAlignment(Pos.CENTER); + root.setAlignment(Pos.CENTER); + + //BDD.setInfos("400129","stathammer_greta_admin","stathammer_v1"); + BDD.setInfos("root","qsdfgh","stathammer"); + + creaCompte.setOnAction(e -> { + AfficheCreationCompte.affiche(primaryStage); + }); + + envoi.setOnAction(e -> { + + Connexion.verif(pseudo.getText(), mdp.getText(), primaryStage); + }); + + primaryStage.setScene(scene); + primaryStage.show(); + } +} diff --git a/src/main/java/vue/AfficheConnexionFailed.java b/src/main/java/vue/AfficheConnexionFailed.java new file mode 100644 index 0000000..0f6ab38 --- /dev/null +++ b/src/main/java/vue/AfficheConnexionFailed.java @@ -0,0 +1,56 @@ +package vue; + +import controlleur.Connexion; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.stage.Stage; + +public class AfficheConnexionFailed { + public static void affiche(Stage primaryStage) { + VBox root = new VBox(); + Scene scene = new Scene(root, 800, 600); + TextField pseudo = new TextField(); + PasswordField mdp = new PasswordField(); + Label nomPseudo = new Label("Pseudo"); + Label nomMdp = new Label("Mot de passe"); + Button envoi = new Button("Connexion"); + Button creaCompte = new Button("Créer un compte"); + Label erreur = new Label("Mauvais Login et/ou MDP"); + + erreur.setTextFill(Color.RED); + erreur.setAlignment(Pos.CENTER); + + root.getChildren().add(nomPseudo); + root.getChildren().add(pseudo); + root.getChildren().add(nomMdp); + root.getChildren().add(mdp); + root.getChildren().add(envoi); + root.getChildren().add(creaCompte); + root.getChildren().add(erreur); + + mdp.setMaxWidth(200); + pseudo.setMaxWidth(200); + + pseudo.setAlignment(Pos.CENTER); + mdp.setAlignment(Pos.CENTER); + root.setAlignment(Pos.CENTER); + + envoi.setOnAction(e -> { + + Connexion.verif(pseudo.getText(), mdp.getText(), primaryStage); + }); + creaCompte.setOnAction(e -> { + AfficheCreationCompte.affiche(primaryStage); + }); + + primaryStage.setScene(scene); + primaryStage.show(); + } + +} diff --git a/src/main/java/vue/AfficheCreationCompte.java b/src/main/java/vue/AfficheCreationCompte.java new file mode 100644 index 0000000..0714103 --- /dev/null +++ b/src/main/java/vue/AfficheCreationCompte.java @@ -0,0 +1,56 @@ +package vue; + +import controlleur.CreationCompte; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class AfficheCreationCompte { + public static void affiche(Stage primaryStage) { + VBox root = new VBox(); + Scene scene = new Scene(root, 800, 600); + TextField Email = new TextField(); + TextField Pseudo = new TextField(); + PasswordField Mdp = new PasswordField(); + Label nomEmail = new Label("Email"); + Label nomPseudo = new Label("Pseudonyme"); + Label nomMdp = new Label("Mot de passe"); + Button envoi = new Button("Créer un compte"); + Button getback = new Button("Retour page de connexion"); + + root.getChildren().add(nomEmail); + root.getChildren().add(Email); + root.getChildren().add(nomPseudo); + root.getChildren().add(Pseudo); + root.getChildren().add(nomMdp); + root.getChildren().add(Mdp); + root.getChildren().add(envoi); + root.getChildren().add(getback); + + Email.setMaxWidth(200); + Pseudo.setMaxWidth(200); + Mdp.setMaxWidth(200); + + Email.setAlignment(Pos.CENTER); + Pseudo.setAlignment(Pos.CENTER); + Mdp.setAlignment(Pos.CENTER); + root.setAlignment(Pos.CENTER); + + envoi.setOnAction(e -> { + + CreationCompte.verif(Email.getText(), Pseudo.getText(), String.valueOf(Mdp.getText().hashCode()), primaryStage); + }); + getback.setOnAction(e -> { + + CreationCompte.getBack(primaryStage); + }); + + primaryStage.setScene(scene); + primaryStage.show(); + } +} diff --git a/src/main/java/vue/AfficheCreerListe.java b/src/main/java/vue/AfficheCreerListe.java new file mode 100644 index 0000000..4c5bd70 --- /dev/null +++ b/src/main/java/vue/AfficheCreerListe.java @@ -0,0 +1,248 @@ +package vue; + +import java.awt.Dimension; +import controlleur.Instanciation; +import controlleur.StockageCreerListe; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.text.Font; +import javafx.stage.Stage; +import modele.Bouton; +import modele.User; + +public class AfficheCreerListe { + public static void afficheCreerListe(Stage primaryStage,User session) { + + //Definission hauteur largeur pour afficher un peu responsive + Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); + double hauteur = tailleEcran.getHeight()/2; + double largeur = tailleEcran.getWidth()/2; + + + + + + AfficheTopMenu menu = new AfficheTopMenu(primaryStage, session); + //initialisation de toute les variables pour l'affichage + VBox root = new VBox(); + HBox boite = new HBox(); + VBox gauche = new VBox(); + VBox droite = new VBox(); + HBox entete = new HBox(); + VBox gaucheCorps = new VBox(); + HBox corpTete = new HBox(); + VBox droiteCorps= new VBox(); + Scene scene = new Scene(root,largeur,hauteur); + Label titre = new Label("StatHammer"); + Image logoFaction = new Image("images/wip.jpg"); + ImageView iv1 = new ImageView(logoFaction); + ImageView iv2 = new ImageView(logoFaction); + Button creation = new Button("Créer et sauvegarder une Armée"); + TextField nomArmee = new TextField(); + ScrollPane toutUnit = new ScrollPane(); + ScrollPane unitSauv = new ScrollPane(); + VBox gaucheUnit = new VBox(); + ChoiceBox faction = new ChoiceBox<>(); + ChoiceBox groupe = new ChoiceBox<>(); + StockageCreerListe.initArmeeListe(); + + //remplissage de la liste des factions disponibles dans une variable static + StockageCreerListe.initFaction(); + + //Affichage des noms des faction récuperer dans le stockage static + for(String fac:StockageCreerListe.getNomFac()) { + faction.getItems().add(fac); + } + faction.setValue(faction.getItems().getFirst()); + + + + + //remplissage de la liste des Armée disponibles dans une variable static + StockageCreerListe.initArmee(faction.getValue()); + + //affichage des Armée disponible dans un faction séléctionnée + for(String armee:StockageCreerListe.getNomArmee()) { + groupe.getItems().add(armee); + } + groupe.setValue(groupe.getItems().getFirst()); + + + //action liste déroulante pour changer de faction et les armée afficher en conséquence + faction.setOnAction(e->{ + groupe.getItems().clear(); + + StockageCreerListe.initArmee(faction.getValue()); + for(String armee:StockageCreerListe.getNomArmee()) { + groupe.getItems().add(armee); + } + groupe.setValue(groupe.getItems().getFirst()); + }); + + //remplissage des unitéd d'une armée séléctionnée dans une variable static + StockageCreerListe.initUnit(groupe.getValue()); + + //affichage de la liste des unité présente dans l'armée séléctionnée + for(String unit : StockageCreerListe.getNomUnit()) { + + //action sur le bouton + permettant d'ajouter l'unité à la liste de l'armée en création + droiteCorps.getChildren().add(new HBox(new Label(unit.toString() ),new Bouton("+").setOnAction2(e->{ + gaucheUnit.getChildren().clear(); + //verification que l'unité ne fait pas déjà parti de l'armée en cours de création + if(!StockageCreerListe.getArmeeListe().getUnits().contains(StockageCreerListe.getUnit(unit))) { + StockageCreerListe.getUnit(unit).setFigurine(Instanciation.getFigurine2(unit)) ; + StockageCreerListe.getArmeeListe().addUnit(StockageCreerListe.getUnit(unit)); + } + + //affichage des unité de l'armée en cours de création + for(String unit2:StockageCreerListe.getArmeeListe().getUnitNames()) { + //action du bouton - permettant de retirer une unité de l'armée en cours de création + gaucheUnit.getChildren().add(new HBox(new Label(unit2.toString() ),new Bouton("-").setOnAction2(z->{ + gaucheUnit.getChildren().remove( + StockageCreerListe.getArmeeListe().getUnits().indexOf(StockageCreerListe.getUnit(unit2))); + StockageCreerListe.getArmeeListe().removeUnit(StockageCreerListe.getUnit(unit2)); + + + }))); + } + + }))); + + } + + //Meme action que plus haut à faire au moment du changement de choix d'une armée + groupe.setOnAction(e->{ + + StockageCreerListe.initUnit(groupe.getValue()); + droiteCorps.getChildren().clear(); + StockageCreerListe.getArmeeListe().getUnits().clear(); + for(String unit : StockageCreerListe.getNomUnit()) { + + droiteCorps.getChildren().add(new HBox(new Label(unit.toString() ),new Bouton("+").setOnAction2(y->{ + gaucheUnit.getChildren().clear(); + + if(!StockageCreerListe.getArmeeListe().getUnits().contains(StockageCreerListe.getUnit(unit))) { + StockageCreerListe.getUnit(unit).setFigurine(Instanciation.getFigurine2(unit)) ; + StockageCreerListe.getArmeeListe().addUnit(StockageCreerListe.getUnit(unit)); + } + for(String unit2:StockageCreerListe.getArmeeListe().getUnitNames()) { + gaucheUnit.getChildren().add(new HBox(new Label(unit2.toString() ),new Bouton("-").setOnAction2(z->{ + gaucheUnit.getChildren().remove( + StockageCreerListe.getArmeeListe().getUnits().indexOf(StockageCreerListe.getUnit(unit2))); + StockageCreerListe.getArmeeListe().removeUnit(StockageCreerListe.getUnit(unit2)); + + }))); + } + }))); + + } + }); + + //assemblage des éléments visuels + iv1.setFitHeight(hauteur/15); + iv1.setPreserveRatio(true); + iv1.setSmooth(true); + iv1.setCache(true); + + iv2.setFitHeight(hauteur/15); + iv2.setPreserveRatio(true); + iv2.setSmooth(true); + iv2.setCache(true); + + titre.setFont(Font.font(32)); + titre.setPrefHeight(50); + titre.setAlignment(Pos.CENTER); + + boite.getChildren().addAll(gauche,droite); + boite.setAlignment(Pos.CENTER); + + gauche.getChildren().add(entete); + gauche.getChildren().add(gaucheCorps); + gauche.setPrefWidth(largeur/2); + gauche.setPrefHeight(hauteur); + gauche.setMaxWidth(largeur/2); + gauche.setMaxHeight(hauteur); + + + droite.getChildren().add(toutUnit); + droite.setPrefWidth(largeur/2); + droite.setPrefHeight(hauteur); + droite.setMaxWidth(largeur/2); + droite.setMaxHeight(hauteur); + + + toutUnit.setFitToHeight(true); + toutUnit.setContent(droiteCorps); + + entete.getChildren().addAll(creation,nomArmee,faction,iv1); + entete.setAlignment(Pos.CENTER); + entete.setMaxHeight(hauteur/15); + + //Bouton de validation de création d'une armée pour sauvegarder l'armée en base de donnée + creation.setOnAction(e->{ + //verification que l'armée soit nommé et NON VIDE + if(nomArmee.getText().trim().equals("") || StockageCreerListe.getArmeeListe().getUnits().size()==0) { + //affichage d'une boite d'erreur si nom vide ou armée sans unité + Stage secondaryStage = new Stage(); + HBox boitesecondaire = new HBox(); + Scene secondScene = new Scene(boitesecondaire,200,100); + Label error = new Label("ERREUR Armee vide ET/OU sans nom"); + boitesecondaire.getChildren().add(error); + boitesecondaire.setAlignment(Pos.CENTER); + secondaryStage.setScene(secondScene); + secondaryStage.setTitle("Error"); + secondaryStage.show(); + }else { + //sauvegarde de l'armée dans la variable de session ainsi que dans la BDD + StockageCreerListe.getArmeeListe().setNom(nomArmee.getText()); + session.getListes().add(StockageCreerListe.getArmeeListe()); + try { + + Instanciation.insertListe(StockageCreerListe.getArmeeListe(), session); + + AfficheAccueil.affiche(primaryStage, session); + + } catch (Exception e2) { + // TODO: handle exception + } + } + + }); + + + gaucheCorps.getChildren().add(corpTete); + gaucheCorps.getChildren().add(unitSauv); + + unitSauv.setContent(gaucheUnit); + unitSauv.setFitToHeight(true); + + + + corpTete.getChildren().addAll(groupe,iv2); + corpTete.setAlignment(Pos.CENTER); + corpTete.setMaxHeight(hauteur/15); + + root.getChildren().add(menu); + root.setAlignment(Pos.CENTER); + root.getChildren().add(titre); + root.getChildren().add(boite); + + + + + + primaryStage.setScene(scene); + primaryStage.setTitle("Création de l'armée"); + primaryStage.show(); + } +} + diff --git a/src/main/java/vue/AfficheEvenement.java b/src/main/java/vue/AfficheEvenement.java new file mode 100644 index 0000000..9188476 --- /dev/null +++ b/src/main/java/vue/AfficheEvenement.java @@ -0,0 +1,88 @@ +package vue; + +import controlleur.Connexion; +import controlleur.EvenementController; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; +import modele.Evenement; +import modele.User; + +public class AfficheEvenement { + //private static Evenement event; + + public static VBox NewAfficheEvenement(Stage primaryStage, User session) { + + VBox main = new VBox(); + main.setSpacing(20); // Espacement entre les éléments + main.setStyle("-fx-padding: 20; -fx-alignment: center;"); // Ajout de marges autour et centrage du VBox + + HBox hBouton = new HBox(); + hBouton.setSpacing(10); // Espacement entre les boutons + hBouton.setStyle("-fx-alignment: center;"); // Alignement des boutons au centre + + // Style gothique pour le nom de l'événement + Label nomEvt = new Label(Connexion.event.getNom_evenement()); + nomEvt.setStyle("-fx-font-size: 32px; -fx-font-family: 'Times New Roman'; -fx-font-weight: bold; -fx-text-fill: #2F4F4F; -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.5), 10, 5, 2, 2);"); + nomEvt.setStyle("-fx-font-size: 32px; -fx-font-family: 'Garamond'; -fx-font-weight: bold; -fx-text-fill: #2F4F4F; -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.6), 15, 0.5, 0, 3);"); + + // Style de la date et de la description + Label dateEvt = new Label(Connexion.event.getData_evenement()); + dateEvt.setStyle("-fx-font-size: 16px; -fx-text-fill: #555555;"); // Style de la date de l'événement + + Label descEvt = new Label(Connexion.event.getDescritption_evenement()); + descEvt.setStyle("-fx-font-size: 14px; -fx-text-fill: #777777; -fx-wrap-text: true;"); + descEvt.setMaxWidth(400); // Limite la largeur de la description + + HBox hLabel = new HBox(); + hLabel.setSpacing(10); + hLabel.getChildren().add(dateEvt); + hLabel.getChildren().add(descEvt); + hLabel.setStyle("-fx-alignment: center;"); // Alignement des labels au centre + + // Ajout des boutons dans le HBox avec style "dark fantasy" modeste + for (int i = 0; i < Connexion.eventC.getNbrEvt(); i++) { + int j = i; + Button btn = new Button(Connexion.eventC.getNom_event().get(i)); + btn.setStyle("-fx-background-color: #1a1a1a; -fx-text-fill: #e6e6e6; -fx-font-size: 14px; -fx-padding: 10px 15px; -fx-border-radius: 5px; -fx-border-color: #444444; -fx-border-width: 1px;"); + btn.setOnAction(e -> { + Connexion.event = new Evenement(Connexion.eventC.getNom_event().get(j), + Connexion.eventC.getNom_image().get(j), + Connexion.eventC.getDesc_event().get(j), + Connexion.eventC.getDate_event().get(j)); + + AfficheAccueil.affiche(primaryStage, session); + }); + hBouton.getChildren().add(btn); + } + + // Image avec centrage et un peu plus de style sombre + Image imageAccueil = new Image("images/" + Connexion.event.getNom_image()); + ImageView iv1 = new ImageView(); + iv1.setImage(imageAccueil); + iv1.setFitWidth(500); + iv1.setPreserveRatio(true); + iv1.setSmooth(true); + iv1.setCache(true); + iv1.setStyle("-fx-border-radius: 10px; -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.7), 15, 3, 2, 2);"); + + // Centrer le nom et l'image dans un VBox intermédiaire + VBox centeredContent = new VBox(); + centeredContent.setSpacing(10); + centeredContent.setStyle("-fx-alignment: center;"); + centeredContent.getChildren().add(nomEvt); + centeredContent.getChildren().add(iv1); + + // Ajout des éléments dans le VBox principal + main.getChildren().add(centeredContent); // Ajout du nom et de l'image centrés + main.getChildren().add(hBouton); // Ajout des boutons + main.getChildren().add(hLabel); // Ajout de la date et description + + // Retourne le VBox stylisé + return main; + } +} diff --git a/src/main/java/vue/AfficheGestionCompte.java b/src/main/java/vue/AfficheGestionCompte.java new file mode 100644 index 0000000..829ec99 --- /dev/null +++ b/src/main/java/vue/AfficheGestionCompte.java @@ -0,0 +1,131 @@ +package vue; + +import java.sql.SQLException; + +import controlleur.Connexion; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextField; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.layout.VBox; +import javafx.scene.text.Font; +import javafx.stage.Stage; +import modele.Evenement; +import modele.User; + +public class AfficheGestionCompte { + +public static void affiche(Stage primaryStage,User session) { + + + + Label etiquetteM = new Label("Gestion du compte utilisateur"); + etiquetteM.setFont(new Font("Arial", 24)); + Button bouton1 = new Button("Envoyer"); + Button bouton2 = new Button("Envoyer"); + Label etiquette = new Label("Modifier le pseudonyme : "); + TextField texte = new TextField(); + Label etiquette2 = new Label("Modifier le mot de passe : "); + PasswordField texte2 = new PasswordField(); + Label etiquette3 = new Label("Confirmer avec mot de passe actuel : "); + PasswordField texte3 = new PasswordField(); + VBox vbox = new VBox(); + VBox vboxT = new VBox(); + vboxT.getChildren().add(etiquetteM); + //VBox vboxL = new VBox(); + //etiquette.setText("test"); + + AfficheTopMenu menu = new AfficheTopMenu(primaryStage,session); + + VBox vbox1 = new VBox(); + vbox1.getChildren().add(etiquette); + vbox1.getChildren().add(texte); + vbox1.getChildren().add(bouton1); + + VBox vbox2 = new VBox(); + + VBox vboxL = new VBox(); + + vbox2.getChildren().add(etiquette2); + vbox2.getChildren().add(texte2); + vbox2.getChildren().add(etiquette3); + vbox2.getChildren().add(texte3); + VBox vboxb = new VBox(); + vboxb.getChildren().add(bouton2); + vbox2.getChildren().add(vboxb); + + + + Scene scene = new Scene(vbox, 800, 600); + vbox.getChildren().add(menu); + + vbox.getChildren().add(vboxT); + vbox.getChildren().add(vbox1); + vbox.getChildren().add(vbox2); + + vboxT.setAlignment(Pos.CENTER); + vboxb.setAlignment(Pos.CENTER); + vbox.setSpacing(10); + vbox1.setSpacing(10);// Ajoute un espace de 10 pixels entre les composants + vbox1.setPadding(new Insets(20, 20, 20, 20)); // Ajoute des marges autour du conteneur + + vbox2.setSpacing(10);// Ajoute un espace de 10 pixels entre les composants + vbox2.setPadding(new Insets(20, 20, 20, 20)); // Ajoute des marges autour du conteneur + vbox1.setAlignment(Pos.CENTER); + bouton2.setAlignment(Pos.CENTER); + etiquette.setMaxWidth(Double.MAX_VALUE); + texte.setMaxWidth(Double.MAX_VALUE); + texte2.setMaxWidth(Double.MAX_VALUE); + texte3.setMaxWidth(Double.MAX_VALUE); + + bouton1.setOnAction(e -> { + if(texte.getText() != null && !texte.getText().trim().isEmpty() && texte.getText().trim().contains(" ")==false) + try { + Connexion.updatePseudo(texte.getText().trim(),session.getId()); // bdd + session.setNom(texte.getText().trim()); // instance de l'utilisateur + menu.setLogin(session.getNom()); // barre de menu + Alert alert = new Alert(AlertType.INFORMATION); + alert.setTitle("Information"); + alert.setHeaderText(null); + alert.setContentText("Le pseudo a été changé !"); + alert.showAndWait(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + }); + + bouton2.setOnAction(e -> { + + try { + String mdp =Connexion.selectMdp(session.getId()); + if (Integer.toString(texte3.getText().trim().hashCode()).equals(mdp)==true) { + + if(texte2.getText() != null && !texte2.getText().trim().isEmpty() && texte2.getText().trim().contains(" ")==false) + try { + Connexion.updateMdp(texte2.getText().trim(), session.getId()); + Alert alert2 = new Alert(AlertType.INFORMATION); + alert2.setTitle("Information"); + alert2.setHeaderText(null); + alert2.setContentText("Le mot de passe !"); + alert2.showAndWait(); + + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + } + catch (SQLException e1) { + e1.printStackTrace(); + } + }); + + primaryStage.setScene(scene); + primaryStage.show(); + } +} + diff --git a/src/main/java/vue/AfficheTopMenu.java b/src/main/java/vue/AfficheTopMenu.java new file mode 100644 index 0000000..f0449aa --- /dev/null +++ b/src/main/java/vue/AfficheTopMenu.java @@ -0,0 +1,116 @@ +package vue; + +import controlleur.ControllerTopMenu; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.Priority; +import javafx.scene.paint.Color; +import javafx.stage.Stage; +import modele.Evenement; +import modele.User; + +public class AfficheTopMenu extends HBox +{ + private Label pseudo; + + public AfficheTopMenu(Stage primaryStage, User session) + { + this.setStyle("-fx-background-color: gray; -fx-padding: 5px;"); + //-fx-spacing: 10px; + //Label title = new Label("Simulation"); // moche, à améliorer ou retirer + Button btn_account = new Button("Mon compte"); + Button btn_logout = new Button(); + Button btn_home = new Button("Accueil"); + Button btn_gerer_liste = new Button("Gerer liste"); + Button btn_creer_liste = new Button("Création liste"); + Button btn_admin = new Button("Admin"); + Button btn_simu = new Button("Simulation"); + + + HBox h1 = new HBox(); + h1.getChildren().addAll(btn_home, btn_account,btn_gerer_liste,btn_creer_liste,btn_simu); + + + + Image icons_deco = new Image("/images/deco.png"); + ImageView icons_deco_box = new ImageView(icons_deco); + btn_logout.setGraphic(icons_deco_box); + icons_deco_box.setPreserveRatio(true); + icons_deco_box.fitHeightProperty().bind(btn_account.heightProperty()); + //this.getChildren().add(h1); + //this.setAlignment(javafx.geometry.Pos.CENTER_RIGHT); + //h1.setLeft(null); + //h2.setAlignment(javafx.geometry.Pos.TOP_RIGHT); + //this.setSpacing(getMaxWidth()); + //h1.setSpacing(10);// Ajoute un espace de 10 pixels entre les composants + //h2.setPadding(new Insets(1, 1, 20, 1)); + + + + if(session.getRole().equals("Admin") ) { + h1.getChildren().add(btn_admin); + } + pseudo = new Label(session.getNom()); + //pseudo.setStyle("-fx-text-fill: white"); + pseudo.setTextFill(Color.WHITE); + pseudo.setStyle("-fx-font-weight: bold;"); + //barre.getChildren().addAll( pseudo, btn_logout); + + + //this.setAlignment(javafx.geometry.Pos.CENTER_RIGHT); + HBox h2 = new HBox(); + h2.getChildren().addAll( pseudo, btn_logout); + + h1.setSpacing(10); + h2.setSpacing(10); + Pane p = new Pane(); + HBox.setHgrow(p, Priority.ALWAYS); + this.getChildren().addAll( h1,p, h2); + this.setAlignment(javafx.geometry.Pos.TOP_CENTER); + h1.setAlignment(javafx.geometry.Pos.CENTER_LEFT); + h2.setAlignment(javafx.geometry.Pos.CENTER_RIGHT); + + + // menu principal + btn_home.setOnAction(e -> { + ControllerTopMenu.go_accueil(primaryStage,session); + }); + // gestion de son compte + btn_account.setOnAction(e -> { + ControllerTopMenu.go_gestion_compte(primaryStage,session); + }); + // gestion des listes + btn_gerer_liste.setOnAction(e -> { + ControllerTopMenu.go_gestion_listes(primaryStage,session); + }); + // page de connexion + btn_logout.setOnAction(e -> { + ControllerTopMenu.go_deco(primaryStage, session); + }); + // simulation + btn_simu.setOnAction(e -> { + ControllerTopMenu.go_simulation(primaryStage,session); + }); + + // options réservées à l'admin + btn_admin.setOnAction(e -> { + ControllerTopMenu.go_admin(primaryStage, session); + }); + + //vers creer liste + btn_creer_liste.setOnAction(e->{ + ControllerTopMenu.go_creer_liste(primaryStage,session); + }); + + } + + public void setLogin(String login) + { + pseudo.setText(login); + } + +} diff --git a/src/main/java/vue/GestionListe/AfficheGestionListe.java b/src/main/java/vue/GestionListe/AfficheGestionListe.java new file mode 100644 index 0000000..743eff4 --- /dev/null +++ b/src/main/java/vue/GestionListe/AfficheGestionListe.java @@ -0,0 +1,126 @@ +package vue.GestionListe; + +import controlleur.GestionListe; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.Label; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.stage.Stage; +import modele.ArmeeListe; +import modele.User; +import vue.AfficheAccueil; +import vue.AfficheTopMenu; +import controlleur.SupprListe; + +import java.io.File; +import java.util.ArrayList; + +public class AfficheGestionListe { + public static void affiche(Stage primaryStage, User session) { + // Liste des conteneurs principaux structurant l'interface + VBox root = new VBox(); // page principa + HBox boite = new HBox(); // Box contenant les parties bouton et liste + VBox selectBouton = new VBox(); // Partie bouton + VBox liste = new VBox(); // Partie Liste + Scene scene = new Scene(root, 1000, 800); // taille de la scène + File file = null; + + AfficheTopMenu menu = new AfficheTopMenu(primaryStage,session); + + root.getChildren().add(menu); + + // _______________ BOX BOITE _______________ + // Partie bouton + Button Retour = new Button("Retour"); + Button Import = new Button("Importer une liste"); + // dimension des boutons + Retour.setPrefSize(200, 50); + Import.setPrefSize(200, 50); + // configuration des boutons + selectBouton.setPadding(new Insets(50, 0, 0, 0)); + selectBouton.setAlignment(Pos.TOP_CENTER); + selectBouton.getChildren().addAll(Retour, Import); + selectBouton.setPrefWidth(400); + selectBouton.setBackground(Background.fill(Color.LIGHTGRAY)); + + // Conteneur des listes + liste.setPrefWidth(800); + liste.setBackground(Background.fill(Color.LIGHTGREY)); + liste.setSpacing(10); + liste.setStyle("-fx-border-color: black; -fx-border-width: 1px;"); // bordure du conteneur + + // Charger les listes de l'utilisateur + GestionListe gestionListe = new GestionListe(); + ArrayList listes = gestionListe.getArmeeListe(session.getId()); // récupération des listes avec l'id + // utilisateur + // Boucle pour afficher les listes + for (ArmeeListe armee : listes) { + VBox listeBox = new VBox(); + listeBox.setPadding(new Insets(10)); + listeBox.setSpacing(5); + listeBox.setStyle("-fx-border-color: black; -fx-border-width: 1px;"); + + Label nomListe = new Label(armee.getNomListe()); + Label descriptionListe = new Label(armee.getDescription()); + VBox uniteBox = new VBox(); + for (String unit_name : armee.getUniteListe()) { + Label nomUnite = new Label("- " + unit_name); + uniteBox.getChildren().add(nomUnite); + } + + // Ajout des boutons (Partage, Modification, Suppression) + HBox actions = new HBox(); + actions.setSpacing(10); + Button partageBtn = new Button("Exporter"); + Button modifBtn = new Button("Modifier"); + Button supprBtn = new Button("Supprimer"); + + actions.getChildren().addAll(partageBtn, modifBtn, supprBtn); + actions.setAlignment(Pos.CENTER_RIGHT); + + listeBox.getChildren().addAll(nomListe, descriptionListe, uniteBox, actions); + liste.getChildren().add(listeBox); + + modifBtn.setOnAction(e ->{ + //primaryStage.close(); + AfficheModificationListe.affiche(primaryStage, session, armee.getIdListe(), armee.getIdArmee()); + }); + + supprBtn.setOnAction(e -> { + Alert alert = new Alert(Alert.AlertType.CONFIRMATION, + "Voulez-vous vraiment supprimer la liste :" + armee.getName() + "?", ButtonType.YES, + ButtonType.NO); + alert.showAndWait().ifPresent(response -> { + if (response == ButtonType.YES) { + int idListe = armee.getId(); + SupprListe suppr = new SupprListe(); + suppr.Suppression(idListe); + + liste.getChildren().remove(listeBox); + } + }); + }); + } + // ajout des conteneurs principaux à la scène + boite.getChildren().addAll(selectBouton, liste); + root.getChildren().addAll(boite); + + // Bouton Retour + Retour.setOnAction(e -> { + AfficheAccueil.affiche(primaryStage, session); + }); + + Import.setOnAction(e -> { + GestionListe.importer(primaryStage, file); + }); + + primaryStage.setScene(scene); + primaryStage.show(); + } + +} diff --git a/src/main/java/vue/GestionListe/AfficheModificationListe.java b/src/main/java/vue/GestionListe/AfficheModificationListe.java new file mode 100644 index 0000000..e8e6a8f --- /dev/null +++ b/src/main/java/vue/GestionListe/AfficheModificationListe.java @@ -0,0 +1,165 @@ +package vue.GestionListe; + +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.stage.Stage; +import modele.ArmeeListe; +import modele.Evenement; +import modele.Figurine; +import modele.User; +import vue.AfficheTopMenu; + +import java.util.ArrayList; + +import controlleur.ModificationListe; +import javafx.geometry.Insets; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.layout.Background; +import javafx.scene.layout.HBox; + +public class AfficheModificationListe { + public static void affiche(Stage primaryStage, User session, int idListe, int idArmee) { + VBox root = new VBox(); + HBox boite = new HBox(); + VBox afficheListe = new VBox(); + + ScrollPane scrollModifListe = new ScrollPane(); + ScrollPane scrollAfficheListe = new ScrollPane(); + VBox unitDispo = new VBox(); + Scene scene = new Scene(root, 1200, 600); + + AfficheTopMenu menu = new AfficheTopMenu(primaryStage, session); + + root.getChildren().add(menu); + + ModificationListe modificationListe = new ModificationListe(); + ArrayList listes = modificationListe.getArmeeListe(idListe); + + // Listes temporaires pour les unités ajoutées et supprimées + ArrayList unitesAjoutees = new ArrayList<>(); + ArrayList unitesSupprimees = new ArrayList<>(); + + // Colonne Affichage de la liste principale + for (ArmeeListe armee : listes) { + VBox listeBox = new VBox(); + listeBox.setPadding(new Insets(10)); + listeBox.setSpacing(5); + listeBox.setStyle("-fx-border-color: black; -fx-border-width: 1px;"); + + Label nomListe = new Label(armee.getNomListe()); + VBox uniteBox = new VBox(); + for (String unite : armee.getUniteListe()) { + VBox uniteContainer = new VBox(); + + Button retirerUnit = new Button("retirer"); + uniteContainer.getChildren().add(retirerUnit); + retirerUnit.setOnAction(e -> { + if (!unitesSupprimees.contains(unite)) { + unitesSupprimees.add(unite); + uniteBox.getChildren().remove(uniteContainer); + System.out.println("Unité retirée : " + unite); + } + }); + + Label nomUnite = new Label("| " + unite); + uniteContainer.getChildren().add(nomUnite); + + // Récupérer et afficher les figurines pour cette unité + ArrayList figurines = modificationListe.getFigurineListe(idListe, unite); + for (Figurine figurine : figurines) { + Label nomFigurine = new Label(" - " + figurine.getNom()); + uniteContainer.getChildren().add(nomFigurine); + } + + uniteBox.getChildren().add(uniteContainer); + } + listeBox.getChildren().addAll(nomListe, uniteBox); + afficheListe.getChildren().add(listeBox); + } + + afficheListe.setPrefWidth(400); + afficheListe.setPrefHeight(500); + afficheListe.setBackground(Background.fill(Color.LIGHTGREY)); + + // Colonne des unités disponibles + ArrayList toutesUnites = modificationListe.getAllUnites(idArmee, idListe); + for (ArmeeListe armee : toutesUnites) { + VBox listeBox = new VBox(); + listeBox.setPadding(new Insets(10)); + listeBox.setSpacing(5); + listeBox.setStyle("-fx-border-color: black; -fx-border-width: 1px;"); + + VBox uniteBox = new VBox(); + for (String unite : armee.getUniteListe()) { + Button ajouterUnit = new Button("ajouter"); + uniteBox.getChildren().add(ajouterUnit); + ajouterUnit.setOnAction(e -> { + if (!unitesAjoutees.contains(unite)) { + unitesAjoutees.add(unite); + + // Ajouter l'unité et ses figurines à l'affichage + VBox nouvelleUniteContainer = new VBox(); + + Button nouveauRetirerUnit = new Button("retirer"); + nouvelleUniteContainer.getChildren().add(nouveauRetirerUnit); + nouveauRetirerUnit.setOnAction(event -> { + if (!unitesSupprimees.contains(unite)) { + unitesSupprimees.add(unite); + afficheListe.getChildren().remove(nouvelleUniteContainer); + System.out.println("Unité retirée : " + unite); + } + }); + + Label nouvelleUnite = new Label("| " + unite); + nouvelleUniteContainer.getChildren().add(nouvelleUnite); + + // Récupère et affiche les figurines de unité + ArrayList figurines = modificationListe.getAllFigurineListe(idArmee, unite); + for (Figurine figurine : figurines) { + Label nomFigurine = new Label(" - " + figurine.getNom()); + nouvelleUniteContainer.getChildren().add(nomFigurine); + } + + afficheListe.getChildren().add(nouvelleUniteContainer); + System.out.println("Unité ajoutée : " + unite); + } + }); + + Label nomUnite = new Label("| " + unite); + uniteBox.getChildren().add(nomUnite); + + // Récupérer et afficher les figurines de l'unité + ArrayList figurines = modificationListe.getAllFigurineListe(idArmee, unite); + for (Figurine figurine : figurines) { + Label nomFigurine = new Label(" - " + figurine.getNom()); + uniteBox.getChildren().add(nomFigurine); + } + } + listeBox.getChildren().addAll(uniteBox); + unitDispo.getChildren().add(listeBox); + } + + unitDispo.setPrefWidth(400); + unitDispo.setPrefHeight(500); + unitDispo.setBackground(Background.fill(Color.LIGHTGREY)); + scrollModifListe.setContent(unitDispo); + scrollAfficheListe.setContent(afficheListe); + + Button valider = new Button("Valider"); + valider.setOnAction(e -> { + // Envoyer les modifications à la bdd + modificationListe.ajouterUnites(idListe, unitesAjoutees); + modificationListe.supprimerUnites(idListe, unitesSupprimees); + System.out.println("Modifications validées."); + }); + + boite.getChildren().addAll(scrollModifListe, scrollAfficheListe, valider); + root.getChildren().addAll(boite); + + primaryStage.setScene(scene); + primaryStage.show(); + } +} diff --git a/src/main/java/vue/simulation/AfficheSimulation.java b/src/main/java/vue/simulation/AfficheSimulation.java new file mode 100644 index 0000000..bb658a3 --- /dev/null +++ b/src/main/java/vue/simulation/AfficheSimulation.java @@ -0,0 +1,201 @@ +package vue.simulation; + + +import vue.AfficheTopMenu; + +import java.util.ArrayList; + +import application.Battle; +import controlleur.ControlleurSimu; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.ScrollPane; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; +import modele.ArmeeListe; + +import modele.User; + +public class AfficheSimulation +{ + private static SimAptAndWeaponsVBox weapons_aptitudes_menu = new SimAptAndWeaponsVBox(); + public static boolean inversion = false; // pour le bouton inversion + + public static void refreshWeaponAndAptitude(SimAptAndWeaponsVBox wap) + { + weapons_aptitudes_menu.getChildren().clear(); + weapons_aptitudes_menu.getChildren().addAll(wap.getChildren()); // copie profonde + //weapons_aptitudes_menu.setStyle("-fx-border-width: 1; -fx-border-color: black; -fx-border-radius: 2; -fx-padding: 3px;"); + weapons_aptitudes_menu.setStyle("-fx-background-color: rgb(210, 210, 210); -fx-padding: 4px; -fx-border-color: black; -fx-border-radius: 4;"); + } + + public static SimAptAndWeaponsVBox getWeaponsAtitudesMenu() { + return weapons_aptitudes_menu; + } + public static void cleanWeaponsAtitudesMenu() { + weapons_aptitudes_menu = new SimAptAndWeaponsVBox(); + } + + public static void affiche(Stage primaryStage, User session) + { + // listes d'armées + ArrayList lists_of_lists = session.getListes(); // listes d'objets ArmeeListe + String[] list_names = session.getListNames(); // tableau des noms des listes + + System.out.print(session.getListes() + "wawa" + session.getListNames() + "wiwi"); + VBox root_box = new VBox(); + + AfficheTopMenu menu = new AfficheTopMenu(primaryStage, session); // menu du haut de l'écran + + HBox main = new HBox(); // partie principale de la fenêtre + + + /* -- colonne de gauche -- */ + VBox column1_box = new VBox(); + column1_box.prefWidthProperty().bind(main.widthProperty().multiply(0.3)); + + ScrollPane column1_scrollpane = new ScrollPane(); // conteneur avec barres de défilement + column1_scrollpane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); // pas de barre horizontale + + VBox column1 = new VBox(); + column1.prefWidthProperty().bind(column1_scrollpane.widthProperty()); + + + // menu choix armée + HBox col1_first_row = new HBox(); // menu déroulant + logo faction + ChoiceBox list1_drop_down = new ChoiceBox<>(); + list1_drop_down.setStyle("-fx-font-size: 15;"); + list1_drop_down.prefWidthProperty().bind(column1_scrollpane.widthProperty()); + for(int i = 0; i < list_names.length; i++) + { + list1_drop_down.getItems().add(list_names[i]); + } + col1_first_row.getChildren().add(list1_drop_down); + column1.getChildren().add(col1_first_row); + + // unités colonne 1 (par défaut) + SimUnitsVBox units_list1 = new SimUnitsVBox(1); + column1.getChildren().add(units_list1); + column1_scrollpane.setContent(column1); + + VBox.setMargin(weapons_aptitudes_menu, new Insets(5,2,2,2)); + column1_box.getChildren().addAll(column1_scrollpane, weapons_aptitudes_menu); + + + /* -- colonne centrale -- */ + VBox column2 = new VBox(); + column2.prefWidthProperty().bind(main.widthProperty().multiply(0.4)); + column2.setAlignment(Pos.TOP_CENTER); + + // boutons inverser et simuler + Button btn_simulate = new Button("Action !!"); + btn_simulate.setStyle("-fx-font-size: 15;"); + + Image icons_inversion = new Image("/images/inversion_icons.png"); + ImageView icons_inversion_box = new ImageView(icons_inversion); + Button btn_reverse_armies = new Button(); + btn_reverse_armies.setGraphic(icons_inversion_box); + + // grande image + Image image_col2 = new Image("/images/wip.jpg"); + ImageView image_box = new ImageView(); + image_box.setPreserveRatio(true); + image_box.fitWidthProperty().bind(column2.widthProperty()); + image_box.setImage(image_col2); + + // contrairement aux VBox, ce conteneur ne s'adapte pas à la taille des ses enfants, c'est l'image qui s'adapte + Pane big_image_pane = new Pane(); + big_image_pane.getChildren().add(image_box); + + // assemblage + column2.getChildren().addAll(btn_simulate, big_image_pane, btn_reverse_armies); + + + /* -- colonne de droite -- */ + ScrollPane column3_box = new ScrollPane(); // conteneur avec barres de défilement + column3_box.prefWidthProperty().bind(main.widthProperty().multiply(0.3)); + column3_box.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); // pas de barre horizontale + + VBox column3 = new VBox(); + column3.prefWidthProperty().bind(column3_box.widthProperty()); + + HBox col3_first_row = new HBox(); // menu déroulant + logo faction + ChoiceBox list2_drop_down = new ChoiceBox<>(); + list2_drop_down.setStyle("-fx-font-size: 15;"); + list2_drop_down.prefWidthProperty().bind(column1_scrollpane.widthProperty()); + for(int i = 0; i < list_names.length; i++) + { + list2_drop_down.getItems().add(list_names[i]); + } + col3_first_row.getChildren().add(list2_drop_down); + column3.getChildren().add(col3_first_row); + + // unités colonne 3 + SimUnitsVBox units_list2 = new SimUnitsVBox(2); + column3.getChildren().add(units_list2); + column3_box.setContent(column3); + + + /* -- assemblage -- */ + main.getChildren().addAll(column1_box, column2, column3_box); + root_box.getChildren().addAll(menu, main); + + + /* ACTION !! */ + btn_simulate.setOnAction(e -> { + if(Battle.getSelectedList(1) != null && Battle.getSelectedList(2) != null + && Battle.getSelectedUnitIndex(1) >= 0 && Battle.getSelectedUnitIndex(2) >= 0) + { + ControlleurSimu.afficheSimu(big_image_pane, Battle.getSelectedUnit(1), Battle.getSelectedUnit(2)); + } + else { + System.out.println("conditions non remplies pour faire une simulation"); + } + }); + + + Scene scene = new Scene(root_box,800,600); + primaryStage.setTitle("Simulation"); + primaryStage.setScene(scene); + primaryStage.show(); + + + // choix des listes d'armées + ArrayList unit_lists = new ArrayList(); + unit_lists.add(units_list1); + unit_lists.add(units_list2); + ArrayList> lists_drop_down = new ArrayList>(); + lists_drop_down.add(list1_drop_down); + lists_drop_down.add(list2_drop_down);; + ArrayList first_rows = new ArrayList(); + first_rows.add(col1_first_row); + first_rows.add(col3_first_row); + for(int i = 0; i < 2; i++) + { + final int j = i; + lists_drop_down.get(i).getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + if(!inversion) { + ControlleurSimu.selectAList(j + 1, lists_of_lists, newValue); + } + ControlleurSimu.PullDownUnits(j + 1, first_rows.get(j), unit_lists.get(j)); + }); + } + + // inversion de l'attaquant et du défenseur + btn_reverse_armies.setOnAction(e -> { + if(Battle.getSelectedList(1) != null && Battle.getSelectedList(2) != null) { + ControlleurSimu.reverseArmies(lists_drop_down); + } + else { + System.out.println("conditions non remplies pour inverser listes"); + } + }); + } +} diff --git a/src/main/java/vue/simulation/SimAptAndWeaponsVBox.java b/src/main/java/vue/simulation/SimAptAndWeaponsVBox.java new file mode 100644 index 0000000..5014b59 --- /dev/null +++ b/src/main/java/vue/simulation/SimAptAndWeaponsVBox.java @@ -0,0 +1,130 @@ +package vue.simulation; + +import java.util.ArrayList; + +import application.Battle; +import controlleur.ControlleurSimu; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.Label; +import javafx.scene.control.Slider; +import javafx.scene.layout.HBox; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.VBox; +import modele.Aptitude; +import modele.Arme; +import modele.Figurine; + +public class SimAptAndWeaponsVBox extends VBox +{ + private int group_number; + private String group_name; + int group_size; + String[] weapon_names; + String[] aptitude_names; + + //public SimAptAndWeaponsVBox(){} + + // setters + public void setFigGroup(int fig_group_number, String fig_group_name, int fig_group_size){ + group_number = fig_group_number; + group_name = fig_group_name; + group_size = fig_group_size; + } + public void setArmes(ArrayList weapon_list){ + weapon_names = new String[weapon_list.size()]; + for(int i = 0; i < weapon_list.size(); i++) { + weapon_names[i] = weapon_list.get(i).getNom(); + } + } + public void setAptitudes(ArrayList aptitude_list){ + aptitude_names = new String[aptitude_list.size()]; + for(int i = 0; i < aptitude_list.size(); i++) { + aptitude_names[i] = aptitude_list.get(i).getName(); + } + } + + public void setAptAndWeapons(ArrayList fig_group) + { + /* -- ligne 1: numéro du group et nom figurine -- */ + HBox first_row = new HBox(); + + // numéro du group de figurines identiques + Label number = new Label(Integer.toString(group_number)); + number.setAlignment(Pos.CENTER); + number.setMinHeight(25); + number.setMinWidth(25); + number.setStyle("-fx-text-fill: white; -fx-background-color: black; -fx-background-radius: 4;"); + HBox.setMargin(number, new Insets(0, 2, 2, 0)); + + Label figurine_name = new Label(group_name); + first_row.getChildren().addAll(number, figurine_name); + + + /* -- ligne 2: menu déroulant choix de l'arme -- */ + ChoiceBox select_weapon = new ChoiceBox(); + + // sécurité + for(int i = 0; i < weapon_names.length; i++) + { + select_weapon.getItems().add(weapon_names[i]); + } + + // valeur initiale menu déroulante + Arme weapon = Battle.getSeletedWeapon(1, group_name); + if(weapon != null) { + select_weapon.setValue(weapon.getNom()); + } + else { + select_weapon.setValue(weapon_names[0]); + } + // caractéristiques + FlowPane weapon_stats = new FlowPane(); + setWeaponStats(weapon, weapon_stats); + + select_weapon.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + ControlleurSimu.selectAWeapon(this, newValue, fig_group, weapon_stats); + }); + + // choix du nombre d'attaquants (= nombre d'armes) + Slider nb_of_attackers = new Slider(0, group_size, Battle.getSelectedUnit(1).getAliveFigsOfAGroup(group_name)); + nb_of_attackers.setMajorTickUnit(1); + nb_of_attackers.setMinorTickCount(0); + nb_of_attackers.setSnapToTicks(true); + //nb_of_attackers.setShowTickMarks(true); + nb_of_attackers.setShowTickLabels(true); + //nb_of_attackers.setBlockIncrement(1); + + nb_of_attackers.valueProperty().addListener((observable, oldValue, newValue) -> { + ControlleurSimu.AliveFigsChoice(1, newValue.intValue(), group_name); + }); + + // checkbox + FlowPane aptitudes = new FlowPane(); + for(int i = 0; i < aptitude_names.length; i++) + { + CheckBox one_aptitude = new CheckBox(aptitude_names[i]); + one_aptitude.setStyle("-fx-padding: 2px;"); + aptitudes.getChildren().add(one_aptitude); + + one_aptitude.setOnAction(e -> { + ControlleurSimu.checkOrUncheckAnAptitude(one_aptitude.isSelected(), one_aptitude.getText(), fig_group); + }); + } + + this.getChildren().addAll(first_row, select_weapon, weapon_stats, nb_of_attackers, aptitudes); + } + + public void setWeaponStats(Arme weapon, FlowPane weapon_stats) { + weapon_stats.setStyle("-fx-padding: 3px;"); + Label A = new Label("A " + weapon.getA() + " | "); + Label F = new Label("F " + weapon.getF() + " | "); + Label PA = new Label("PA " + weapon.getPA() + " | "); + Label D = new Label("D " + weapon.getD() + " | "); + Label portee = new Label("portée " + weapon.getPortee()); + weapon_stats.getChildren().addAll(A, F, PA, D, portee); + } +} + diff --git a/src/main/java/vue/simulation/SimFigurinesVBox.java b/src/main/java/vue/simulation/SimFigurinesVBox.java new file mode 100644 index 0000000..4940917 --- /dev/null +++ b/src/main/java/vue/simulation/SimFigurinesVBox.java @@ -0,0 +1,139 @@ +package vue.simulation; + +import java.util.ArrayList; +import java.util.HashMap; + +import application.Battle; +import controlleur.ControlleurSimu; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.Slider; +import javafx.scene.control.Spinner; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.VBox; +import modele.Figurine; +import modele.Unit; + +public class SimFigurinesVBox extends VBox +{ + private Unit unit; + private int column; + private ArrayList weapons_aptitudes_menu_view = new ArrayList(); + private boolean open = false; // les figurines sont cachées par défaut + + public SimFigurinesVBox(int col, Unit unit){ + column = col; + this.unit = unit; + this.setStyle("-fx-padding: 2px;"); + } + + public boolean isOpen(){ + return open; + } + public void changeState(){ + open ^= true; // inversion de bouléen avec un masque 00000001 + } + + public void setFigurines() + { + /* -- boucle sur les groupes de figuriones -- */ + int i = 0; // valeurs des boutons numérotés + for(HashMap.Entry> entry : unit.getIdenticalFigsGroups().entrySet()) + { + FlowPane fig_group = new FlowPane(); + //fig_group.setStyle("-fx-background-color: rgb(220, 220, 220);"); + String fig_name = entry.getKey(); + ArrayList fig_list = entry.getValue(); + i++; + if(column == 1) + { + // boutons numérotés des groupes de figurines + Button number = new Button(Integer.toString(i)); + number.setAlignment(Pos.CENTER); + number.setMinHeight(25); + number.setMinWidth(25); + number.setStyle("-fx-text-fill: white; -fx-background-color: black;"); + fig_group.getChildren().add(number); + + // zone des armes et aptitudes + SimAptAndWeaponsVBox weapons_aptitudes_menu = new SimAptAndWeaponsVBox(); + weapons_aptitudes_menu.setFigGroup(i, fig_name, fig_list.size()); + weapons_aptitudes_menu_view.add(weapons_aptitudes_menu); + + number.setOnAction(e -> + { + ControlleurSimu.makeWeaponsAndAptitudeZone(fig_list, weapons_aptitudes_menu); + }); + } + else { + Label fig_name_label = new Label(fig_name); + fig_name_label.setStyle("-fx-padding: 0 5px 0 0"); + fig_group.getChildren().add(fig_name_label); + + Slider nb_of_defenders = new Slider(0, fig_list.size(), + Battle.getSelectedUnit(2).getAliveFigsOfAGroup(fig_name)); + nb_of_defenders.setMajorTickUnit(1); + nb_of_defenders.setMinorTickCount(0); + nb_of_defenders.setSnapToTicks(true); + //nb_of_attackers.setShowTickMarks(true); + nb_of_defenders.setShowTickLabels(true); + //nb_of_attackers.setBlockIncrement(1); + + fig_group.getChildren().add(nb_of_defenders); + + nb_of_defenders.valueProperty().addListener((observable, oldValue, newValue) -> { + ControlleurSimu.AliveFigsChoice(2, newValue.intValue(), fig_name); + }); + } + + + /* -- figurines d'un groupe -- */ + for(Figurine fig : fig_list) + { + HBox one_fig_box = new HBox(); + Image one_image; + if(fig.getHP() > 0) { + one_image = new Image("/images/android-fill.png"); + } + else { + one_image = new Image("/images/android-line.png"); + } + ImageView one_image_box = new ImageView(); + one_image_box.setPreserveRatio(true); + //one_image_box.setFitHeight(24); // appeler une des deux méthodes de dimensionnement + one_image_box.setFitWidth(24); + one_image_box.setImage(one_image); + one_fig_box.getChildren().add(one_image_box); + + if(column == 1) { + Label hp_label = new Label(fig.getHP() + " PV "); + one_fig_box.getChildren().add(hp_label); + } + else { + Label hp_label = new Label("PV:"); + Spinner spinner = new Spinner<>(0, fig.getHPMax(), fig.getHP()); + spinner.setMaxWidth(55); + one_fig_box.getChildren().add(hp_label); + one_fig_box.getChildren().add(spinner); + one_fig_box.setStyle("-fx-padding: 0 3px 0 0;"); + + spinner.valueProperty().addListener((obs, oldValue, newValue) -> { + ControlleurSimu.hpUpdate(newValue, fig, one_image_box); + }); + } + + SimFigurinesVBox.setMargin(one_fig_box, new Insets(5)); + fig_group.getChildren().add(one_fig_box); + } + SimFigurinesVBox.setMargin(fig_group, new Insets(3)); + + this.getChildren().add(fig_group); + } + } +} + diff --git a/src/main/java/vue/simulation/SimHistogramme.java b/src/main/java/vue/simulation/SimHistogramme.java new file mode 100644 index 0000000..519c90b --- /dev/null +++ b/src/main/java/vue/simulation/SimHistogramme.java @@ -0,0 +1,101 @@ +package vue.simulation; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.chart.Axis; +import javafx.scene.chart.BarChart; +import javafx.scene.chart.CategoryAxis; +import javafx.scene.chart.NumberAxis; +import javafx.scene.chart.XYChart; +import javafx.scene.layout.Pane; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class SimHistogramme extends Pane{ + private Pane p; + + + +// public SimHistogramme() { +// super(); +// } + + public static void setHist(int[] tabdegat ,int[] tabmort, float degat_moyen ,float mort_moyen,Pane p) { + Axis xAxis = new CategoryAxis(); + xAxis.setLabel("nbr mort"); + + NumberAxis yAxis = new NumberAxis(); + yAxis.setLabel("pourcentage"); + + Axis xAxis2 = new CategoryAxis(); + xAxis2.setLabel("nbr degat"); + + javafx.scene.chart.NumberAxis yAxis2 = new NumberAxis(); + yAxis2.setLabel("pourcentage"); + + // Create a BarChart + BarChart barChart = new BarChart(xAxis, yAxis); + BarChart barChart2 = new BarChart(xAxis2, yAxis2); + + // Series 1 - Data of 2014 + XYChart.Series dataSeries1 = new XYChart.Series(); + //dataSeries1.setName("mort moyen : "+mort_moyen); + for(int i=0;i(""+i , tabmort[i]/100)); + } + } + + //barChart.getData().add(dataSeries1); + + + // Series 1 - Data of 2014 + XYChart.Series dataSeries2 = new XYChart.Series(); + //dataSeries2.setName("degat moyen : "+degat_moyen); + for(int i=0;i(""+i , tabdegat[i]/100)); + } + } + + barChart.getData().add(dataSeries1); + barChart2.getData().add(dataSeries2); + + + + VBox vbox = new VBox(); + vbox.getChildren().add(barChart); + vbox.getChildren().add(barChart2); + barChart.maxWidthProperty().bind(p.widthProperty()); + barChart2.maxWidthProperty().bind(p.widthProperty()); + barChart2.prefHeight(150); + barChart.prefHeight(150); + barChart.lookupAll(".default-color0.chart-bar") + .forEach(n -> n.setStyle("-fx-bar-fill: red;")); + barChart2.lookupAll(".default-color0.chart-bar") + .forEach(n -> n.setStyle("-fx-bar-fill: green;")); + + + barChart.setMaxHeight(220); + barChart2.setMaxHeight(220); + barChart.prefHeight(200); + barChart.setLegendVisible(false); + barChart2.setLegendVisible(false); + barChart.setTitle("nbr mort moyen : "+mort_moyen); + barChart2.setTitle("nbr degat moyen : "+degat_moyen); + barChart2.prefHeight(200); + VBox.setVgrow(barChart, Priority.ALWAYS); + VBox.setVgrow(barChart2, Priority.ALWAYS); + //vbox.setSpacing(10); + + + p.getChildren().add(vbox); + } + + + + + //BarChart barChart = new BarChart(xAxis, yAxis); + +} + diff --git a/src/main/java/vue/simulation/SimUnitsVBox.java b/src/main/java/vue/simulation/SimUnitsVBox.java new file mode 100644 index 0000000..df02f82 --- /dev/null +++ b/src/main/java/vue/simulation/SimUnitsVBox.java @@ -0,0 +1,65 @@ +package vue.simulation; + +import java.util.ArrayList; + +import application.Battle; +import controlleur.ControlleurSimu; +import javafx.scene.control.Button; +import javafx.scene.layout.VBox; +import modele.Unit; + +public class SimUnitsVBox extends VBox +{ + private ArrayList