Merge pull request #112 from rubenpirreram/GUI-2.0

G UI 2.0
This commit is contained in:
rubenpirreram
2026-05-19 17:55:27 +02:00
committed by GitHub
2 changed files with 127 additions and 36 deletions
@@ -7,14 +7,19 @@ import it.polimi.ingsw.gc14.Network.NetworkEvent;
import it.polimi.ingsw.gc14.View.GUI.LoginFXMLController; import it.polimi.ingsw.gc14.View.GUI.LoginFXMLController;
import it.polimi.ingsw.gc14.View.GUI.MainFXMLController; import it.polimi.ingsw.gc14.View.GUI.MainFXMLController;
import it.polimi.ingsw.gc14.View.IView; import it.polimi.ingsw.gc14.View.IView;
import javafx.animation.PauseTransition;
import javafx.application.Application; import javafx.application.Application;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.util.Duration;
import java.io.IOException; 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; import static it.polimi.ingsw.gc14.Model.GamePackage.GameStages.TOTEM_CHOICE;
public class GUI extends Application implements IView { public class GUI extends Application implements IView {
@@ -73,11 +78,17 @@ public class GUI extends Application implements IView {
mainScene = new Scene(loaderMain.load()); mainScene = new Scene(loaderMain.load());
controllerMain = loaderMain.getController(); controllerMain = loaderMain.getController();
showLogin(); showLogin();
stage.setTitle("Mesos"); stage.setTitle("Mesos");
primaryStage.setMaximized(true); primaryStage.setMaximized(true);
primaryStage.setMinWidth(800); primaryStage.setMinWidth(1583);
primaryStage.setMinHeight(600); primaryStage.setMinHeight(734);
primaryStage.setOnCloseRequest(e -> {
Platform.exit();
System.exit(0);
});
primaryStage.show(); primaryStage.show();
} }
@@ -95,23 +106,29 @@ public class GUI extends Application implements IView {
this.controller=controller; this.controller=controller;
} }
public void applyAndRender(NetworkEvent event) { public void applyAndRender(NetworkEvent event) {
Platform.runLater(() -> { Platform.runLater(() -> {
event.apply(miniModel); event.apply(miniModel);
if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) { if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) {
primaryStage.setMaximized(true);
controllerTotem.render();
primaryStage.setScene(totemScene); primaryStage.setScene(totemScene);
controllerTotem.render();
} } else if (controller.miniModel.currentState.getGameStage() == GameStages.ENDED) {
else if (controller.miniModel.currentState.getGameStage() == GameStages.ENDED) { boolean sceneChange = primaryStage.getScene() != leaderboardScene;
primaryStage.setMaximized(true);
controllerLeaderboard.render();
primaryStage.setScene(leaderboardScene); primaryStage.setScene(leaderboardScene);
}else { if (sceneChange) {
primaryStage.setMaximized(true); primaryStage.setMaximized(false);
controllerMain.render(event); Platform.runLater(() -> primaryStage.setMaximized(true));
}
controllerLeaderboard.render();
} else {
boolean sceneChange = primaryStage.getScene() != mainScene; // ← era un'altra scena?
primaryStage.setScene(mainScene); primaryStage.setScene(mainScene);
if (sceneChange) {
primaryStage.setMaximized(false);
Platform.runLater(() -> primaryStage.setMaximized(true));
}
controllerMain.render(event);
} }
}); });
} }
@@ -122,16 +139,16 @@ public class GUI extends Application implements IView {
return; return;
} }
if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) { if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) {
primaryStage.setMaximized(true);
controllerTotem.render();
primaryStage.setScene(totemScene); primaryStage.setScene(totemScene);
} else { controllerTotem.render();
primaryStage.setMaximized(true); } else if (controller.miniModel.currentState.getGameStage() == ENDED){
controllerMain.render(); primaryStage.setScene(leaderboardScene);
controllerLeaderboard.render();
}else {
primaryStage.setScene(mainScene); primaryStage.setScene(mainScene);
controllerMain.render();
} }
} }
@Override @Override
public void showMessage(String message) { public void showMessage(String message) {
@@ -11,13 +11,17 @@ import javafx.animation.AnimationTimer;
import javafx.animation.PauseTransition; import javafx.animation.PauseTransition;
import javafx.animation.ScaleTransition; import javafx.animation.ScaleTransition;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.Event; import javafx.event.Event;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.geometry.Bounds;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.Cursor; import javafx.scene.Cursor;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.effect.ColorAdjust; import javafx.scene.effect.ColorAdjust;
import javafx.scene.effect.DropShadow; import javafx.scene.effect.DropShadow;
import javafx.scene.image.*; import javafx.scene.image.*;
@@ -76,6 +80,15 @@ public class MainFXMLController {
}); });
} }
}); });
mainHBox.layoutBoundsProperty().addListener(new ChangeListener<Bounds>() {
@Override
public void changed(ObservableValue<? extends Bounds> obs, Bounds ov, Bounds nv) {
if (nv.getWidth() > 0 && nv.getHeight() > 0 && controller != null) {
mainHBox.layoutBoundsProperty().removeListener(this);
render();
}
}
});
initPopup(); initPopup();
renderBackground(); renderBackground();
} }
@@ -83,6 +96,10 @@ public class MainFXMLController {
// ==== RENDER ==== // ==== RENDER ====
public void render() { public void render() {
if (mainHBox.getWidth() == 0 || mainHBox.getHeight() == 0) {
Platform.runLater(() -> render());
return;
}
renderUpper(); renderUpper();
renderBoard(); renderBoard();
renderLower(); renderLower();
@@ -91,6 +108,10 @@ public class MainFXMLController {
} }
public void render(NetworkEvent event) { public void render(NetworkEvent event) {
if (mainHBox.getWidth() == 0 || mainHBox.getHeight() == 0) {
Platform.runLater(() -> render(event));
return;
}
if (event.getEventType() == EventType.SLOT_CHOICE) { if (event.getEventType() == EventType.SLOT_CHOICE) {
renderBoard(); renderBoard();
renderSidePanel(); renderSidePanel();
@@ -315,6 +336,7 @@ public class MainFXMLController {
label.setTranslateX(10); label.setTranslateX(10);
label.getStyleClass().add("label-large"); label.getStyleClass().add("label-large");
StackPane.setAlignment(label, Pos.TOP_RIGHT); StackPane.setAlignment(label, Pos.TOP_RIGHT);
img.getChildren().add(label);
img.setOnMouseClicked(e -> openPopup(new ArrayList<>(cardList))); img.setOnMouseClicked(e -> openPopup(new ArrayList<>(cardList)));
parent.getChildren().add(img); parent.getChildren().add(img);
} else { } else {
@@ -326,7 +348,7 @@ public class MainFXMLController {
} }
} }
private void renderPlayer(Player player) { private void renderPlayer(Player player,VBox target) {
VBox card = new VBox(3); VBox card = new VBox(3);
VBox.setMargin(card, new Insets(5)); VBox.setMargin(card, new Insets(5));
card.getStyleClass().add("player-card"); card.getStyleClass().add("player-card");
@@ -397,7 +419,7 @@ public class MainFXMLController {
renderIcons(iconsRow1, iconsRow2, player); renderIcons(iconsRow1, iconsRow2, player);
card.getChildren().addAll(headerRow, statsRow, iconsRow1, iconsRow2); card.getChildren().addAll(headerRow, statsRow, iconsRow1, iconsRow2);
sidePanel.getChildren().add(card); target.getChildren().add(card);
} }
@@ -442,26 +464,69 @@ public class MainFXMLController {
} }
private void renderOrder() { 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<Integer, double[]> 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); overlay.setPickOnBounds(false);
StackPane.setAlignment(overlay, Pos.TOP_LEFT); overlay.setMouseTransparent(true);
StackPane.setMargin(overlay, new Insets(9, 0, 0, 46));
for (OrderPlayer player : controller.miniModel.orderLogicCard.playerList) { for (int i = 0; i < controller.miniModel.orderLogicCard.playerList.size(); i++) {
ImageView totem = new ImageView(loadImage("/GUIImages/Totems/totem_" + player.player.totem.toString().toLowerCase(Locale.ROOT) + ".png")); OrderPlayer op = controller.miniModel.orderLogicCard.playerList.get(i);
totem.setFitHeight(70);
totem.setPreserveRatio(true); // colore dal totem del giocatore
if (controller.miniModel.slotPlayerMap.containsValue(player.player)) { Color color = totemColor(op.player.totem);
totem.setOpacity(0.5);
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); card.getChildren().add(overlay);
board.getChildren().add(card); 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() { private void renderSlotMap() {
int i = 0; int i = 0;
for (Map.Entry<Slot, Player> entry : controller.miniModel.slotPlayerMap.entrySet()) { for (Map.Entry<Slot, Player> entry : controller.miniModel.slotPlayerMap.entrySet()) {
@@ -499,7 +564,6 @@ public class MainFXMLController {
VBox.setMargin(info, new Insets(5, 5, 5, 5)); VBox.setMargin(info, new Insets(5, 5, 5, 5));
sidePanel.getChildren().add(info); sidePanel.getChildren().add(info);
// ===== NUOVO: bottoni Skip Turn e Dettagli =====
HBox buttonRow = new HBox(8); HBox buttonRow = new HBox(8);
buttonRow.setAlignment(Pos.CENTER); buttonRow.setAlignment(Pos.CENTER);
VBox.setMargin(buttonRow, new Insets(0, 5, 5, 5)); VBox.setMargin(buttonRow, new Insets(0, 5, 5, 5));
@@ -516,13 +580,23 @@ public class MainFXMLController {
buttonRow.getChildren().addAll(skipBtn, detailsBtn); buttonRow.getChildren().addAll(skipBtn, detailsBtn);
sidePanel.getChildren().add(buttonRow); sidePanel.getChildren().add(buttonRow);
// ================================================
for (Player player : controller.miniModel.players.values()) { // ← VBox separato solo per i player
renderPlayer(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 ==== // ==== POPUP ====
private void initPopup() { private void initPopup() {