@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user