From 99523beb05ebe7fa2880f4be658c78baefe8fbff Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Mon, 18 May 2026 17:35:13 +0200 Subject: [PATCH 1/7] Fixed: temp --- .../java/it/polimi/ingsw/gc14/View/GUI/GUI.java | 17 ++++++++++------- .../ingsw/gc14/View/GUI/MainFXMLController.java | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java index ad5bdd5..1cfe4ed 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java @@ -7,11 +7,15 @@ import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.View.GUI.LoginFXMLController; import it.polimi.ingsw.gc14.View.GUI.MainFXMLController; import it.polimi.ingsw.gc14.View.IView; +import javafx.animation.PauseTransition; import javafx.application.Application; import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.stage.Stage; +import javafx.util.Duration; import java.io.IOException; @@ -99,36 +103,35 @@ public class GUI extends Application implements IView { Platform.runLater(() -> { event.apply(miniModel); if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) { - primaryStage.setMaximized(true); controllerTotem.render(); primaryStage.setScene(totemScene); - + primaryStage.setMaximized(true); } else if (controller.miniModel.currentState.getGameStage() == GameStages.ENDED) { - primaryStage.setMaximized(true); controllerLeaderboard.render(); primaryStage.setScene(leaderboardScene); - }else { primaryStage.setMaximized(true); + } else { controllerMain.render(event); primaryStage.setScene(mainScene); + primaryStage.setMaximized(true); + } }); } - public void render() { if (!Platform.isFxApplicationThread()) { Platform.runLater(this::render); return; } if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) { - primaryStage.setMaximized(true); controllerTotem.render(); primaryStage.setScene(totemScene); - } else { primaryStage.setMaximized(true); + } else { controllerMain.render(); primaryStage.setScene(mainScene); + primaryStage.setMaximized(true); } } diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java index aa11a74..de63d82 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java @@ -11,8 +11,11 @@ import javafx.animation.AnimationTimer; import javafx.animation.PauseTransition; import javafx.animation.ScaleTransition; import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.event.Event; import javafx.fxml.FXML; +import javafx.geometry.Bounds; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Cursor; @@ -76,6 +79,15 @@ public class MainFXMLController { }); } }); + mainHBox.layoutBoundsProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue obs, Bounds ov, Bounds nv) { + if (nv.getWidth() > 0 && nv.getHeight() > 0 && controller != null) { + mainHBox.layoutBoundsProperty().removeListener(this); + render(); + } + } + }); initPopup(); renderBackground(); } @@ -311,10 +323,10 @@ public class MainFXMLController { if (!cardList.isEmpty()) { StackPane img = createCard(cardList.getLast(), true, true, parent); Label label = new Label(String.valueOf(cardList.size())); - label.setTranslateY(-55); - label.setTranslateX(10); label.getStyleClass().add("label-large"); StackPane.setAlignment(label, Pos.TOP_RIGHT); + StackPane.setMargin(label, new Insets(8, 8, 0, 0)); + img.getChildren().add(label); img.setOnMouseClicked(e -> openPopup(new ArrayList<>(cardList))); parent.getChildren().add(img); } else { From 559fca34e10e1f2bc43ec3e05018d0ba6b97420b Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Mon, 18 May 2026 18:47:27 +0200 Subject: [PATCH 2/7] Fixed: Maximize(windows) --- .../it/polimi/ingsw/gc14/View/GUI/GUI.java | 34 +++++++++++-------- .../gc14/View/GUI/MainFXMLController.java | 11 +++++- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java index 1cfe4ed..651b698 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java @@ -77,6 +77,8 @@ public class GUI extends Application implements IView { mainScene = new Scene(loaderMain.load()); controllerMain = loaderMain.getController(); + + showLogin(); stage.setTitle("Mesos"); primaryStage.setMaximized(true); @@ -99,42 +101,46 @@ public class GUI extends Application implements IView { this.controller=controller; } + public void applyAndRender(NetworkEvent event) { Platform.runLater(() -> { event.apply(miniModel); if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) { - controllerTotem.render(); primaryStage.setScene(totemScene); - primaryStage.setMaximized(true); - } - else if (controller.miniModel.currentState.getGameStage() == GameStages.ENDED) { - controllerLeaderboard.render(); + controllerTotem.render(); + } else if (controller.miniModel.currentState.getGameStage() == GameStages.ENDED) { + boolean sceneChange = primaryStage.getScene() != leaderboardScene; primaryStage.setScene(leaderboardScene); - primaryStage.setMaximized(true); + if (sceneChange) { + primaryStage.setMaximized(false); + Platform.runLater(() -> primaryStage.setMaximized(true)); + } + controllerLeaderboard.render(); } else { - controllerMain.render(event); + boolean sceneChange = primaryStage.getScene() != mainScene; // ← era un'altra scena? primaryStage.setScene(mainScene); - primaryStage.setMaximized(true); - + if (sceneChange) { + primaryStage.setMaximized(false); + Platform.runLater(() -> primaryStage.setMaximized(true)); + } + controllerMain.render(event); } }); } + public void render() { if (!Platform.isFxApplicationThread()) { Platform.runLater(this::render); return; } if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) { - controllerTotem.render(); primaryStage.setScene(totemScene); - primaryStage.setMaximized(true); + controllerTotem.render(); } else { - controllerMain.render(); primaryStage.setScene(mainScene); - primaryStage.setMaximized(true); + controllerMain.render(); } } - @Override public void showMessage(String message) { diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java index de63d82..ad94f33 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java @@ -95,6 +95,10 @@ public class MainFXMLController { // ==== RENDER ==== public void render() { + if (mainHBox.getWidth() == 0 || mainHBox.getHeight() == 0) { + Platform.runLater(() -> render()); + return; + } renderUpper(); renderBoard(); renderLower(); @@ -103,6 +107,10 @@ public class MainFXMLController { } public void render(NetworkEvent event) { + if (mainHBox.getWidth() == 0 || mainHBox.getHeight() == 0) { + Platform.runLater(() -> render(event)); + return; + } if (event.getEventType() == EventType.SLOT_CHOICE) { renderBoard(); renderSidePanel(); @@ -323,9 +331,10 @@ public class MainFXMLController { if (!cardList.isEmpty()) { StackPane img = createCard(cardList.getLast(), true, true, parent); Label label = new Label(String.valueOf(cardList.size())); + label.setTranslateY(-55); + label.setTranslateX(10); label.getStyleClass().add("label-large"); StackPane.setAlignment(label, Pos.TOP_RIGHT); - StackPane.setMargin(label, new Insets(8, 8, 0, 0)); img.getChildren().add(label); img.setOnMouseClicked(e -> openPopup(new ArrayList<>(cardList))); parent.getChildren().add(img); From 21ad457c7f39e819a053d87439e8d942222998b1 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Mon, 18 May 2026 19:07:17 +0200 Subject: [PATCH 3/7] Fixed: MinSize Setted --- .../it/polimi/ingsw/gc14/View/GUI/GUI.java | 4 ++-- .../gc14/View/GUI/MainFXMLController.java | 24 +++++++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java index 651b698..402b698 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java @@ -82,8 +82,8 @@ public class GUI extends Application implements IView { showLogin(); stage.setTitle("Mesos"); primaryStage.setMaximized(true); - primaryStage.setMinWidth(800); - primaryStage.setMinHeight(600); + primaryStage.setMinWidth(1583); + primaryStage.setMinHeight(734); primaryStage.show(); } diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java index ad94f33..2e8167a 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java @@ -21,6 +21,7 @@ import javafx.geometry.Pos; import javafx.scene.Cursor; import javafx.scene.Node; import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; import javafx.scene.effect.ColorAdjust; import javafx.scene.effect.DropShadow; import javafx.scene.image.*; @@ -347,7 +348,7 @@ public class MainFXMLController { } } - private void renderPlayer(Player player) { + private void renderPlayer(Player player,VBox target) { VBox card = new VBox(3); VBox.setMargin(card, new Insets(5)); card.getStyleClass().add("player-card"); @@ -418,7 +419,7 @@ public class MainFXMLController { renderIcons(iconsRow1, iconsRow2, player); card.getChildren().addAll(headerRow, statsRow, iconsRow1, iconsRow2); - sidePanel.getChildren().add(card); + target.getChildren().add(card); } @@ -520,7 +521,6 @@ public class MainFXMLController { VBox.setMargin(info, new Insets(5, 5, 5, 5)); sidePanel.getChildren().add(info); - // ===== NUOVO: bottoni Skip Turn e Dettagli ===== HBox buttonRow = new HBox(8); buttonRow.setAlignment(Pos.CENTER); VBox.setMargin(buttonRow, new Insets(0, 5, 5, 5)); @@ -537,13 +537,23 @@ public class MainFXMLController { buttonRow.getChildren().addAll(skipBtn, detailsBtn); sidePanel.getChildren().add(buttonRow); - // ================================================ - for (Player player : controller.miniModel.players.values()) { - renderPlayer(player); + // ← VBox separato solo per i player + VBox playerList = new VBox(6); + playerList.setFillWidth(true); + for (Player p : controller.miniModel.players.values()) { + renderPlayer(p, playerList); // ← passa playerList invece di sidePanel } - } + ScrollPane scrollPane = new ScrollPane(playerList); + scrollPane.setFitToWidth(true); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED); + scrollPane.setStyle("-fx-background: transparent; -fx-background-color: transparent;"); + VBox.setVgrow(scrollPane, Priority.ALWAYS); + + sidePanel.getChildren().add(scrollPane); + } // ==== POPUP ==== private void initPopup() { From 53ad188f62e5ee879d105fc4c95cc798a5aec09e Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Mon, 18 May 2026 19:12:59 +0200 Subject: [PATCH 4/7] Add: Exit --- src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java index 402b698..43a924e 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java @@ -84,6 +84,10 @@ public class GUI extends Application implements IView { primaryStage.setMaximized(true); primaryStage.setMinWidth(1583); primaryStage.setMinHeight(734); + primaryStage.setOnCloseRequest(e -> { + Platform.exit(); + System.exit(0); + }); primaryStage.show(); } From 4ec97293c27f0aeaf2d8868207bf7e00f5974ffe Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Mon, 18 May 2026 22:27:37 +0200 Subject: [PATCH 5/7] Fixed: Order Card GUI --- .../gc14/View/GUI/MainFXMLController.java | 65 +++++++++++++++---- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java index 2e8167a..3998fbb 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java @@ -464,26 +464,69 @@ public class MainFXMLController { } private void renderOrder() { - StackPane card = createOrder(Integer.toString(controller.miniModel.players.size())); + int numPlayers = controller.miniModel.players.size(); + StackPane card = createOrder(Integer.toString(numPlayers)); - VBox overlay = new VBox(-20); + Map slotPositions = Map.of( + 2, new double[]{0.229 ,0.413}, + 3, new double[]{0.183,0.367, 0.548}, + 4, new double[]{0.142,0.316, 0.503, 0.690}, + 5, new double[]{0.066, 0.251, 0.433, 0.617,0.802} + ); + + double[] positions = slotPositions.get(numPlayers); + if (positions == null) return; + + + Pane overlay = new Pane(); overlay.setPickOnBounds(false); - StackPane.setAlignment(overlay, Pos.TOP_LEFT); - StackPane.setMargin(overlay, new Insets(9, 0, 0, 46)); + overlay.setMouseTransparent(true); - for (OrderPlayer player : controller.miniModel.orderLogicCard.playerList) { - ImageView totem = new ImageView(loadImage("/GUIImages/Totems/totem_" + player.player.totem.toString().toLowerCase(Locale.ROOT) + ".png")); - totem.setFitHeight(70); - totem.setPreserveRatio(true); - if (controller.miniModel.slotPlayerMap.containsValue(player.player)) { - totem.setOpacity(0.5); + for (int i = 0; i < controller.miniModel.orderLogicCard.playerList.size(); i++) { + OrderPlayer op = controller.miniModel.orderLogicCard.playerList.get(i); + + // colore dal totem del giocatore + Color color = totemColor(op.player.totem); + + Rectangle rect = new Rectangle(48, 26, color); + rect.setArcWidth(4); + rect.setArcHeight(4); + if (controller.miniModel.slotPlayerMap.containsValue(op.player)) { + rect.setOpacity(0.5); } - overlay.getChildren().add(totem); + + final double yRatio = positions[i]; + overlay.prefHeightProperty().bind(card.heightProperty()); + overlay.prefWidthProperty().bind(card.widthProperty()); + + // posizione X fissa, Y proporzionale + rect.setX(41); + card.heightProperty().addListener((obs, ov, nv) -> { + rect.setY(nv.doubleValue() * yRatio); + }); + if (card.getHeight() > 0) { + rect.setY(card.getHeight() * yRatio); + } + + overlay.getChildren().add(rect); } + card.getChildren().add(overlay); board.getChildren().add(card); } + private Color totemColor(Totems totem) { + return switch (totem) { + case ORANGE -> Color.rgb(223, 76, 17); + case BLUE -> Color.rgb(42, 155, 179); + case PURPLE -> Color.rgb(65, 20, 42); + case YELLOW -> Color.rgb(248, 201, 57); + case WHITE -> Color.rgb(232, 232, 231); + // aggiungi i tuoi valori reali + default -> Color.GRAY; + }; + } + private void renderSlotMap() { int i = 0; for (Map.Entry entry : controller.miniModel.slotPlayerMap.entrySet()) { From 236338993e186d1d2ab37ff0cf8f8a75bfd8e76d Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Tue, 19 May 2026 15:24:46 +0200 Subject: [PATCH 6/7] Fixed: EndGameFOrfeit --- src/main/java/it/polimi/ingsw/gc14/Model/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java index 7a56903..776ebf3 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -926,7 +926,7 @@ public class Game implements Serializable { } public void EndGameForFeit() { - Player winner=playersList.stream().filter(x->!disconnetedPlayers.containsValue(x)||!disconnetedPlayers.get(x)).toList().get(0); + Player winner=playersList.stream().filter(x->!disconnetedPlayers.containsKey(x)||!disconnetedPlayers.get(x)).toList().get(0); currentState.GameStageUpdate(GameStages.ENDED); playerStanding=new ArrayList<>(playersList); playerStanding.remove(winner); From 6337e3fdeecb9654b032fe46735cb5d2f36d8d67 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Tue, 19 May 2026 15:32:49 +0200 Subject: [PATCH 7/7] Fixed: LeaderBoardScene --- src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java index 43a924e..f6a9197 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java @@ -19,6 +19,7 @@ import javafx.util.Duration; import java.io.IOException; +import static it.polimi.ingsw.gc14.Model.GamePackage.GameStages.ENDED; import static it.polimi.ingsw.gc14.Model.GamePackage.GameStages.TOTEM_CHOICE; public class GUI extends Application implements IView { @@ -140,7 +141,10 @@ public class GUI extends Application implements IView { if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) { primaryStage.setScene(totemScene); controllerTotem.render(); - } else { + } else if (controller.miniModel.currentState.getGameStage() == ENDED){ + primaryStage.setScene(leaderboardScene); + controllerLeaderboard.render(); + }else { primaryStage.setScene(mainScene); controllerMain.render(); }