From 6e00128997826bc3c6832e5f1bbe0010b3b15aeb Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Sat, 30 Apr 2022 19:29:57 +0200 Subject: [PATCH 1/2] added method for adding a lobby to lobbylistview --- .../dbis/cs108/multiplayer/client/Client.java | 12 +++++--- .../multiplayer/client/gui/ClientModel.java | 4 +++ .../client/gui/lounge/LobbyListItem.java | 15 ++++++---- .../gui/lounge/LoungeSceneViewController.java | 30 +++++++++++++++++-- 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index d693491..c4ba5da 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -8,6 +8,7 @@ import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GameStateModel; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatApp; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatController; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.GameController; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge.LoungeSceneViewController; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger; @@ -42,6 +43,7 @@ public class Client { private ClientModel clientModel; private GameStateModel gameStateModel; private GameController gameController; + private LoungeSceneViewController loungeSceneViewController; /** * Saves the position of the client, gets refreshed everytime the client gets a vote request. @@ -75,6 +77,8 @@ public class Client { clientPinger = new ClientPinger(this, this.socket); this.gameStateModel = new GameStateModel(); this.gameController = new GameController(ChatApp.getClientModel(), gameStateModel); + this.loungeSceneViewController = new LoungeSceneViewController(); + LoungeSceneViewController.setClient(ChatApp.getClientModel()); } catch (IOException e) { e.printStackTrace(); } @@ -351,7 +355,7 @@ public class Client { //TODO break; case GuiParameters.listOfPLayers: - updateListOfClients(data); + updateListOfClients(data); //TODO break; //case GuiParameters.viewChangeToGame: (commented out due to compiling error) @@ -380,7 +384,7 @@ public class Client { int n = arr.length; for (int i = 0; i < n; i = i + 2) { list.add(new SimpleStringProperty(arr[i])); - ChatController.getClient().addLobbyToList(new SimpleStringProperty(arr[i])); + loungeSceneViewController.addLobbyToList(new SimpleStringProperty(arr[i])); } } @@ -388,10 +392,10 @@ public class Client { String[] arr = data.split(":"); ObservableList list = new SimpleListProperty<>(); int n = arr.length; - for (int i = 0; i < n; i = i + 2) { + for (int i = 0; i < n; i = i + 1) { list.add(new SimpleStringProperty(arr[i])); } - ChatController.getClient().getAllClients().setAll(); + loungeSceneViewController.updateClientListView(list); } /** diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java index 9ad8909..4d9021c 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java @@ -70,6 +70,10 @@ public class ClientModel { this.allClients.add(nameAndId); } + public void updateClientList(ObservableList clients) { + + } + public void removeClientFromList(String id){ Iterator it = allClients.iterator(); while(it.hasNext()){ diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyListItem.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyListItem.java index 5259334..5cea625 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyListItem.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyListItem.java @@ -1,19 +1,22 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge; import java.util.Set; +import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; +import javafx.collections.ObservableSet; import javafx.scene.control.Label; +import javafx.scene.control.ListCell; import javafx.scene.control.ToggleButton; -public class LobbyListItem { +public class LobbyListItem extends ListCell { - private final Label lobbyID; - private final Label adminName; - private Set clientsInLobby; + private final String lobbyID; + private final String adminName; + private ObservableSet clientsInLobby; private final ToggleButton button; - public LobbyListItem(Label lobbyID, Label adminName, - Set clientsInLobby, ToggleButton button) { + public LobbyListItem(String lobbyID, String adminName, + ObservableSet clientsInLobby, ToggleButton button) { this.lobbyID = lobbyID; this.adminName = adminName; this.clientsInLobby = clientsInLobby; diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java index 29b8c26..facb03b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java @@ -6,6 +6,7 @@ import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.events.LeaveServerButtonP import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import java.net.URL; import java.util.ResourceBundle; +import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.ObservableList; @@ -17,6 +18,7 @@ import javafx.scene.control.Button; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.control.TextField; +import javafx.scene.control.TitledPane; import javafx.scene.control.ToolBar; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; @@ -47,6 +49,11 @@ public class LoungeSceneViewController implements Initializable { public static ClientModel client; + public LoungeSceneViewController() { + super(); + + } + /** * Called to initialize a controller after its root element has been completely processed. @@ -74,8 +81,27 @@ public class LoungeSceneViewController implements Initializable { this.ClientListView.setItems(names); } - public void addLobby(LobbyListItem lobby) { - //TODO + /** + * Adds a lobby to the view + * @param lobbyID + * @param admin + * @param players + */ + public void addLobby(String lobbyID, String admin, String players) { + TitledPane lobbyObject = new TitledPane(); + lobbyObject.setId(lobbyID+admin); + lobbyObject.textProperty().setValue("Lobby Nr: " + lobbyID + " Admin: " + admin); + + ObservableList listOfPlayersInLobby = new SimpleListProperty<>(); + + String[] playersArr = players.split(":"); + int noOfPlayers = playersArr.length; + for(int i = 0; i < noOfPlayers; i++){ + listOfPlayersInLobby.add(new SimpleStringProperty(playersArr[i])); + } + ListView view = new ListView(listOfPlayersInLobby); + lobbyObject.contentProperty().set(view); + LobbyListView.getItems().add(lobbyObject); } public void addClientToList(String s) { From 9007870d19b95b1f764ae9a565e52836bd1802e4 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Sat, 30 Apr 2022 22:18:15 +0200 Subject: [PATCH 2/2] In Client: added 3 new methods GuiParameters: added 3 new Params Lounge: added Maps, changed names and implemented methods --- .../dbis/cs108/multiplayer/client/Client.java | 43 +++++-- .../client/gui/lounge/LobbyListItem.java | 62 ++++++++- .../gui/lounge/LoungeSceneViewController.java | 120 ++++++++++++++---- .../multiplayer/helpers/GuiParameters.java | 18 ++- 4 files changed, 200 insertions(+), 43 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index c4ba5da..db76c8b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -327,7 +327,7 @@ public class Client { * @param parameter a string according to {@link GuiParameters} and {@link ClientGameInfoHandler} * can be empty * @param data some information in a string, separators can be $ or : - * TODO(Seraina&Sebi): evtl. auslagern? + * TODO(Seraina&Sebi): evtl. auslagern? */ public void sendToGUI(String parameter, String data) { try { @@ -355,18 +355,27 @@ public class Client { //TODO break; case GuiParameters.listOfPLayers: - updateListOfClients(data); + updateListOfClients(data); //TODO break; + case GuiParameters.getMembersInLobby: + updateLobbyMembers(data); + break; //case GuiParameters.viewChangeToGame: (commented out due to compiling error) - //TODO - //break; (commented out due to compiling error) + //TODO + //break; (commented out due to compiling error) //case GuiParameters.viewChangeToStart: (commented out due to compiling error) - //TODO - //break; (commented out due to compiling error) + //TODO + //break; (commented out due to compiling error) //case GuiParameters.viewChangeToLobby: (commented out due to compiling error) - //TODO - //break; (commented out due to compiling error) + //TODO + //break; (commented out due to compiling error) + case GuiParameters.addNewMemberToLobby: + addPlayerToLobby(data); + break; + case GuiParameters.newLobbyCreated: + makeNewLobby(data); + break; default: notificationTextDisplay(data); //TODO(Sebi,Seraina): should the gameController be in the Application just like the ChatController? @@ -378,14 +387,30 @@ public class Client { } + private void makeNewLobby(String data) { + String[] params = data.split(":"); + loungeSceneViewController.newLobby(params[0], params[1]); + } + + private void addPlayerToLobby(String data) { + String[] params = data.split(":"); + loungeSceneViewController.addPlayerToLobby(params[0], params[1]); + } + + private void updateLobbyMembers(String data) { + String[] dataArr = data.split(":"); + String lobbyID = dataArr[0]; + String adminName = dataArr[1]; + } + private void updateListOfLobbies(String data) { String[] arr = data.split(":"); ObservableList list = new SimpleListProperty<>(); int n = arr.length; for (int i = 0; i < n; i = i + 2) { list.add(new SimpleStringProperty(arr[i])); - loungeSceneViewController.addLobbyToList(new SimpleStringProperty(arr[i])); } + //TODO } private void updateListOfClients(String data) { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyListItem.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyListItem.java index 5cea625..b3286e1 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyListItem.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyListItem.java @@ -1,25 +1,73 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge; import java.util.Set; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; +import javafx.collections.ObservableList; import javafx.collections.ObservableSet; +import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.ToggleButton; -public class LobbyListItem extends ListCell { +public class LobbyListItem implements Observable { - private final String lobbyID; - private final String adminName; - private ObservableSet clientsInLobby; - private final ToggleButton button; + private final SimpleStringProperty lobbyID; + private final SimpleStringProperty adminName; + private ObservableList clientsInLobby; + private final Button button; + private SimpleBooleanProperty ownedByClient; + private SimpleBooleanProperty isOpen; - public LobbyListItem(String lobbyID, String adminName, - ObservableSet clientsInLobby, ToggleButton button) { + public LobbyListItem(SimpleStringProperty lobbyID, SimpleStringProperty adminName, + ObservableList clientsInLobby, Button button, + SimpleBooleanProperty ownedByClient) { this.lobbyID = lobbyID; this.adminName = adminName; this.clientsInLobby = clientsInLobby; this.button = button; } + + /** + * Adds an {@link InvalidationListener} which will be notified whenever the {@code Observable} + * becomes invalid. If the same listener is added more than once, then it will be notified more + * than once. That is, no check is made to ensure uniqueness. + *

+ * Note that the same actual {@code InvalidationListener} instance may be safely registered for + * different {@code Observables}. + *

+ * The {@code Observable} stores a strong reference to the listener which will prevent the + * listener from being garbage collected and may result in a memory leak. It is recommended to + * either unregister a listener by calling {@link #removeListener(InvalidationListener) + * removeListener} after use or to use an instance of {@link WeakInvalidationListener} avoid this + * situation. + * + * @param listener The listener to register + * @throws NullPointerException if the listener is null + * @see #removeListener(InvalidationListener) + */ + @Override + public void addListener(InvalidationListener listener) { + + } + + /** + * Removes the given listener from the list of listeners, that are notified whenever the value of + * the {@code Observable} becomes invalid. + *

+ * If the given listener has not been previously registered (i.e. it was never added) then this + * method call is a no-op. If it had been previously added then it will be removed. If it had been + * added more than once, then only the first occurrence will be removed. + * + * @param listener The listener to remove + * @throws NullPointerException if the listener is null + * @see #addListener(InvalidationListener) + */ + @Override + public void removeListener(InvalidationListener listener) { + + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java index facb03b..7f3b1c7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java @@ -5,16 +5,25 @@ import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.events.ChangeNameButtonPr import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.events.LeaveServerButtonPressedEventHandler; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import java.net.URL; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.ResourceBundle; +import javafx.beans.binding.StringBinding; import javafx.beans.property.SimpleListProperty; +import javafx.beans.property.SimpleMapProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; +import javafx.collections.FXCollections; +import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; +import javafx.collections.ObservableMap; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.control.TextField; @@ -31,9 +40,9 @@ public class LoungeSceneViewController implements Initializable { public Button newGameButton; @FXML - private ListView LobbyListView; + private ListView LobbyListView; @FXML - private ListView ClientListView; + private ListView ClientListView; @FXML private Button ChangeNameButton; @FXML @@ -49,9 +58,12 @@ public class LoungeSceneViewController implements Initializable { public static ClientModel client; + private ObservableMap> lobbyToMemberssMap; + private HashMap clientToLobbyMap; + public LoungeSceneViewController() { super(); - + lobbyToMemberssMap = FXCollections.observableHashMap(); } @@ -71,39 +83,87 @@ public class LoungeSceneViewController implements Initializable { ClientListView.setItems(client.getAllClients()); LobbyListView.setPlaceholder(new Text("No open lobbies!")); - } + client.getAllClients().addListener(new ListChangeListener() { + @Override + public void onChanged(Change c) { + List removed = (List) c.getRemoved(); + for(SimpleStringProperty player: removed) { - public void updateLobbyListView() { - //TODO + } + } + }); } public void updateClientListView(ObservableList names) { + ObservableList clientsLeft = ClientListView.getItems(); + clientsLeft.removeAll(names); this.ClientListView.setItems(names); + for (SimpleStringProperty gone : clientsLeft) { + //TODO + } } /** - * Adds a lobby to the view + * Adds players to a lobby + * "NMEMB" {@link ch.unibas.dmi.dbis.cs108.multiplayer.helpers.GuiParameters} * @param lobbyID - * @param admin - * @param players + * @param player */ - public void addLobby(String lobbyID, String admin, String players) { - TitledPane lobbyObject = new TitledPane(); - lobbyObject.setId(lobbyID+admin); - lobbyObject.textProperty().setValue("Lobby Nr: " + lobbyID + " Admin: " + admin); - - ObservableList listOfPlayersInLobby = new SimpleListProperty<>(); - - String[] playersArr = players.split(":"); - int noOfPlayers = playersArr.length; - for(int i = 0; i < noOfPlayers; i++){ - listOfPlayersInLobby.add(new SimpleStringProperty(playersArr[i])); - } - ListView view = new ListView(listOfPlayersInLobby); - lobbyObject.contentProperty().set(view); - LobbyListView.getItems().add(lobbyObject); + public void addPlayerToLobby(String lobbyID, String player) { + ObservableList members = lobbyToMemberssMap.get(lobbyID); + members.add(player); } + /** + * Used when a new lobby shall be added to the view. + * "NLOBBY" {@link ch.unibas.dmi.dbis.cs108.multiplayer.helpers.GuiParameters} + * @param lobbyID + * @param adminName + */ + public void newLobby(String lobbyID, String adminName) { + SimpleStringProperty id = new SimpleStringProperty(lobbyID); + SimpleStringProperty admin = new SimpleStringProperty((adminName)); + boolean ownedByClient = false; + Button startOrJoin; + if (adminName.equals(client.getUsername())) { + ownedByClient = true; + startOrJoin = new Button("Start"); + startOrJoin.setOnAction(event -> startGame()); + } else { + startOrJoin = new Button("Join"); + startOrJoin.setOnAction(event -> joinGame(lobbyID)); + } + HBox lobby = new HBox(); + Label idLabel = new Label(); + Label adminLabel = new Label(); + idLabel.textProperty().bind(id); + adminLabel.textProperty().bind(admin); + lobby.getChildren().add(idLabel); + lobby.getChildren().add(adminLabel); + lobby.getChildren().add(startOrJoin); + ListView members = new ListView<>(); + members.setId("membersOfLobby"); + if (ownedByClient) { + members.getItems().add("(you are admin) " + adminName); + } else { + members.getItems().add("(admin)" + adminName); + members.getItems().add(client.getUsername()); + } + lobby.setId(lobbyID); + lobbyToMemberssMap.put(lobbyID, members.getItems()); + LobbyListView.getItems().add(lobby); + } + + private void joinGame(String lobbyID) { + client.getClient().sendMsgToServer(Protocol.joinLobby + "$" + lobbyID); + } + + private void startGame() { + client.getClient().sendMsgToServer(Protocol.startANewGame); + } + + ; + public void addClientToList(String s) { ClientListView.getItems().add(new SimpleStringProperty(s)); } @@ -112,6 +172,7 @@ public class LoungeSceneViewController implements Initializable { client.getClient().sendMsgToServer(Protocol.createNewLobby); } + public void changeName() { TextField name = new TextField("Enter new name!"); this.NTtBToolBar.getItems().add(name); @@ -124,6 +185,17 @@ public class LoungeSceneViewController implements Initializable { }); } + public void removePlayer(String id) { + Iterator it = client.getAllClients().iterator(); + while (it.hasNext()) { + String uid = it.next().getValue(); + if (uid.equals(id)) { + it.remove(); + break; + } + } + } + /** * Utility to set the client model for this class * diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java index 5af59de..bbc4f1b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java @@ -43,8 +43,20 @@ public class GuiParameters { /** - * Tells, Gui, who the members of a specified Lobby are. - * Form: {@code LMEMBS$$$..} + * Tells Gui, who the members of a specified Lobby are. + * Form: {@code LMEMBS$:::<..>} */ - public static String changeToLobby = "LMEMBS"; + public static final String getMembersInLobby = "LMEMBS"; + + /** + * Tells Gui, that a new Lobby has been created. + * Form: {@code NLOBBY$:} + */ + public static final String newLobbyCreated = "NLOBBY"; + + /** + * Tells Gui, to add a player to a lobby. + * Form: {@code NMEMB$:} + */ + public static final String addNewMemberToLobby = "NMEMB"; }