Refactor of GUI - synchronized methods

Changed info box
This commit is contained in:
2026-05-22 17:21:24 +02:00
parent 9cef4617cd
commit 5b7e33f5dd
20 changed files with 215 additions and 236 deletions
@@ -83,8 +83,6 @@ public class GUI extends Application implements IView {
showLogin();
stage.setTitle("Mesos");
primaryStage.setMaximized(true);
primaryStage.setMinWidth(1583);
primaryStage.setMinHeight(734);
primaryStage.setOnCloseRequest(e -> {
Platform.exit();
System.exit(0);
@@ -106,38 +104,23 @@ public class GUI extends Application implements IView {
this.controller=controller;
}
public void applyAndRender(NetworkEvent event) {
public void render() {
Platform.runLater(() -> {
if (event!=null) {
event.apply(miniModel);
}
if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) {
primaryStage.setScene(totemScene);
controllerTotem.render();
} else if (controller.miniModel.currentState.getGameStage() == GameStages.ENDED) {
primaryStage.setScene(leaderboardScene);
controllerLeaderboard.render();
} else {
primaryStage.setScene(mainScene);
controllerMain.render(event);
controllerMain.initPopup(mainScene);
synchronized (miniModel) {
if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) {
primaryStage.setScene(totemScene);
controllerTotem.render();
} else if (controller.miniModel.currentState.getGameStage() == ENDED) {
primaryStage.setScene(leaderboardScene);
controllerLeaderboard.render();
} else {
primaryStage.setScene(mainScene);
controllerMain.initPopup(mainScene);
controllerMain.render();
}
}
});
}
public void render() {
if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) {
primaryStage.setScene(totemScene);
controllerTotem.render();
} else if (controller.miniModel.currentState.getGameStage() == ENDED){
primaryStage.setScene(leaderboardScene);
controllerLeaderboard.render();
}else {
primaryStage.setScene(mainScene);
controllerMain.initPopup(mainScene);
controllerMain.render();
}
}
@Override
public void showMessage(String message) {
@@ -7,8 +7,6 @@ import it.polimi.ingsw.gc14.Model.Cards.TribeCard;
import it.polimi.ingsw.gc14.Model.Orders.OrderPlayer;
import it.polimi.ingsw.gc14.Network.EventType;
import it.polimi.ingsw.gc14.Network.NetworkEvent;
import javafx.animation.AnimationTimer;
import javafx.animation.PauseTransition;
import javafx.animation.ScaleTransition;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
@@ -18,6 +16,7 @@ import javafx.fxml.FXML;
import javafx.geometry.Bounds;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.Scene;
@@ -33,7 +32,7 @@ import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.scene.text.Font;
import javafx.stage.Popup;
import javafx.stage.Stage;
import javafx.stage.Screen;
import javafx.stage.Window;
import javafx.util.Duration;
@@ -41,21 +40,16 @@ import java.util.*;
public class MainFXMLController {
@FXML private HBox currentStateBar;
@FXML private ScrollPane playerSide;
@FXML private HBox mainHBox;
@FXML private ImageView backgroundImage;
@FXML private HBox board;
@FXML private HBox upperList;
@FXML private HBox lowerList;
@FXML private HBox myHand;
@FXML private VBox sidePanel;
@FXML private HBox buttonRow;
@FXML private Button skipBtn;
@FXML private Button detailsBtn;
@FXML private HBox info;
@FXML private Label era;
@FXML private Label round;
@FXML private Label player;
@FXML private Label infoText;
private Popup popup;
private HBox popupCards;
@@ -70,15 +64,14 @@ public class MainFXMLController {
p -> new Image(getClass().getResourceAsStream(p)));
}
public void setController(ClientController controller) {
this.controller = controller;
}
@FXML
public void initialize() {
Font.loadFont(getClass().getResourceAsStream("/Fonts/InknutAntiqua-Regular.ttf"), 14);
popup = new Popup();
mainHBox.sceneProperty().addListener((obs, oldScene, newScene) -> {
if (newScene != null) {
@@ -88,17 +81,7 @@ 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();
}
}
});
addHoverZoom(skipBtn);
addHoverZoom(detailsBtn);
renderBackground();
}
@@ -138,11 +121,9 @@ public class MainFXMLController {
Rectangle clip = new Rectangle();
clip.setArcWidth(20);
clip.setArcHeight(20);
clip.heightProperty().bind(img.fitHeightProperty());
clip.widthProperty().bind(img.fitHeightProperty().multiply(
img.getImage().getWidth() / img.getImage().getHeight()
));
img.setClip(clip);
clip.heightProperty().bind(img.layoutBoundsProperty().map(b -> b.getHeight()));
clip.widthProperty().bind(img.layoutBoundsProperty().map(b -> b.getWidth()));
}
private void addHoverZoom(Node node) {
@@ -190,7 +171,7 @@ public class MainFXMLController {
private StackPane createSlot(Slot slot, boolean withZoom, boolean withShadow) {
ImageView img = new ImageView(loadImage("/GUIImages/Fronts/card-" + slot.getSlotId() + ".png"));
img.setPreserveRatio(true);
img.fitHeightProperty().bind(board.heightProperty().add(-15));
img.fitHeightProperty().bind(board.heightProperty().add(-15)); // TODO perchè è tutto moltiplicato per una costante ma in board facciamo -15?
addClip(img);
StackPane wrapper = new StackPane(img);
@@ -200,10 +181,7 @@ public class MainFXMLController {
totem.fitHeightProperty().bind(img.fitHeightProperty().multiply(0.332));
totem.setPreserveRatio(true);
StackPane.setAlignment(totem, Pos.TOP_LEFT);
StackPane.setMargin(totem, new Insets(0, 0, 0, 0.224 * img.getFitHeight()));
img.fitHeightProperty().addListener((obs, ov, nv) -> {
StackPane.setMargin(totem, new Insets(0, 0, 0, 0.224 * nv.doubleValue()));
});
StackPane.setMargin(totem, new Insets(0, 0, 0, 0.224 * img.getFitHeight())); // TODO perchè margine sx incrementa con altezza e non larghezza?
wrapper.getChildren().add(totem);
}
@@ -288,9 +266,9 @@ public class MainFXMLController {
}
}
private void drawMyHandList(ArrayList<? extends PlayableCard> cardList, HBox parent) {
private void drawMyHandList(ArrayList<? extends PlayableCard> cardList) {
if (!cardList.isEmpty()) {
StackPane img = createCard(cardList.getLast(), true, true, parent);
StackPane img = createCard(cardList.getLast(), true, true, myHand);
Label label = new Label(String.valueOf(cardList.size()));
label.setTranslateY(-55);
label.setTranslateX(10);
@@ -298,13 +276,13 @@ public class MainFXMLController {
StackPane.setAlignment(label, Pos.TOP_RIGHT);
img.getChildren().add(label);
img.setOnMouseClicked(e -> openPopup(new ArrayList<>(cardList)));
parent.getChildren().add(img);
myHand.getChildren().add(img);
} else {
Region placeholder = new Region();
placeholder.prefHeightProperty().bind(parent.heightProperty().multiply(0.85));
placeholder.prefHeightProperty().bind(myHand.heightProperty().multiply(0.85));
placeholder.prefWidthProperty().bind(placeholder.prefHeightProperty().multiply(0.675));
placeholder.setStyle("-fx-background-color: transparent;");
parent.getChildren().add(placeholder);
myHand.getChildren().add(placeholder);
}
}
@@ -313,8 +291,15 @@ public class MainFXMLController {
VBox.setMargin(card, new Insets(15,15,15,15));
card.getStyleClass().add("player-card");
card.setPadding(new Insets(8));
addHoverZoom(card);
addShadow(card);
if(player.getUserName().equals(controller.miniModel.currentState.getCurrentPlayer().getUserName())) {
ScaleTransition scaleUp = new ScaleTransition(Duration.millis(150), card);
scaleUp.setToX(1.1);
scaleUp.setToY(1.1);
scaleUp.play();
}
// Riga 1: totem + nome
HBox headerRow = new HBox(8);
@@ -482,7 +467,6 @@ public class MainFXMLController {
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;
@@ -548,27 +532,27 @@ public class MainFXMLController {
myHand.setAlignment(Pos.CENTER);
Player me = controller.miniModel.players.get(controller.myUsername);
drawMyHandList(me.artists,myHand);
drawMyHandList(me.gatherers,myHand);
drawMyHandList(me.inventors,myHand);
drawMyHandList(me.builders,myHand);
drawMyHandList(me.shamans,myHand);
drawMyHandList(me.hunters,myHand);
drawMyHandList(me.buildingCards,myHand);
drawMyHandList(me.artists);
drawMyHandList(me.gatherers);
drawMyHandList(me.inventors);
drawMyHandList(me.builders);
drawMyHandList(me.shamans);
drawMyHandList(me.hunters);
drawMyHandList(me.buildingCards);
}
private void renderSidePanel() {
currentStateBar.getChildren().clear();
currentStateBar.getChildren().add(new Label("Round:"+controller.miniModel.currentState.getRound()));
era.setText(Integer.toString(controller.miniModel.currentState.getEra()));
round.setText(Integer.toString(controller.miniModel.currentState.getRound()));
player.setText(controller.miniModel.currentState.getCurrentPlayer().getUserName());
infoText.setText("Round: "+Integer.toString(controller.miniModel.currentState.getRound()) + "" + controller.miniModel.currentState.getGameStage().toString());
skipBtn.setOnAction(e -> controller.skipTurn(controller.myUsername));
// ← VBox separato solo per i player
VBox playerList = new VBox(6);
detailsBtn.setOnAction(e -> openDetailsPopup());
addHoverZoom(skipBtn);
addHoverZoom(detailsBtn);
VBox playerList = new VBox();
playerList.setFillWidth(true);
for (Player p : controller.miniModel.players.values()) {
renderPlayer(p, playerList); // ← passa playerList invece di sidePanel
renderPlayer(p, playerList);
}
playerSide.setContent(playerList);
}
@@ -587,7 +571,7 @@ public class MainFXMLController {
);
popup.getContent().add(popupCards);
popup.setAutoHide(false); // gestito manualmente per permettere click sulle carte
popup.setAutoHide(false);
popup.addEventHandler(Event.ANY, e -> {
if (popup.getScene() != null) {
popup.getScene().setFill(Color.TRANSPARENT);