Feat/ui switch lobby game #222

Merged
jona.walpert merged 12 commits from feat/ui-switch-lobby-game into main 2026-04-01 12:34:31 +02:00
5 changed files with 61 additions and 85 deletions
Showing only changes of commit af37e33f07 - Show all commits
@@ -1,30 +1,27 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.gameuicomponents; package ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.gameuicomponents;
import javafx.application.Platform; import ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent; import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/** /**
* Controller für die interaktive Taskleiste innerhalb der Poker-UI. * Controller für die interaktive Taskleiste innerhalb der Poker-UI.
* *
* <p> * <p>Verantwortlich für: - Drag-and-Drop-Verschieben der Taskleiste, - Eingabe und Verwaltung von
* Verantwortlich für: - Drag-and-Drop-Verschieben der Taskleiste, - Eingabe und
* Verwaltung von
* Spieleinsätzen, - Steuerung allgemeiner Menüfunktionen wie Exit. * Spieleinsätzen, - Steuerung allgemeiner Menüfunktionen wie Exit.
*/ */
public class TaskbarController { public class TaskbarController {
private static final org.apache.logging.log4j.Logger LOGGER = org.apache.logging.log4j.LogManager private static final Logger LOGGER = LogManager.getLogger(CasinoBrowserController.class);
.getLogger(CasinoBrowserController.class);
@FXML @FXML private HBox taskbar;
private HBox taskbar; @FXML private TextField taskbarInput;
@FXML
private TextField taskbarInput;
private double xOffset = 0; private double xOffset = 0;
private double yOffset = 0; private double yOffset = 0;
@@ -34,8 +31,7 @@ public class TaskbarController {
private static final int CREDIT_STEP = 5; private static final int CREDIT_STEP = 5;
/** /**
* Wird aufgerufen, wenn die Taskleiste mit der Maus gedrückt wird. Speichert * Wird aufgerufen, wenn die Taskleiste mit der Maus gedrückt wird. Speichert die relative
* die relative
* Position, um später korrekt zu verschieben. * Position, um später korrekt zu verschieben.
* *
* @param event Das Mausereignis * @param event Das Mausereignis
@@ -47,13 +43,10 @@ public class TaskbarController {
} }
/** /**
* Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird. * Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird. Aktualisiert die Position
* Aktualisiert die Position
* und skaliert die Taskleiste leicht zur visuellen Rückmeldung. * und skaliert die Taskleiste leicht zur visuellen Rückmeldung.
* *
* <p> * <p>TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem Fenster verschwinden
* TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem Fenster
* verschwinden
* kann. * kann.
* *
* @param event Das Mausereignis * @param event Das Mausereignis
@@ -68,8 +61,7 @@ public class TaskbarController {
} }
/** /**
* Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird. Setzt * Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird. Setzt die Skalierung der
* die Skalierung der
* Taskleiste wieder auf Normalgröße. * Taskleiste wieder auf Normalgröße.
* *
* @param event Das Mausereignis * @param event Das Mausereignis
@@ -93,8 +85,7 @@ public class TaskbarController {
} }
/** /**
* Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird. Löst * Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird. Löst die
* die
* Verarbeitung des Einsatzes aus. * Verarbeitung des Einsatzes aus.
*/ */
@FXML @FXML
@@ -105,31 +96,29 @@ public class TaskbarController {
/** /**
* Wird aufgerufen, wenn der Exit-Button in der Taskleiste gedrückt wird. * Wird aufgerufen, wenn der Exit-Button in der Taskleiste gedrückt wird.
* *
* <p> * <p>TODO: Logik implementieren, um zur Lobby zurückzukehren, ohne die gesamte Anwendung zu
* TODO: Logik implementieren, um zur Lobby zurückzukehren, ohne die gesamte
* Anwendung zu
* schließen (kein System.exit/Platform.exit). * schließen (kein System.exit/Platform.exit).
*/ */
@FXML @FXML
private void onExitButtonClick() { private void onExitButtonClick() {
javafx.application.Platform.runLater(() -> { javafx.application.Platform.runLater(
// Game-Stage schließen () -> {
javafx.stage.Stage currentStage = (javafx.stage.Stage) taskbar.getScene().getWindow(); // Game-Stage schließen
currentStage.close(); javafx.stage.Stage currentStage =
// Lobby-UI starten (javafx.stage.Stage) taskbar.getScene().getWindow();
try { currentStage.close();
new ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui().start(new javafx.stage.Stage()); // Lobby-UI starten
} catch (Exception e) { try {
LOGGER.error("Fehler beim Starten der Lobby-UI: {}", e.getMessage()); new Casinomainui().start(new javafx.stage.Stage());
} } catch (Exception e) {
}); LOGGER.error("Fehler beim Starten der Lobby-UI: {}", e.getMessage());
}
});
} }
/** /**
* Verarbeitet den im Textfeld eingegebenen Einsatz. Es werden ausschließlich * Verarbeitet den im Textfeld eingegebenen Einsatz. Es werden ausschließlich ganzzahlige Werte
* ganzzahlige Werte * im Bereich von 5 bis 100.000 Credits akzeptiert, die einem Vielfachen von 5 entsprechen
* im Bereich von 5 bis 100.000 Credits akzeptiert, die einem Vielfachen von 5
* entsprechen
* (5er-Schritte). Der Einsatz wird aktuell nur auf der Konsole ausgegeben. * (5er-Schritte). Der Einsatz wird aktuell nur auf der Konsole ausgegeben.
*/ */
private void processBet() { private void processBet() {
@@ -152,9 +141,7 @@ public class TaskbarController {
/** /**
* Öffnet den integrierten Casono Webbrowser. * Öffnet den integrierten Casono Webbrowser.
* *
* <p> * <p>TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps & Tricks
* TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps
* & Tricks
* Seite), sobald die Inhalte für Strategien und Support bereitstehen. * Seite), sobald die Inhalte für Strategien und Support bereitstehen.
*/ */
@FXML @FXML
@@ -12,27 +12,17 @@ import javafx.scene.shape.Rectangle;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
/** /** Controller for the Casono main UI lobby. Handles UI initialization and user actions. */
* Controller for the Casono main UI lobby. Handles UI initialization and user
* actions.
*/
public class CasinomainuiController { public class CasinomainuiController {
private static final Logger LOGGER = LogManager.getLogger(CasinomainuiController.class); private static final Logger LOGGER = LogManager.getLogger(CasinomainuiController.class);
@FXML @FXML private AnchorPane rootPane;
private AnchorPane rootPane; @FXML private Label titleLabel;
@FXML @FXML private Label subtitleLabel;
private Label titleLabel; @FXML private ImageView logoView;
@FXML @FXML private Rectangle greenBox;
private Label subtitleLabel; @FXML private Button exitbutton;
@FXML @FXML private VBox casinoTable;
private ImageView logoView;
@FXML
private Rectangle greenBox;
@FXML
private Button exitbutton;
@FXML
private VBox casinoTable;
private LobbyButtonTranslationManager translationManager; private LobbyButtonTranslationManager translationManager;
private LobbyButtonGridManager gridManager; private LobbyButtonGridManager gridManager;
@@ -50,7 +40,8 @@ public class CasinomainuiController {
logoView.setImage(new Image(getClass().getResource("/images/logo.png").toExternalForm())); logoView.setImage(new Image(getClass().getResource("/images/logo.png").toExternalForm()));
translationManager = LobbyButtonTranslationManager.getInstance(); translationManager = LobbyButtonTranslationManager.getInstance();
gridManager = new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager); gridManager =
new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager);
casinoTable.getChildren().clear(); casinoTable.getChildren().clear();
casinoTable.getChildren().add(gridManager.getGridPane()); casinoTable.getChildren().add(gridManager.getGridPane());
gridManager.renderLobbyButtons(); gridManager.renderLobbyButtons();
@@ -13,8 +13,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
/** /**
* Manages the grid for lobby buttons and rendering. Uses * Manages the grid for lobby buttons and rendering. Uses LobbyButtonTranslationManager for mapping
* LobbyButtonTranslationManager for mapping
* ButtonID to LobbyID. * ButtonID to LobbyID.
*/ */
public class LobbyButtonGridManager { public class LobbyButtonGridManager {
@@ -41,7 +40,7 @@ public class LobbyButtonGridManager {
/** /**
* Constructor for the GridManager. * Constructor for the GridManager.
* *
* @param gridPane the GridPane for rendering * @param gridPane the GridPane for rendering
* @param translationManager the manager for mapping ButtonID to LobbyID * @param translationManager the manager for mapping ButtonID to LobbyID
*/ */
public LobbyButtonGridManager( public LobbyButtonGridManager(
@@ -52,8 +51,7 @@ public class LobbyButtonGridManager {
} }
/** /**
* Renders all lobby buttons in the grid. Creates a button for each mapping with * Renders all lobby buttons in the grid. Creates a button for each mapping with image and event
* image and event
* handler. * handler.
*/ */
public void renderLobbyButtons() { public void renderLobbyButtons() {
@@ -68,7 +66,8 @@ public class LobbyButtonGridManager {
int buttonId = entry.getKey(); int buttonId = entry.getKey();
Button btn = new Button(); Button btn = new Button();
btn.setId("lobbyBtn-" + buttonId); btn.setId("lobbyBtn-" + buttonId);
ImageView imageView = new ImageView(new Image(getClass().getResourceAsStream(BUTTON_IMAGE_PATH))); ImageView imageView =
new ImageView(new Image(getClass().getResourceAsStream(BUTTON_IMAGE_PATH)));
imageView.setPreserveRatio(true); imageView.setPreserveRatio(true);
// Dynamische Breite: Bindung an die Zellengröße // Dynamische Breite: Bindung an die Zellengröße
imageView.fitWidthProperty().bind(gridPane.widthProperty().divide(COLS).subtract(20)); imageView.fitWidthProperty().bind(gridPane.widthProperty().divide(COLS).subtract(20));
@@ -114,17 +113,20 @@ public class LobbyButtonGridManager {
public void joinLobby(int lobbyId) { public void joinLobby(int lobbyId) {
// Game-UI starten und Lobby-UI schließen // Game-UI starten und Lobby-UI schließen
LOGGER.info("Joining lobby: {}", lobbyId); LOGGER.info("Joining lobby: {}", lobbyId);
javafx.application.Platform.runLater(() -> { javafx.application.Platform.runLater(
// Lobby-Stage schließen () -> {
javafx.stage.Stage currentStage = (javafx.stage.Stage) gridPane.getScene().getWindow(); // Lobby-Stage schließen
currentStage.close(); javafx.stage.Stage currentStage =
// Game-UI starten (javafx.stage.Stage) gridPane.getScene().getWindow();
try { currentStage.close();
new ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.CasinoGameUI().start(new javafx.stage.Stage()); // Game-UI starten
} catch (Exception e) { try {
LOGGER.error("Fehler beim Starten der Game-UI: {}", e.getMessage()); new ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.CasinoGameUI()
} .start(new javafx.stage.Stage());
}); } catch (Exception e) {
LOGGER.error("Fehler beim Starten der Game-UI: {}", e.getMessage());
}
});
} }
/** /**
@@ -4,8 +4,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher. * Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher. Keine Dateioperationen,
* Keine Dateioperationen,
* nur Laufzeitdatenstruktur. * nur Laufzeitdatenstruktur.
*/ */
public class LobbyButtonTranslationManager { public class LobbyButtonTranslationManager {
@@ -27,9 +26,7 @@ public class LobbyButtonTranslationManager {
/** Zuordnung ButtonID → LobbyID */ /** Zuordnung ButtonID → LobbyID */
private final Map<Integer, Integer> buttonIdToLobbyId = new HashMap<>(); private final Map<Integer, Integer> buttonIdToLobbyId = new HashMap<>();
/** /** Privater Konstruktor für Singleton-Pattern */
* Privater Konstruktor für Singleton-Pattern
*/
private LobbyButtonTranslationManager() { private LobbyButtonTranslationManager() {
// Zuordnung bleibt leer beim Start // Zuordnung bleibt leer beim Start
} }
@@ -47,7 +44,7 @@ public class LobbyButtonTranslationManager {
* Fügt eine Zuordnung ButtonID → LobbyID hinzu. * Fügt eine Zuordnung ButtonID → LobbyID hinzu.
* *
* @param buttonId Die ID des Buttons * @param buttonId Die ID des Buttons
* @param lobbyId Die ID der Lobby * @param lobbyId Die ID der Lobby
* @throws Exception wenn das Grid voll ist * @throws Exception wenn das Grid voll ist
*/ */
public void addLobbyButton(int buttonId, int lobbyId) throws Exception { public void addLobbyButton(int buttonId, int lobbyId) throws Exception {
@@ -23,5 +23,4 @@ class LobbyButtonGridManagerTest {
int lobbyId = gridManager.createLobby(); int lobbyId = gridManager.createLobby();
assertTrue(lobbyId > 0); assertTrue(lobbyId > 0);
} }
} }