Add: Lobby display in lobby GUI with placeholder functions.

This commit is contained in:
Jona Walpert
2026-03-12 15:25:18 +01:00
parent d414c27ff2
commit d2407d61f4
6 changed files with 292 additions and 11 deletions
@@ -1,5 +1,10 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui; package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
/**
* Controller for the Casono main UI lobby.
* Handles UI initialization and user actions.
*/
/** /**
* Controller for the Casono main UI lobby. * Controller for the Casono main UI lobby.
* Handles UI initialization and user actions. * Handles UI initialization and user actions.
@@ -30,11 +35,12 @@ import javafx.scene.layout.AnchorPane;
public class CasinomainuiController { public class CasinomainuiController {
/** /**
* Standardkonstruktor. * Default constructor for the controller.
*/ */
public CasinomainuiController() { public CasinomainuiController() {
// Standardkonstruktor // Default constructor
} }
/** Root pane of the UI. */ /** Root pane of the UI. */
@FXML @FXML
private AnchorPane rootPane; private AnchorPane rootPane;
@@ -53,9 +59,13 @@ public class CasinomainuiController {
/** Exit button for closing the application. */ /** Exit button for closing the application. */
@FXML @FXML
private Button exitbutton; private Button exitbutton;
/** Casino table VBox for grid rendering. */
@FXML
private javafx.scene.layout.VBox casinoTable;
private LobbyButtonTranslationManager translationManager;
private LobbyButtonGridManager gridManager;
private int nextButtonId = 1;
/** /**
* Initializes the UI components and sets default values. * Initializes the UI components and sets default values.
@@ -63,8 +73,12 @@ public class CasinomainuiController {
public void initialize() { public void initialize() {
titleLabel.setText("Casono"); titleLabel.setText("Casono");
subtitleLabel.setText("Texas Hold'em Poker"); subtitleLabel.setText("Texas Hold'em Poker");
// Logo laden
logoView.setImage(new javafx.scene.image.Image(getClass().getResource("/images/logo.png").toExternalForm())); logoView.setImage(new javafx.scene.image.Image(getClass().getResource("/images/logo.png").toExternalForm()));
translationManager = new LobbyButtonTranslationManager();
gridManager = new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager);
casinoTable.getChildren().add(gridManager.getGridPane());
gridManager.renderLobbyButtons();
} }
/** /**
@@ -75,5 +89,24 @@ public class CasinomainuiController {
Platform.exit(); Platform.exit();
} }
/**
* Handles creation of a new lobby button.
*/
@FXML
public void handleCreateLobbyButton() {
if (translationManager.isFull()) {
System.out.println("Grid voll! Keine weiteren Lobbys moeglich.");
return;
}
int buttonId = nextButtonId++;
int lobbyId = gridManager.createLobby();
try {
translationManager.addLobbyButton(buttonId, lobbyId);
System.out.println("ButtonID: " + buttonId + ", LobbyID: " + lobbyId);
gridManager.renderLobbyButtons();
} catch (Exception e) {
System.out.println("Fehler beim Hinzufügen: " + e.getMessage());
}
} }
}
@@ -0,0 +1,101 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
/**
* Manages the grid for lobby buttons and rendering.
* Uses LobbyButtonTranslationManager for mapping ButtonID to LobbyID.
*/
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import java.util.Map;
/**
* Manages the grid for lobby buttons and rendering.
* Uses LobbyButtonTranslationManager for mapping ButtonID to LobbyID.
*/
public class LobbyButtonGridManager {
/** GridPane for the button grid. */
private final GridPane gridPane;
/** Manager for mapping ButtonID to LobbyID. */
private final LobbyButtonTranslationManager translationManager;
/** Number of rows in the grid. */
private final int rows = 2;
/** Number of columns in the grid. */
private final int cols = 4;
/** Path to the button image. */
private final String buttonImagePath = "/images/logo.png";
/**
* Constructor for the GridManager.
*
* @param gridPane the GridPane for rendering
* @param translationManager the manager for mapping ButtonID to LobbyID
*/
public LobbyButtonGridManager(GridPane gridPane, LobbyButtonTranslationManager translationManager) {
this.gridPane = gridPane;
this.translationManager = translationManager;
}
/**
* Renders all lobby buttons in the grid.
* Creates a button for each mapping with image and event handler.
*/
public void renderLobbyButtons() {
gridPane.getChildren().clear();
int index = 0;
Map<Integer, Integer> mapping = translationManager.getButtonIdToLobbyId();
if (mapping.isEmpty()) {
// No buttons to render
return;
}
for (Map.Entry<Integer, Integer> entry : mapping.entrySet()) {
int buttonId = entry.getKey();
Button btn = new Button();
btn.setId("lobbyBtn-" + buttonId);
btn.setGraphic(new ImageView(new Image(getClass().getResourceAsStream(buttonImagePath))));
btn.setOnAction(e -> {
Integer lobbyId = translationManager.getLobbyIdForButton(buttonId);
if (lobbyId != null)
joinLobby(lobbyId);
});
int row = index / cols;
int col = index % cols;
gridPane.add(btn, col, row);
index++;
}
}
/**
* Placeholder for lobby creation logic. Returns a generated lobbyId.
*
* @return The generated lobbyId
*/
public int createLobby() {
// TODO: Replace with actual lobby creation logic
int lobbyId = (int) (Math.random() * 10000 + 1);
System.out.println("Lobby created: " + lobbyId);
return lobbyId;
}
/**
* Placeholder for joining a lobby.
*
* @param lobbyId The lobbyId to join
*/
public void joinLobby(int lobbyId) {
// TODO: Replace with actual join logic
System.out.println("Joining lobby: " + lobbyId);
}
/**
* Getter for the GridPane.
*
* @return The GridPane for the button grid
*/
public javafx.scene.layout.GridPane getGridPane() {
return gridPane;
}
}
@@ -0,0 +1,116 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import org.json.JSONObject;
/**
* Handles JSON translation between ButtonID and LobbyID.
* <p>
* Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs, speichert und lädt die Zuordnung aus einer JSON-Datei.
*/
public class LobbyButtonTranslationManager {
/**
* Removes all lobbies from the mapping and saves the file.
*/
public void clearAllLobbies() {
buttonIdToLobbyId.clear();
saveTranslation();
}
/** Pfad zur JSON-Translationsdatei. */
private final String translationFilePath = "src/main/resources/ui-structure/lobby_button_translation.json";
/** Zuordnung ButtonID → LobbyID. */
private final Map<Integer, Integer> buttonIdToLobbyId = new HashMap<>();
/** Maximale Anzahl an Buttons im Grid. */
private final int maxButtons = 8;
/**
* Konstruktor: lädt die Zuordnung aus der JSON-Datei.
*/
public LobbyButtonTranslationManager() {
loadTranslation();
}
/**
* Lädt die Zuordnung ButtonID → LobbyID aus der JSON-Datei.
* Falls die Datei nicht existiert, bleibt die Zuordnung leer.
*/
public void loadTranslation() {
try {
Path path = Path.of(translationFilePath);
if (!Files.exists(path)) return;
String json = Files.readString(path);
JSONObject obj = new JSONObject(json);
buttonIdToLobbyId.clear();
for (String key : obj.keySet()) {
buttonIdToLobbyId.put(Integer.parseInt(key), obj.getInt(key));
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Speichert die aktuelle Zuordnung ButtonID → LobbyID in die JSON-Datei.
*/
public void saveTranslation() {
try {
JSONObject obj = new JSONObject();
for (Map.Entry<Integer, Integer> entry : buttonIdToLobbyId.entrySet()) {
obj.put(String.valueOf(entry.getKey()), entry.getValue());
}
Files.write(Path.of(translationFilePath), obj.toString(2).getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Prüft, ob das Grid voll ist (maxButtons erreicht).
* @return true, wenn Grid voll; sonst false
*/
public boolean isFull() {
return buttonIdToLobbyId.size() >= maxButtons;
}
/**
* Fügt eine Zuordnung ButtonID → LobbyID hinzu und speichert sie.
* @param buttonId Die ID des Buttons
* @param lobbyId Die ID der Lobby
* @throws Exception wenn das Grid voll ist
*/
public void addLobbyButton(int buttonId, int lobbyId) throws Exception {
if (isFull()) throw new Exception("Grid is full!");
buttonIdToLobbyId.put(buttonId, lobbyId);
saveTranslation();
}
/**
* Entfernt eine Zuordnung für die gegebene ButtonID und speichert.
* @param buttonId Die ID des zu entfernenden Buttons
*/
public void removeLobbyButton(int buttonId) {
buttonIdToLobbyId.remove(buttonId);
saveTranslation();
}
/**
* Gibt die LobbyID für eine gegebene ButtonID zurück.
* @param buttonId Die ButtonID
* @return Die zugehoerige LobbyID oder null, falls nicht vorhanden
*/
public Integer getLobbyIdForButton(int buttonId) {
return buttonIdToLobbyId.get(buttonId);
}
/**
* Gibt die gesamte Zuordnung ButtonID → LobbyID zurück.
* @return Map aller Zuordnungen
*/
public Map<Integer, Integer> getButtonIdToLobbyId() {
return buttonIdToLobbyId;
}
}
@@ -120,6 +120,7 @@
-fx-padding: 0 0 40 0; -fx-padding: 0 0 40 0;
} }
/* EXIT BUTTON */
.button-exit { .button-exit {
-fx-background-radius: 12; -fx-background-radius: 12;
-fx-border-radius: 12; -fx-border-radius: 12;
@@ -128,17 +129,17 @@
-fx-border-width: 2; -fx-border-width: 2;
-fx-padding: 6 15; -fx-padding: 6 15;
-fx-cursor: hand; -fx-cursor: hand;
-fx-background-color: #333333;
-fx-border-color: #666666;
-fx-text-fill: #CCCCCC;
} }
.button-exit:hover { .button-exit:hover {
-fx-translate-y: -3; -fx-translate-y: -3;
-fx-effect: dropshadow(one-pass-box, rgba(0, 0, 0, 0.8), 0, 0, 3, 3); -fx-effect: dropshadow(one-pass-box, rgba(0, 0, 0, 0.8), 0, 0, 3, 3);
} }
.button-exit { /* LOBBY ERSTELLEN BUTTON */
-fx-background-color: #333333; .button-create-lobby {
-fx-border-color: #666666;
-fx-text-fill: #CCCCCC;
-fx-background-radius: 12; -fx-background-radius: 12;
-fx-border-radius: 12; -fx-border-radius: 12;
-fx-font-family: "Courier New"; -fx-font-family: "Courier New";
@@ -146,6 +147,14 @@
-fx-border-width: 2; -fx-border-width: 2;
-fx-padding: 6 15; -fx-padding: 6 15;
-fx-cursor: hand; -fx-cursor: hand;
-fx-background-color: #1a7f2e;
-fx-border-color: #2ecc71;
-fx-text-fill: #ffffff;
}
.button-create-lobby:hover {
-fx-translate-y: -3;
-fx-effect: dropshadow(one-pass-box, rgba(0, 0, 0, 0.8), 0, 0, 3, 3);
-fx-background-color: #27ae60;
} }
@@ -68,6 +68,18 @@
<Insets top="20" left="20" /> <Insets top="20" left="20" />
</GridPane.margin> </GridPane.margin>
</Button> </Button>
<Button text="Lobby erstellen"
styleClass="button-create-lobby"
fx:id="createLobbyButton"
onAction="#handleCreateLobbyButton"
GridPane.rowIndex="0"
GridPane.columnIndex="0"
GridPane.halignment="LEFT"
GridPane.valignment="TOP">
<GridPane.margin>
<Insets top="60" left="20" />
</GridPane.margin>
</Button>
<VBox fx:id="casinoTable" <VBox fx:id="casinoTable"
alignment="CENTER" alignment="CENTER"
@@ -0,0 +1,10 @@
{
"1": 1240,
"2": 3640,
"3": 7589,
"4": 3982,
"5": 5655,
"6": 6418,
"7": 8586,
"8": 7378
}