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 35fa593..66ef10d 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 @@ -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 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 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 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 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 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 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 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(); } } \ No newline at end of file