Updated: (Now building popup)

This commit is contained in:
rubenpirreram
2026-05-17 15:41:38 +02:00
parent 12979c719d
commit fdeee207ba
@@ -4,7 +4,6 @@ import it.polimi.ingsw.gc14.Controller.ClientController;
import it.polimi.ingsw.gc14.Model.*;
import it.polimi.ingsw.gc14.Model.Cards.BuildingCard;
import it.polimi.ingsw.gc14.Model.Cards.TribeCard;
import it.polimi.ingsw.gc14.Model.GamePackage.GameStages;
import it.polimi.ingsw.gc14.Model.Orders.OrderPlayer;
import it.polimi.ingsw.gc14.Network.EventType;
import it.polimi.ingsw.gc14.Network.NetworkEvent;
@@ -33,15 +32,12 @@ import java.util.*;
public class MainFXMLController {
@FXML private HBox mainHBox;
@FXML private HBox board;
@FXML private HBox upperList;
@FXML private HBox lowerList;
@FXML private HBox myHand;
@FXML private VBox sidePanel;
@FXML private HBox info;
@FXML private Label era;
@FXML private Label round;
@FXML private Label player;
@@ -71,10 +67,16 @@ public class MainFXMLController {
mainHBox.sceneProperty().addListener((obs, oldScene, newScene) -> {
if (newScene != null) {
newScene.getRoot().applyCss();
// chiudi popup cliccando fuori da esso
newScene.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
if (popup.isShowing()) {
popup.hide();
}
});
}
});
initPopup();
renderBackground(); // solo una volta
renderBackground();
}
@@ -215,7 +217,7 @@ public class MainFXMLController {
icon.setEffect(grayscale);
icon.setOpacity(0.3);
} else {
icon.setOnMouseClicked(e -> openPopup(cards));
icon.setOnMouseClicked(e -> openPopup(new ArrayList<>(cards)));
addHoverZoom(icon);
}
@@ -252,14 +254,7 @@ public class MainFXMLController {
upperList.getChildren().add(img);
i++;
}
i = 0;
for (BuildingCard card : controller.miniModel.board.upperListBuilding) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawUpperBuildingCard(controller.myUsername, index));
upperList.getChildren().add(img);
i++;
}
drawUpperBuilding();
}
private void renderLower() {
@@ -275,62 +270,36 @@ public class MainFXMLController {
lowerList.getChildren().add(img);
i++;
}
i = 0;
for (BuildingCard card : controller.miniModel.board.lowerListBuilding) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawLowerBuildingCard(controller.myUsername, index));
drawLowerBuilding();
}
private void drawUpperBuilding() {
ArrayList<BuildingCard> cardList = new ArrayList<>(controller.miniModel.board.upperListBuilding);
if (!cardList.isEmpty()) {
StackPane img = createCard(cardList.getLast(), true, true);
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);
img.getChildren().add(label);
img.setOnMouseClicked(e -> openPopupUpperBuilding(cardList));
upperList.getChildren().add(img);
}
}
private void drawLowerBuilding() {
ArrayList<BuildingCard> cardList = new ArrayList<>(controller.miniModel.board.lowerListBuilding);
if (!cardList.isEmpty()) {
StackPane img = createCard(cardList.getLast(), true, true);
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);
img.getChildren().add(label);
img.setOnMouseClicked(e -> openPopupLowerBuilding(cardList));
lowerList.getChildren().add(img);
i++;
}
}
private void renderDeck() {
String path = switch (controller.miniModel.currentState.getEra()) {
case 1 -> "/GUIImages/Backs/back-001.png";
case 2 -> "/GUIImages/Backs/back-030.png";
case 3 -> "/GUIImages/Backs/back-058.png";
default -> "/GUIImages/Backs/back-001.png";
};
ImageView back = new ImageView(loadImage(path));
back.setFitHeight(240);
back.setPreserveRatio(true);
addClip(back);
addShadow(back);
addHoverZoom(back);
board.getChildren().add(back);
}
private void renderOrder() {
StackPane card = createOrder(Integer.toString(controller.miniModel.players.size()));
VBox overlay = new VBox(-20);
overlay.setPickOnBounds(false);
StackPane.setAlignment(overlay, Pos.TOP_LEFT);
StackPane.setMargin(overlay, new Insets(9, 0, 0, 57));
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);
}
overlay.getChildren().add(totem);
}
card.getChildren().add(overlay);
board.getChildren().add(card);
}
private void renderSlotMap() {
int i = 0;
for (Map.Entry<Slot, Player> entry : controller.miniModel.slotPlayerMap.entrySet()) {
Slot slot = entry.getKey();
final int index = i;
StackPane img = createSlot(slot, true, true);
img.setOnMouseClicked(e -> controller.slotChoice(controller.myUsername, index));
board.getChildren().add(img);
i++;
}
}
@@ -343,7 +312,7 @@ public class MainFXMLController {
label.getStyleClass().add("label-large");
StackPane.setAlignment(label, Pos.TOP_RIGHT);
img.getChildren().add(label);
img.setOnMouseClicked(e -> openPopup(cardList));
img.setOnMouseClicked(e -> openPopup(new ArrayList<>(cardList)));
myHand.getChildren().add(img);
} else {
Region placeholder = new Region();
@@ -435,6 +404,55 @@ public class MainFXMLController {
renderSlotMap();
}
private void renderDeck() {
String path = switch (controller.miniModel.currentState.getEra()) {
case 1 -> "/GUIImages/Backs/back-001.png";
case 2 -> "/GUIImages/Backs/back-030.png";
case 3 -> "/GUIImages/Backs/back-058.png";
default -> "/GUIImages/Backs/back-001.png";
};
ImageView back = new ImageView(loadImage(path));
back.setFitHeight(240);
back.setPreserveRatio(true);
addClip(back);
addShadow(back);
addHoverZoom(back);
board.getChildren().add(back);
}
private void renderOrder() {
StackPane card = createOrder(Integer.toString(controller.miniModel.players.size()));
VBox overlay = new VBox(-20);
overlay.setPickOnBounds(false);
StackPane.setAlignment(overlay, Pos.TOP_LEFT);
StackPane.setMargin(overlay, new Insets(9, 0, 0, 57));
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);
}
overlay.getChildren().add(totem);
}
card.getChildren().add(overlay);
board.getChildren().add(card);
}
private void renderSlotMap() {
int i = 0;
for (Map.Entry<Slot, Player> entry : controller.miniModel.slotPlayerMap.entrySet()) {
Slot slot = entry.getKey();
final int index = i;
StackPane img = createSlot(slot, true, true);
img.setOnMouseClicked(e -> controller.slotChoice(controller.myUsername, index));
board.getChildren().add(img);
i++;
}
}
private void renderMyHand() {
myHand.getChildren().clear();
myHand.setSpacing(14);
@@ -481,7 +499,7 @@ public class MainFXMLController {
popup = new Popup();
popup.getContent().add(popupCards);
popup.setAutoHide(true);
popup.setAutoHide(false); // gestito manualmente per permettere click sulle carte
popup.addEventHandler(Event.ANY, e -> {
if (popup.getScene() != null) {
@@ -490,18 +508,50 @@ public class MainFXMLController {
});
}
private void showPopup() {
Window window = myHand.getScene().getWindow();
popup.show(window, 0, 0);
popup.getScene().setFill(Color.TRANSPARENT);
popup.setX(window.getX() + (window.getWidth() - popup.getWidth()) / 2);
popup.setY(window.getY() + (window.getHeight() - popup.getHeight()) / 2);
}
// Popup sola visualizzazione (mano, icone sidepanel)
private void openPopup(ArrayList<? extends PlayableCard> cardList) {
popupCards.getChildren().clear();
for (PlayableCard card : cardList) {
popupCards.getChildren().add(createCard(card, false, false));
}
showPopup();
}
Window window = myHand.getScene().getWindow();
popup.show(window, 0, 0);
popup.getScene().setFill(Color.TRANSPARENT);
// Popup edifici upper: click sulla carta → pesca e chiude
private void openPopupUpperBuilding(ArrayList<BuildingCard> cardList) {
popupCards.getChildren().clear();
for (int i = 0; i < cardList.size(); i++) {
final int index = i;
StackPane img = createCard(cardList.get(i), true, false);
img.setOnMouseClicked(e -> {
popup.hide();
controller.drawUpperBuildingCard(controller.myUsername, index);
});
popupCards.getChildren().add(img);
}
showPopup();
}
// centra dopo show() quando le dimensioni sono disponibili
popup.setX(window.getX() + (window.getWidth() - popup.getWidth()) / 2);
popup.setY(window.getY() + (window.getHeight() - popup.getHeight()) / 2);
// Popup edifici lower: click sulla carta → pesca e chiude
private void openPopupLowerBuilding(ArrayList<BuildingCard> cardList) {
popupCards.getChildren().clear();
for (int i = 0; i < cardList.size(); i++) {
final int index = i;
StackPane img = createCard(cardList.get(i), true, false);
img.setOnMouseClicked(e -> {
popup.hide();
controller.drawLowerBuildingCard(controller.myUsername, index);
});
popupCards.getChildren().add(img);
}
showPopup();
}
}