From e45cea4aa65e08329fefeea5ca9339ed59790899 Mon Sep 17 00:00:00 2001 From: Per Eric Trapnes Date: Fri, 17 Apr 2026 14:03:01 +0200 Subject: [PATCH] bug fixes:constrain popups to window bounds and enforce unique type --- .../gruppe42/Controller/AppController.java | 6 +-- .../gruppe42/Controller/PopupController.java | 27 ++----------- .../Controller/StartViewController.java | 32 +++++++++++++-- .../gruppe42/Model/{Apps.java => App.java} | 2 +- .../idatt2003/gruppe42/View/DesktopView.java | 7 ++-- .../gruppe42/View/Popups/AppStorePopup.java | 4 +- .../gruppe42/View/Popups/BankPopup.java | 4 +- .../gruppe42/View/Popups/HustlersPopup.java | 4 +- .../gruppe42/View/Popups/MailPopup.java | 4 +- .../gruppe42/View/Popups/NewsPopup.java | 4 +- .../idatt2003/gruppe42/View/Popups/Popup.java | 39 +++++++++++++++++-- .../gruppe42/View/Popups/SimplePopup.java | 20 ---------- .../gruppe42/View/Popups/StockPopup.java | 4 +- .../idatt2003/gruppe42/View/StartView.java | 3 ++ 14 files changed, 96 insertions(+), 64 deletions(-) rename src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Model/{Apps.java => App.java} (84%) delete mode 100644 src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/SimplePopup.java diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/AppController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/AppController.java index 801233b..fbcc1df 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/AppController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/AppController.java @@ -1,6 +1,6 @@ package edu.ntnu.idi.idatt2003.gruppe42.Controller; -import edu.ntnu.idi.idatt2003.gruppe42.Model.Apps; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; import edu.ntnu.idi.idatt2003.gruppe42.View.Popups.AppStorePopup; import edu.ntnu.idi.idatt2003.gruppe42.View.Popups.BankPopup; import edu.ntnu.idi.idatt2003.gruppe42.View.Popups.HustlersPopup; @@ -42,7 +42,7 @@ public AppController(PopupController popupController, Pane parent) { * @param type the type of the app. * @return the app button. */ - public Button createAppButton(Apps type) { + public Button createAppButton(App type) { Button button = new Button(type.toString()); button.setMinSize(0, 0); @@ -86,7 +86,7 @@ public Button createAppButton(Apps type) { * * @param type the app type. */ - private void openPopup(Apps type) { + private void openPopup(App type) { Popup popup = switch (type) { case APPSTORE -> new AppStorePopup(400, 300, 100, 100); case HUSTLERS -> new HustlersPopup(400, 300, 140, 140); diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/PopupController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/PopupController.java index c4f07e2..ce37d82 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/PopupController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/PopupController.java @@ -27,7 +27,9 @@ public PopupController() { * @return true if added, false otherwise */ public boolean add(Popup popup) { - if (popup == null || popups.contains(popup)) { + if (popup == null) { + return false; + }else if (popups.stream().anyMatch(oldPopup -> oldPopup.getType().equals(popup.getType()))) { return false; } popup.getCloseButton().setOnAction(event -> remove(popup)); @@ -62,27 +64,4 @@ public void bringToFront(Popup popup) { popup.getRoot().toFront(); } } - - /** - * Checks if a popup is out of bounds and moves it back if necessary - * @param popup the popup to check - */ - public void keepInBounds(Popup popup) { - if (popup.getRoot().getParent() instanceof Pane parent) { - double screenWidth = parent.getWidth(); - double screenHeight = parent.getHeight(); - - if (popup.getX() < 0) { - popup.getRoot().setLayoutX(0); - } else if (popup.getX() + popup.getWidth() > screenWidth) { - popup.getRoot().setLayoutX(screenWidth - popup.getWidth()); - } - - if (popup.getY() < 0) { - popup.getRoot().setLayoutY(0); - } else if (popup.getY() + popup.getHeight() > screenHeight) { - popup.getRoot().setLayoutY(screenHeight - popup.getHeight()); - } - } - } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/StartViewController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/StartViewController.java index d9e8da9..9830be1 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/StartViewController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/StartViewController.java @@ -4,12 +4,27 @@ import edu.ntnu.idi.idatt2003.gruppe42.Model.Player; import edu.ntnu.idi.idatt2003.gruppe42.View.StartView; import java.math.BigDecimal; +import java.util.List; +import java.util.Random; +import javafx.scene.control.Alert; public class StartViewController { private String username = ""; private final StartView startView; private final Millions application; + private static final List TATE_NAMES = List.of( + "Top G", + "Cobra Tate", + "Tristan's Brother", + "Emory's Son", + "Matrix Escaper", + "Bugatti Owner", + "Hustler G", + "Chin Checker", + "Sparkling Water Enthusiast", + "The Talisman" + ); public StartViewController(Millions application, StartView startView) { @@ -17,17 +32,28 @@ public StartViewController(Millions application, StartView startView) { this.startView = startView; startView.getUsernameField().textProperty().addListener((obs, old, newValue) -> { - if (isValidName(newValue)) { - username = newValue; - } + username = newValue; }); startView.getLoginButton().setOnAction(event -> handleStart()); } private void handleStart() { + if (startView.getSelectedMode() == null) { + Alert alert = new Alert(Alert.AlertType.WARNING); + alert.setTitle("Difficulty missing"); + alert.setHeaderText(null); + alert.setContentText("how much money you got?"); + alert.showAndWait(); + return; + } + BigDecimal money = getStartingMoney(); + if (username == null || username.trim().isEmpty() || !isValidName(username)) { + username = TATE_NAMES.get(new Random().nextInt(TATE_NAMES.size())); + } + Player player = new Player(username, money); System.out.println(player.getMoney()); application.switchToDesktopView(); diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Model/Apps.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Model/App.java similarity index 84% rename from src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Model/Apps.java rename to src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Model/App.java index ed3967d..e527816 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Model/Apps.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Model/App.java @@ -1,6 +1,6 @@ package edu.ntnu.idi.idatt2003.gruppe42.Model; -public enum Apps { +public enum App { APPSTORE, HUSTLERS, STOCK, diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/DesktopView.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/DesktopView.java index ad94a51..5da3b4f 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/DesktopView.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/DesktopView.java @@ -2,9 +2,8 @@ import edu.ntnu.idi.idatt2003.gruppe42.Controller.AppController; import edu.ntnu.idi.idatt2003.gruppe42.Controller.PopupController; -import edu.ntnu.idi.idatt2003.gruppe42.Model.Apps; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; import javafx.geometry.Pos; -import javafx.scene.control.Button; import javafx.scene.layout.BorderPane; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; @@ -72,8 +71,8 @@ private GridPane createGrid() { grid.add(cell, col, row); // Add initial buttons to the first row based on the Apps enum - if (row == 0 && col < Apps.values().length) { - cell.getChildren().add(appController.createAppButton(Apps.values()[col])); + if (row == 0 && col < App.values().length) { + cell.getChildren().add(appController.createAppButton(App.values()[col])); } } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/AppStorePopup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/AppStorePopup.java index 0cb2938..98fc3a8 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/AppStorePopup.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/AppStorePopup.java @@ -1,5 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.View.Popups; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; + /** * A popup for the AppStore app. */ @@ -14,7 +16,7 @@ public class AppStorePopup extends Popup { * @param y y-position of the popup */ public AppStorePopup(int width, int height, int x, int y) { - super(width, height, x, y); + super(width, height, x, y, App.APPSTORE); // Add AppStore specific content here } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/BankPopup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/BankPopup.java index 96c2a51..57be052 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/BankPopup.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/BankPopup.java @@ -1,5 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.View.Popups; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; + /** * A popup for the Bank app. */ @@ -14,7 +16,7 @@ public class BankPopup extends Popup { * @param y y-position of the popup */ public BankPopup(int width, int height, int x, int y) { - super(width, height, x, y); + super(width, height, x, y, App.BANK); // Add Bank specific content here } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/HustlersPopup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/HustlersPopup.java index 0e2148a..7fa7ba8 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/HustlersPopup.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/HustlersPopup.java @@ -1,5 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.View.Popups; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; + /** * A popup for the Hustlers app. */ @@ -14,7 +16,7 @@ public class HustlersPopup extends Popup { * @param y y-position of the popup */ public HustlersPopup(int width, int height, int x, int y) { - super(width, height, x, y); + super(width, height, x, y, App.HUSTLERS); // Add Hustlers specific content here } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/MailPopup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/MailPopup.java index b5ec21f..5f4f4a1 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/MailPopup.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/MailPopup.java @@ -1,5 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.View.Popups; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; + /** * A popup for the Mail app. */ @@ -14,7 +16,7 @@ public class MailPopup extends Popup { * @param y y-position of the popup */ public MailPopup(int width, int height, int x, int y) { - super(width, height, x, y); + super(width, height, x, y, App.MAIL); // Add Mail specific content here } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/NewsPopup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/NewsPopup.java index 03dee1f..025ee4a 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/NewsPopup.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/NewsPopup.java @@ -1,5 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.View.Popups; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; + /** * A popup for the News app. */ @@ -14,7 +16,7 @@ public class NewsPopup extends Popup { * @param y y-position of the popup */ public NewsPopup(int width, int height, int x, int y) { - super(width, height, x, y); + super(width, height, x, y, App.NEWS); // Add News specific content here } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/Popup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/Popup.java index 3a7bf5c..bdeb365 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/Popup.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/Popup.java @@ -1,10 +1,12 @@ package edu.ntnu.idi.idatt2003.gruppe42.View.Popups; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; /** @@ -17,6 +19,7 @@ public abstract class Popup { protected int height; protected double dx; protected double dy; + protected App type; protected BorderPane root; protected ScrollPane scrollPane; @@ -32,9 +35,10 @@ public abstract class Popup { * @param x x-position of the popup * @param y y-position of the popup */ - protected Popup(int width, int height, int x, int y) { + protected Popup(int width, int height, int x, int y, App type) { this.width = width; this.height = height; + this.type = type; root = new BorderPane(); scrollPane = new ScrollPane(); @@ -43,10 +47,10 @@ protected Popup(int width, int height, int x, int y) { header = new HBox(); content = new VBox(); - Label titleLabel = new Label("Title"); + Label titleLabel = new Label(type.toString()); closeButton = new Button("Exit"); header.getChildren().addAll(titleLabel, closeButton); - header.setStyle("-fx-background-color: red;"); + header.setStyle("-fx-background-color: lightgray;"); content.setPrefSize(width, height); scrollPane.setMinSize(width, height); @@ -110,6 +114,12 @@ public Button getCloseButton() { return closeButton; } + /** + * Returns the type of the popup. + */ + public App getType() {return type; + } + private void makeDraggable() { header.setOnMousePressed(e -> { dx = e.getSceneX() - root.getLayoutX(); @@ -119,6 +129,29 @@ private void makeDraggable() { header.setOnMouseDragged(e -> { root.setLayoutX(e.getSceneX() - dx); root.setLayoutY(e.getSceneY() - dy); + keepInBounds(); }); } + + /** + * Checks if a popup is out of bounds and moves it back if necessary + */ + public void keepInBounds() { + if (getRoot().getParent() instanceof Pane parent) { + double screenWidth = parent.getWidth(); + double screenHeight = parent.getHeight(); + + if (getX() < 0) { + getRoot().setLayoutX(0); + } else if (getX() + getWidth() > screenWidth) { + getRoot().setLayoutX(screenWidth - getWidth()); + } + + if (getY() < 0) { + getRoot().setLayoutY(0); + } else if (getY() + getHeight() > screenHeight) { + getRoot().setLayoutY(screenHeight - getHeight()); + } + } + } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/SimplePopup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/SimplePopup.java deleted file mode 100644 index 7ee86d7..0000000 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/SimplePopup.java +++ /dev/null @@ -1,20 +0,0 @@ -package edu.ntnu.idi.idatt2003.gruppe42.View.Popups; - -/** - * A simple implementation of a popup. - */ -public class SimplePopup extends Popup { - - /** - * Constructs a new simple popup. - * - * @param width width of the popup - * @param height height of the popup - * @param x x-position of the popup - * @param y y-position of the popup - */ - public SimplePopup(int width, int height, int x, int y) { - super(width, height, x, y); - getContent().setStyle("-fx-background-color: blue;"); - } -} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/StockPopup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/StockPopup.java index 059fe80..98fb82b 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/StockPopup.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/Popups/StockPopup.java @@ -1,5 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.View.Popups; +import edu.ntnu.idi.idatt2003.gruppe42.Model.App; + /** * A popup for the Stock app. */ @@ -14,7 +16,7 @@ public class StockPopup extends Popup { * @param y y-position of the popup */ public StockPopup(int width, int height, int x, int y) { - super(width, height, x, y); + super(width, height, x, y, App.STOCK); // Add Stock specific content here } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/StartView.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/StartView.java index dc3d990..15c2078 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/StartView.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/View/StartView.java @@ -66,6 +66,9 @@ public TextField getUsernameField() { } public String getSelectedMode() { RadioButton selectedMode = (RadioButton) startingMoneyGroup.getSelectedToggle(); + if (selectedMode == null) { + return null; + } return selectedMode.getText(); } public Button getLoginButton() {