diff --git a/app/src/main/java/org/toop/app/Server.java b/app/src/main/java/org/toop/app/Server.java index ed5adc9..4642795 100644 --- a/app/src/main/java/org/toop/app/Server.java +++ b/app/src/main/java/org/toop/app/Server.java @@ -159,7 +159,8 @@ public final class Server { .listen(NetworkEvents.GameMatchResponse.class, this::handleMatchResponse, false, "match-response") .listen(NetworkEvents.GameResultResponse.class, this::handleGameResult, false, "game-result") .listen(NetworkEvents.GameMoveResponse.class, this::handleReceivedMove, false, "game-move") - .listen(NetworkEvents.YourTurnResponse.class, this::handleYourTurn, false, "your-turn"); + .listen(NetworkEvents.YourTurnResponse.class, this::handleYourTurn, false, "your-turn") + .listen(NetworkEvents.ClosedConnection.class, this::closedConnection, false, "closed-connection"); connectFlow = a; } @@ -233,7 +234,8 @@ public final class Server { } - if (gameController != null){ + if (gameController != null) { + primary.reEnableButton(); gameController.start(); } } @@ -293,6 +295,20 @@ public final class Server { WidgetContainer.getCurrentView().transitionPrevious(); } + private void closedConnection(NetworkEvents.ClosedConnection e) { + new EventFlow().addPostEvent(new NetworkEvents.CloseClient(clientId)).postEvent(); + isPolling = false; + stopScheduler(); + connectFlow.unsubscribeAll(); + + if (nettyGatewayServer != null) { + nettyGatewayServer.stop(); + } + + WidgetContainer.getCurrentView().transitionPrevious(); + WidgetContainer.add(Pos.CENTER, new ErrorPopup("Server closed connection.")); + } + private void forfeitGame() { new EventFlow().addPostEvent(new NetworkEvents.SendForfeit(clientId)).postEvent(); } @@ -339,7 +355,9 @@ public final class Server { private void gamesListFromServerHandler(NetworkEvents.GamelistResponse event) { gameList.clear(); - gameList.addAll(List.of(event.gamelist())); + var gl = List.of(event.gamelist()); + gameList.addAll(gl); + primary.updateGameList(gl); } public void populateGameList() { diff --git a/app/src/main/java/org/toop/app/widget/Primitive.java b/app/src/main/java/org/toop/app/widget/Primitive.java index afb59a2..a8436c5 100644 --- a/app/src/main/java/org/toop/app/widget/Primitive.java +++ b/app/src/main/java/org/toop/app/widget/Primitive.java @@ -64,7 +64,7 @@ public final class Primitive { return imageView; } - public static Button button(String key, Runnable onAction, boolean localize) { + public static Button button(String key, Runnable onAction, boolean localize, boolean disableOnClick) { var button = new Button(); button.getStyleClass().add("button"); @@ -75,6 +75,7 @@ public final class Primitive { if (onAction != null) { button.setOnAction(_ -> { + if (disableOnClick) button.setDisable(true); onAction.run(); playButtonSound(); }); @@ -83,8 +84,8 @@ public final class Primitive { return button; } - public static Button button(String key, Runnable onAction) { - return button(key, onAction, true); + public static Button button(String key, Runnable onAction, boolean disableOnClick) { + return button(key, onAction, true, disableOnClick); } public static TextField input(String promptKey, String text, Consumer onValueChanged, boolean localize) { diff --git a/app/src/main/java/org/toop/app/widget/complex/ConfirmWidget.java b/app/src/main/java/org/toop/app/widget/complex/ConfirmWidget.java index e8719ce..1d6251d 100644 --- a/app/src/main/java/org/toop/app/widget/complex/ConfirmWidget.java +++ b/app/src/main/java/org/toop/app/widget/complex/ConfirmWidget.java @@ -26,7 +26,7 @@ public class ConfirmWidget implements Widget { public void addButton(String key, Runnable onClick) { Platform.runLater(() -> { - var button = Primitive.button(key, onClick); + var button = Primitive.button(key, onClick, false); buttonsContainer.getChildren().add(button); }); } diff --git a/app/src/main/java/org/toop/app/widget/complex/PlayerInfoWidget.java b/app/src/main/java/org/toop/app/widget/complex/PlayerInfoWidget.java index 97a1140..fe1cf52 100644 --- a/app/src/main/java/org/toop/app/widget/complex/PlayerInfoWidget.java +++ b/app/src/main/java/org/toop/app/widget/complex/PlayerInfoWidget.java @@ -91,7 +91,7 @@ public class PlayerInfoWidget { information.computerDifficulty = depth; information.computerThinkTime = thinktime; this.playerName.setText(getName(name)); - }); + }, false); } private String getName(String name) { diff --git a/app/src/main/java/org/toop/app/widget/complex/ViewWidget.java b/app/src/main/java/org/toop/app/widget/complex/ViewWidget.java index 217ac86..c280b1c 100644 --- a/app/src/main/java/org/toop/app/widget/complex/ViewWidget.java +++ b/app/src/main/java/org/toop/app/widget/complex/ViewWidget.java @@ -32,7 +32,7 @@ public abstract class ViewWidget extends StackWidget { var backButton = Primitive.button("back", () -> { view.transitionPrevious(); - }); + }, false); view.add(Pos.BOTTOM_LEFT, Primitive.vbox(backButton)); } @@ -45,7 +45,7 @@ public abstract class ViewWidget extends StackWidget { var customButton = Primitive.button(key, () -> { runnable.run(); view.transitionPrevious(); - }); + }, false); view.add(Pos.BOTTOM_LEFT, Primitive.vbox(customButton)); } @@ -97,7 +97,7 @@ public abstract class ViewWidget extends StackWidget { var backButton = Primitive.button("back", () -> { view.transitionPrevious(); - }); + }, false); view.add(Pos.BOTTOM_LEFT, Primitive.vbox(backButton)); } diff --git a/app/src/main/java/org/toop/app/widget/popup/ChallengePopup.java b/app/src/main/java/org/toop/app/widget/popup/ChallengePopup.java index cd4d87c..e20730c 100644 --- a/app/src/main/java/org/toop/app/widget/popup/ChallengePopup.java +++ b/app/src/main/java/org/toop/app/widget/popup/ChallengePopup.java @@ -37,8 +37,8 @@ public final class ChallengePopup extends PopupWidget { var acceptButton = Primitive.button("accept", () -> { onAccept.accept(playerInformation); this.hide(); - }); - var denyButton = Primitive.button("deny", () -> hide()); + }, false); + var denyButton = Primitive.button("deny", () -> hide(), false); var leftSection = Primitive.vbox( challengeText, diff --git a/app/src/main/java/org/toop/app/widget/popup/EscapePopup.java b/app/src/main/java/org/toop/app/widget/popup/EscapePopup.java index d742ab6..69f4fe3 100644 --- a/app/src/main/java/org/toop/app/widget/popup/EscapePopup.java +++ b/app/src/main/java/org/toop/app/widget/popup/EscapePopup.java @@ -24,7 +24,7 @@ public class EscapePopup extends PopupWidget { var opt = Primitive.button("options", () -> { hide(); WidgetContainer.getCurrentView().transitionNext(new OptionsView()); - }); + }, false); nodes.add(opt); } @@ -33,14 +33,14 @@ public class EscapePopup extends PopupWidget { if (tut != null) { nodes.add(Primitive.button("tutorialstring", () -> { WidgetContainer.getCurrentView().add(Pos.CENTER, tut); - })); + }, false)); } } nodes.add(Primitive.button("quit", () -> { hide(); WidgetContainer.add(Pos.CENTER, new QuitPopup()); - })); + }, false)); add(Pos.CENTER, Primitive.vbox(nodes.toArray(new Node[0]))); diff --git a/app/src/main/java/org/toop/app/widget/popup/SendChallengePopup.java b/app/src/main/java/org/toop/app/widget/popup/SendChallengePopup.java index bc42486..c5bfa7d 100644 --- a/app/src/main/java/org/toop/app/widget/popup/SendChallengePopup.java +++ b/app/src/main/java/org/toop/app/widget/popup/SendChallengePopup.java @@ -62,9 +62,9 @@ public final class SendChallengePopup extends PopupWidget { var sendButton = Primitive.button( "send", () -> { onSend.accept(playerInformation, gameChoice.getValue()); this.hide(); } - ); + , false); - var cancelButton = Primitive.button("cancel", () -> hide()); + var cancelButton = Primitive.button("cancel", () -> hide(), false); var leftSection = Primitive.vbox( challengeText, diff --git a/app/src/main/java/org/toop/app/widget/tutorial/BaseTutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/BaseTutorialWidget.java index 54f40b0..02c872d 100644 --- a/app/src/main/java/org/toop/app/widget/tutorial/BaseTutorialWidget.java +++ b/app/src/main/java/org/toop/app/widget/tutorial/BaseTutorialWidget.java @@ -47,8 +47,8 @@ public class BaseTutorialWidget extends PopupWidget implements Updatable { this.pages = pages; this.nextScreen = nextScreen; - previousButton = Primitive.button("goback", () -> { update(false); this.hide(); }); - nextButton = Primitive.button(">", () -> update(true)); + previousButton = Primitive.button("goback", () -> { update(false); this.hide(); }, false); + nextButton = Primitive.button(">", () -> update(true), false); var w = Primitive.hbox( previousButton, diff --git a/app/src/main/java/org/toop/app/widget/tutorial/ShowEnableTutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/ShowEnableTutorialWidget.java index 62fa0c7..168225e 100644 --- a/app/src/main/java/org/toop/app/widget/tutorial/ShowEnableTutorialWidget.java +++ b/app/src/main/java/org/toop/app/widget/tutorial/ShowEnableTutorialWidget.java @@ -10,9 +10,9 @@ public class ShowEnableTutorialWidget extends PopupWidget { public ShowEnableTutorialWidget(Runnable tutorial, Runnable nextScreen, Runnable appSettingsSetter) { var a = Primitive.hbox( - Primitive.button("ok", () -> { appSettingsSetter.run(); tutorial.run(); this.hide(); }), - Primitive.button("no", () -> { appSettingsSetter.run(); nextScreen.run(); this.hide(); }), - Primitive.button("never", () -> { AppSettings.getSettings().setTutorialFlag(false); nextScreen.run(); this.hide(); }) + Primitive.button("ok", () -> { appSettingsSetter.run(); tutorial.run(); this.hide(); }, false), + Primitive.button("no", () -> { appSettingsSetter.run(); nextScreen.run(); this.hide(); }, false), + Primitive.button("never", () -> { AppSettings.getSettings().setTutorialFlag(false); nextScreen.run(); this.hide(); }, false) ); var txt = Primitive.text("tutorial"); diff --git a/app/src/main/java/org/toop/app/widget/view/GameView.java b/app/src/main/java/org/toop/app/widget/view/GameView.java index 94d8cd7..441cc0e 100644 --- a/app/src/main/java/org/toop/app/widget/view/GameView.java +++ b/app/src/main/java/org/toop/app/widget/view/GameView.java @@ -40,7 +40,7 @@ public final class GameView extends ViewWidget { player2Icon = new Circle(); if (onForfeit != null) { - forfeitButton = Primitive.button("forfeit", () -> onForfeit.run()); + forfeitButton = Primitive.button("forfeit", () -> onForfeit.run(), false); } else { forfeitButton = null; } @@ -48,7 +48,7 @@ public final class GameView extends ViewWidget { exitButton = Primitive.button("exit", () -> { onExit.run(); transitionPrevious(); - }); + }, false); if (onMessage != null) { chatInput = Primitive.input("enter-your-message", "", null); diff --git a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java index 5615140..b6eb549 100644 --- a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java +++ b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java @@ -107,7 +107,7 @@ public class LocalMultiplayerView extends ViewWidget { } break; } - }); + }, false); var playerSection = setupPlayerSections(); diff --git a/app/src/main/java/org/toop/app/widget/view/LocalView.java b/app/src/main/java/org/toop/app/widget/view/LocalView.java index f002bf8..51fdb7e 100644 --- a/app/src/main/java/org/toop/app/widget/view/LocalView.java +++ b/app/src/main/java/org/toop/app/widget/view/LocalView.java @@ -10,11 +10,11 @@ public class LocalView extends ViewWidget { public LocalView() { var ticTacToeButton = Primitive.button("tic-tac-toe", () -> { transitionNext(new LocalMultiplayerView(GameInformation.Type.TICTACTOE)); - }); + }, false); var reversiButton = Primitive.button("reversi", () -> { transitionNext(new LocalMultiplayerView(GameInformation.Type.REVERSI)); - }); + }, false); add(Pos.CENTER, Primitive.vbox( ticTacToeButton, diff --git a/app/src/main/java/org/toop/app/widget/view/MainView.java b/app/src/main/java/org/toop/app/widget/view/MainView.java index a60d753..7dc8aed 100644 --- a/app/src/main/java/org/toop/app/widget/view/MainView.java +++ b/app/src/main/java/org/toop/app/widget/view/MainView.java @@ -9,24 +9,24 @@ public class MainView extends ViewWidget { public MainView() { var localButton = Primitive.button("local", () -> { transitionNext(new LocalView()); - }); + }, false); var onlineButton = Primitive.button("online", () -> { transitionNext(new OnlineView()); - }); + }, false); var creditsButton = Primitive.button("credits", () -> { transitionNext(new CreditsView()); - }); + }, false); var optionsButton = Primitive.button("options", () -> { transitionNext(new OptionsView()); - }); + }, false); var quitButton = Primitive.button("quit", () -> { var a = new QuitPopup(); a.show(Pos.CENTER); - }); + }, false); add(Pos.CENTER, Primitive.vbox( localButton, diff --git a/app/src/main/java/org/toop/app/widget/view/OnlineView.java b/app/src/main/java/org/toop/app/widget/view/OnlineView.java index 4ae8692..533e097 100644 --- a/app/src/main/java/org/toop/app/widget/view/OnlineView.java +++ b/app/src/main/java/org/toop/app/widget/view/OnlineView.java @@ -29,7 +29,7 @@ public class OnlineView extends ViewWidget { serverPortInput.getValue(), playerNameInput.getValue() ); - }); + }, false); var localHostButton = Primitive.button("host!", () -> { @@ -53,7 +53,7 @@ public class OnlineView extends ViewWidget { "host", a ); - }, false); + }, false, false); add(Pos.CENTER, Primitive.vbox( serverInformationHeader, diff --git a/app/src/main/java/org/toop/app/widget/view/ServerView.java b/app/src/main/java/org/toop/app/widget/view/ServerView.java index 3a3ce9b..92c8101 100644 --- a/app/src/main/java/org/toop/app/widget/view/ServerView.java +++ b/app/src/main/java/org/toop/app/widget/view/ServerView.java @@ -1,9 +1,13 @@ package org.toop.app.widget.view; +import javafx.collections.FXCollections; +import javafx.css.converter.StringConverter; +import javafx.scene.control.ComboBox; import org.toop.app.widget.Primitive; import org.toop.app.widget.complex.ViewWidget; import java.util.List; +import java.util.Locale; import java.util.function.Consumer; import javafx.application.Platform; @@ -18,13 +22,16 @@ public final class ServerView extends ViewWidget { private final Consumer onPlayerClicked; private final long clientId; + private final ComboBox gameList; private final ListView